使用Reverse SSH Tunnel实现内网穿透的可行性方案

 

在不采用第三方服务(如51mypc、teamviewer)的情况下,通过建立反向ssh tunnel 和反向代理服务器实现在任何地方访问公司网络。

 

原理图如下(此图是对网络上的图片处理过):

使用Reverse SSH Tunnel实现内网穿透的可行性方案_第1张图片 

以下是具体操作步骤:
一、实现远程ssh到内网120
 
1.1 建立到公网主机22的反向连接
lai@120:~$ ssh -p 6120 -NfR 60.*.*.22:10086:localhost:22   www-data@60.*.*.22
 
1.2 在任何client上用ssh连接22主机的10086端口,以www-data用户(其他用户也可以,但用户名和密码都是指120上的,而不是公网主机22上的)连接,这样就可以以www-data身份登陆120。
lai@196:~$ ssh -p 10086 www-data@60.*.*.22
 
 
二、用apache的Proxy Module搭建反向代理服务器来转发请求到相应虚拟主机来实现远程访问公司内部开发测试网站
 
2.1 建立到公网主机22的反向连接,使其监听10000端口
lai@120:~$ ssh -p 6120 -NfR 60.*.*.22:10000:localhost:8080  www-data@60.*.*.22
 
2.2 在120上搭建指向相应虚拟主机的反向代理服务器
#反向代理
<VirtualHost *:8080>
  ServerAdmin  [email protected]
  ProxyRequests Off
  ProxyPass /  http://tv120.test.com/
  ProxyPassReverse / http:// tv120.test.com/
    <Proxy *>
       Order deny,allow
       Allow from all
    </Proxy>
 ServerName 192.168.0.120
</VirtualHost>
 
2.3 在任何client上直接用浏览器访问22的10000端口即可
http://60.*.*.22:10000/
 
 
三、问题及解决方法:
 
3.1 默认情况下建立的tunnel在ssh session空闲一段时间后会断开连接(俗称掉线),掉线后client就无法访问内网了。
 
    解决方法:
     a.将建立反向连接的命令写到脚本,然后设置crontab每2小时执行,并将该脚本加入到开机自启动
       # more reverse_ssh_tunnel.sh 
       #!/bin/sh
       COMMAND="ssh -p 6120 -NfR 60.*.*.22:10086:localhost:22   www-data@60.*.*.22"
       pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND
 
     b.使用开源的autossh工具实现建立的tunnel永久掉线
       #autossh -M 9000 -p 6120 -NfR 60.*.*.22:10086:localhost:22   www-data@60.*.*.22
 
3.2 安全方面,整个通信过程都是在加密的tunnel中进行传输的,需要增加的安全措施是:要保证在公网22主机上开启的端口不是常见端口,并且要增加120上用户密码的复杂性。
 
3.3 在访问120上的虚拟主机时,如果是需要登录的网站会出现登录不上的问题,而访问不需要登录的网站和正常访问没有区别。
 
3.4 流量问题。由于建立的到内网的连接需要经过公网主机22,故在远程访问内网的过程中会有流量经过公网22主机。
     经测试:
     a.使用iftop 命令查看120实时连接的过程中,40s内的平均流量为2.63Kbps,使用watch命令每秒钟刷新ps进程时,40s内的平均流量为1.84Kbps。如果不执行命令,流量几乎为0。由于ssh传输的是命令行文本,理论上不会产生太大流量,在实际测试中没有超过5Kbps。
 
     b. 连接内网的windows xp的远程桌面时,流量跟画面的变化程度相关,画面变化越大流量越大,在播放视频时能到达2mbps(带宽为2M时),如果不进行操作时,流量几乎为0。
 
3.5 需要一台开放端口的公网主机22(俗称打洞服务器)。
 
四、测试方法:将步骤中的*代替实际的ip地址即可进行测试。

你可能感兴趣的:(使用Reverse SSH Tunnel实现内网穿透的可行性方案)