太长不看
直接跳转到新的文章总结: http://www.jianshu.com/p/edc9c408d065
有关ssh反向隧道的概念和用法详情可以google,这里不再细表,只是做一个实验。
设想这样一种场景: 在局域网中架设了一台服务器,但是又没有网关的配置权限(比如企业内部局域网内搭建的测试服务器,你又不是网管;比如校园网内部学生为学习而练习搭建的服务器等等),同时还希望外网用户能方便的访问到我这台内网服务器中,应该如何实现呢?
幸运的是这个这个需求并不少见,已经有了一些优秀的解决方案,比如本文中即将提到的ssh tunnel
服务器在局域网,没有配置路由器端口映射,想让外网访问到内网服务器。 此时外网有一个公网服务器,该服务器具有合法IP,希望借助该服务器访问到局域网,该服务器将作为用户前端服务器,外网用户访问这个服务器就可以访问到局域网内部服务器了。
以下涉及到外网服务器的IP全部打码处理
开始试验,首先按照这个资料:http://blog.zjutoe.net/?p=95 , 来简单做个小实验。 virtualbox虚拟了一个debian,就照着资料提供的命令在debian的终端上敲autossh -M 5678 -NR 19999:localhost:22 root@myserver_ip
,输入密码后ssh就在前台开始监听端口了。
进入外网服务器,看一下监听端口:
没问题!确实在远程服务器开放了一个19999端口,通过这个端口就实现了隧道,访问这个端口实际就访问了我内网服务器的22端口。显然22端口是ssh的默认端口,我们现在就来试一下:
Very Good!成功了!在没有路由器端口映射的情况下,成功让外网访问到了内网服务器!
接下来我们继续实现我们的需求,在虚拟机上的debian搭建webserver。 使用apache做webserver,IP为192.168.1.106,为了让实验明显点,编辑了一下index.html。 局域网内部打开浏览器,访问192.168.1.106
现在要让外网访问到这个网站,其实我不怎么会搭建socket-4a代理,只好把上面的命令改一下了,让外网服务器上19999映射到内网服务器上80端口。(其实用socket代理效果会更好,不需要再这么转端口了) 在debian服务器上把命令改成autossh -M 5678 -NR 19999:localhost:80 root@myserver_ip
这次在外网服务器测试一下,终端下用links浏览器访问一下看看
Good job! 发现确实OK,注意用的是http-proxy,socket-proxy需要改一些东西。 此时理论上只要用这台服务器做代理服务器,那么外网用户就可以访问到内网服务器了。
但是外网用户可能还是觉得自己去配置代理服务器太麻烦了,喜欢更加简单的操作。 那么我们可以用apache(或者nginx等其他webserver)的mod_proxy模块,把apache配置成前端代理服务器,用户访问本机的apache就相当于访问了内网服务器,这个也很简单,打开apache的mod_proxy模块,在配置文件中写上http代理的配置即可。 我是这么写的:
按照这个配置,用户访问/proxy实际就是访问的内网服务器(可根据需要调整),实际上是不是这样呢? 迫不及待的打开本机浏览器,访问一下/proxy
Nice!!!完全一致!! 至此完成全部实验!