假设内网有一个自己的电脑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更新
如果您有任何疑惑,或遇到任何问题,敬请评论或私信,帮助我完善此方案。谢谢!