怎样从外网访问内网服务器

假设内网有一个自己的电脑A(运行Win7),希望在家中用另一台电脑B(运行Win7)访问内网资源。

先决条件

1. A机上可访问外网并且可以安装虚拟机。

2. 拥有一个外网的VPS服务器S(运行Debian),可购买BandWagon的廉价服务器(http://bandwagonhost.com/),一年100多元。

原理

从A机发起到S的连接,并保持此连接。以此连接为基础,建立从S到A的隧道。再将S所有到80端口的请求(HTTP请求)通过隧道转发到A机上,由A机作为S机的HTTP代理。外网B机建立从B到S的隧道,由S机作为B机的代理,从而实现 B -> S -> A -> 内网 的二级代理结构。

用到的主要软件和命令

  • ssh:Linux命令,建立连接;
  • curl:Linux命令,抓取URL;
  • delegate:Linux软件,用于将HTTP请求转换为SOCKS请求的代理服务器;
  • iptables:Linux命令,路由表配置;
  • VirtualBox:Windows软件,虚拟机;
  • Ubuntu Server:虚拟机操作系统;
  • PuTTY:Windows软件,SSH客户端;
  • Bitvise:Windows软件,SSH隧道代理;
  • Privoxy:Windows软件,用于将HTTP请求转换为SOCKS请求的代理服务器。

一、建立反向隧道

1.1. 在A机上安装Ubuntu
Server虚拟机。

下载VirtualBox:https://www.virtualbox.org/wiki/Downloads

下载Ubuntu Server:http://www.ubuntu.com/download/server

1.2. 由A机发起,建立从A到S的反向隧道连接,命令格式:

ssh -g -R [NPORT]:localhost:22 -p [RPORT] [SUSER]@[S_IP]

NPORT :在S机上进行侦听的端口。在S机上发往"localhost:NPORT"的数据包都将被直接转发到A机的22端口(SSH默认服务端口)。

RPORT:S机的SSH服务端口。

SUSER:登录S机的用户名,一般为root。

S_IP:S机的公网IP。

执行此命令后,可能需要输入SUSER在S机的密码。反向隧道连接建立成功以后,即可作为S的终端进行操作(在A机上远程登录到S)。

命令举例:

ssh -g -R 876:localhost:22 -p 26131 [email protected]14.12.83.20

1.3. 由S机发起,建立从S到A的SSH动态转发,即从S机到A机的SOCKS代理服务,命令格式:

ssh -D [SPORT] -p [NPORT] [LUSER]@localhost

SPORT:S机上SOCKS代理服务进行侦听的端口。在S机上发出的以"localhost:SPORT"为SOCKS 代理的数据包都将被直接转发给A机。

NPORT:S机上侦听的反向隧道端口,在第1.2步指定。

LUSER:登录A机的用户名。

执行此命令后,可能需要输入LUSER在A机的密码。至此,从S机到A机的SOCKS代理已建立成功。

命令举例:

ssh -D 1080 -p 876 [email protected]

1.4. 用curl命令测试连接,命令格式:

curl --socks4 localhost:[SPORT] [URL]

SPORT:S机上SOCKS代理服务进行侦听的端口,在1.3步制定。

URL:任意网址。

命令举例:

curl --socks4 localhost:1080 www.baidu.com

二、在服务器端安装delegated

另运行PuTTY登录S机,执行下列操作。

PuTTY下载地址:http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

2.1. 如果没有g++需要先安装g++,命令:

apt-get install g++

2.2. 下载和解压delegate(DeleGate Support Site),命令:

cd ~
wget ftp://ftp.delegate.org/pub/DeleGate/delegate9.9.13.tar.gz
tar -xzf delegate9.9.13.tar.gz

2.3. 编译delegate,命令:

cd ~/delegate9.9.13
make

2.4. 运行delegate,命令格式:

cd ./src
delegated -P[HPORT] SERVER=http SOCKS=localhost:[SPORT]

DPORT:S机上HTTP代理服务进行侦听的端口。

SPORT:S机上SOCKS代理服务进行侦听的端口,在1.3步指定。

命令举例:

delegated -P8118 SERVER=http SOCKS=localhost:1080

2.5. 用curl命令测试连接,命令格式:

curl -x localhost:[HPORT] [URL]

HPORT:S机上HTTP代理服务进行侦听的端口,在2.4步指定。

URL:任意网址。

命令举例:

curl -x localhost:8118 http://www.baidu.com/

三、在服务器端建立端口转发

远程登录S机,执行下列操作。

3.1 清除已有nat规则,命令:

iptables -t nat -F

3.2 建立http 协议的端口转发,命令格式:

iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports [HPORT]

HPORT:S机上HTTP代理服务进行侦听的端口,在2.4步指定。

命令执行后,由S机发出的HTTP请求(80端口)都将被转发到HPORT端口上。

命令举例:

iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 8118

3.3. 用curl命令测试连接,命令格式:

curl [URL]

HPORT:S机上HTTP代理服务进行侦听的端口,在2.4步指定。

URL:任意网址。

命令举例:

curl www.baidu.com

四、外网机通过SSH隧道连接到服务器

1. 在B机安装Bitvise SSH客户端软件

下载地址:https://www.bitvise.com/ssh-client

2. 配置Bitvise SSH的Login页

Host:S机的服务器IP;Port:SSH服务端口;Username:登录用户名;Initial method:password;Password:登录密码。

3. 配置Services页:SOCKS/HTTP Proxy Forwarding:Enabled;Listen interface:127.0.0.1;Listen port:1080。

4. 在B机安装Privoxy。

下载地址:http://sourceforge.net/projects/ijbswa/files/

5. 配置Privoxy目录下的config.txt文件,并运行Privoxy:

listen-address  0.0.0.0:1984
forward-socks5   /  127.0.0.1:1080 .

6. B机上的任意程序,以localhost:1984为HTTP代理,即可通过A机访问内网资源。

备注

1. kill掉delegate进程即可终止S机上的HTTP代理服务,删除delegate的目录即可完全卸载DeleGate。

2. 执行如下命令可取消80端口数据包的转发:

iptables -t nat -F

3. 断开从A机到S机的连接,即可终止S机上的SOCKS代理服务。

4. 查看侦听指定端口的进程ID,命令格式:

fuser -un tcp [PORT]

5. B机上建议使用Firefox+AutoProxy进行访问。
AutoProxy下载地址:Firefox 21-27的AutoProxy扩展20131215更新

如果您有任何疑惑,或遇到任何问题,敬请评论或私信,帮助我完善此方案。谢谢!

时间: 2024-10-29 19:12:25

怎样从外网访问内网服务器的相关文章

简单物联网:外网访问内网路由器下树莓派Flask服务器

最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器(在树莓派下搭flask在其他随笔有说明),在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花的光照然后就不行了: 所以这是一个外网访问内网的梗,解决方案如下: 1.先在本地term命令下查看ifconfig(windows为ifconfig):找到自己的本机ip,我的树莓派被分配ip为192.168.1.103 2.tplink路由器的管理地址是1

外网访问内网SVN服务器 IOS开发

在已经建好SVN服务器的情况 可 通过 打开Cornerstone .app 在Server Location  界面 输入server:域名 Port:443 端口  必须要填 Repository path: 路径填完填  不然也不能访问 备注:外网访问内网服务器 地址填详细. 和端口

SVN外网访问内网的操作步骤

外网访问内网SVN 需要将路由映射到VisualSVN server 的443端口 将外网的端口从路由器上进行映射到内网端口,例如将外网的6000端口映射为内网的443端口,443为svn服务器默认端口. SVN客户端访问为https://ip:6000/svn/code

外网访问内网工具ngrok tunnel 使用方法

在软件开发测试过程中,我们会经常遇到需要网站部署测试或者给客户演示这样的需求.通常的做法是申请一个域名和空间,将网站放到外网上给客户演示. 这种方法确实可行不过会有两点不好,第一是增加了开支,二是出现问题需要现在自己电脑上改好bug重新上传到外网. 那么问题来了,有没有一种简单的方法,让客户之间访问开发者的电脑上的网站?答案就是下面我将要为大家介绍的外网访问内网工具ngrok tunnel 的使用方法. tunnel可以让公网访问内网部署的站点,对于软件开发测试很有帮助. 由于国外官网经常被墙(

怎样从外网访问内网Memcached数据库

外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Memcached数据库 默认安装的Memcached数据库端口是11211. 2. 实现步骤 2.1 下载并解压holer软件包 Holer软件包:holer-xxx.tar.gz Holer支持各种OS系统平台,请选择跟本地OS类型匹配的holer软件包. 2.2 获取holer acce

怎样从外网访问内网Rails

外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口是3000. 2. 实现步骤 2.1 下载并解压holer软件包 Holer软件包:holer-xxx.tar.gz Holer支持各种OS系统平台,请选择跟本地OS类型匹配的holer软件包. 2.2 获取holer access key信息 在holer官网上申请专属的holer access

外网访问内网Tomcat

外网访问内网Tomcat 本地安装了Tomcat,只能在局域网内访问,怎样从外网也能访问本地Tomcat? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1.7及以上版本 执行命令java -version检查Java安装和配置是否正确. 1.2 安装并启动Tomcat 默认安装的Tomcat端口是8080. 2. 实现步骤 2.1 下载并解压holer软件包 Holer软件包:holer-client.zip 2.2 修改holer配置文件 在holer官网上申请专属的ho

外网访问内网MySQL数据库

外网访问内网MySQL数据库 本地安装了MySQL数据库,只能在局域网内访问,怎样从外网也能访问本地MySQL数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动MySQL数据库 默认安装的MySQL数据库端口是3306. 2. 实现步骤 2.1 下载并解压holer软件包 Holer软件包:holer-xxx.tar.gz Holer支持各种OS系统平台,请选择跟本地OS类型匹配的holer软件包. 2.2 获取holer access key信息 在holer官网上申请专

外网访问内网Web

外网访问内网Web 本地安装了Web服务端,只能在局域网内访问,怎样从外网也能访问本地Web? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Web服务端 默认安装的Web端口是80. 2. 实现步骤 2.1 下载并解压holer软件包 Holer软件包:holer-xxx.tar.gz Holer支持各种OS系统平台,请选择跟本地OS类型匹配的holer软件包. 2.2 获取holer access key信息 在holer官网上申请专属的holer access key或者使

外网访问内网Docker容器

外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 Docker容器默认的sshd端口是22. 2. 实现步骤 2.1 下载并解压holer软件包 Holer软件包:holer-xxx.tar.gz Holer支持各种OS系统平台,请选择跟本地OS类型匹配的holer软件包. 2.2 获取holer access key信息 在holer官网上申请专