今天看到群里面讨论nginx+ssh的方式把一个本地应用发布到互联网上,基本思路是使用SSH反向隧道,把运行在本地的一个服务发布到互联网上Linux服务器的一个本地端口,然后再用nginx反向代理来把这个本地端口发布到互联网。
nginx是个相当不错的东西,但是这需要安装额外的软件,而且nginx工作在应用层,里面还有一些其他东西是比较复杂的。我想iptables工作在网络层,简单配置一个转发策略应该就可以实现了。所以在群里面也提到了这个想法。
晚上我开始测试这个思路,意外发现Linux的ssh服务其实有个参数叫做GatewayPorts,基于安全考虑这个参数的默认值是no,所以用ssh客户端建立的反向隧道只能在Linux服务器的本地访问。如果修改一下ssh的配置文件把这个参数改为yes,反向隧道建立之后,就可以直接从Linux服务器的非本地地址访问了。这貌似变成了一个更简单的临时发布应用的方案。
具体操作的步骤如下:
- 修改Linux服务端的配置文件,vi /etc/ssh/sshd_config,找到里面默认注释的GatewayPorts参数,在下面写上GatewayPorts yes
- 重启SSH服务,service sshd restart
- 假设本地有个服务在8000端口,希望发布到服务器的7000端口,用ssh连接服务器,建立反向隧道,ssh -vnNT -R 7000:localhost:8000 username@serveraddress
现在访问http://serveraddress:7000就等同于访问本地机8000端口的服务了。
第3个步骤如果用putty这个工具,可以参加下图:

写好隧道参数,注意下面要选Remote才是建立反向的隧道,然后Add,再Apply。