ssh反向代理实现内网穿透(比较失败( ˙灬˙ ))
有关背景请参见http://www.upwzr.com/2016/10/08/run-ngrok/,本文是在使用ngrok之前的依次失败的尝试。。。当然,ngrok实际上也是是ssh来实现的。
对于内网主机想要外网访问,最简单的办法当然是在路由器上做手脚,但是在不能操作路由设备的时候(比如说学校的内网网段),想要实现外网访问可通过ssh隧道实现。只需要一条很简单的命令:
ssh -N -f -R 80:127.0.0.1:8001 [email protected]
- -N 不执行远程命令
- -f 后台执行
- -R remote_port:localhost:local_port 远程端口转发 上面的命令就表示连接到123.45.67.89,将本地的8001端口转发到123.45.67.89的80端口。公网主机的80端口转发必须使用root权限,用root角色去连接公网主机。
-g (GatewayPorts) option
先贴出一段鸟文:
When you forward a TCP port (either locally or remotely), by default SSH only listens for connections to the forwarded port on the loopback address (localhost, 127.0.0.1). This means only other programs running on the same host as the listening side of the forwarding can connect to the forwarded port. This is a security feature, since there is no authentication applied to such connections. Also, such a forwarded connection is potentially insecure, since a portion of it is carried over the network in a plain TCP connection and not protected by SSH.
上面大概是在说,默认情况下远程转发端口只能绑定到到回环地址127.0.0.1
上,这就是说内网主机的转发只能绑定到公网主机的本地地址上,只有公网本机才能访问,显然不是我们想要的。我们需要指定-g
参数为yes,这样便可以绑定到公网主机的0.0.0.0
(即本机的所有地址)。
打开/etc/ssh/sshd_config
,加入如下参数:
GatewayPorts yes
重启ssh服务即可。
稳定性
基本上大家都在用autossh,或者sshpass配合脚本实现自动重连,这个我没有尝试。(因为半路转去用ngrok)。
以我这次的实战为例,用于代理的公网主机是腾讯云的vps,有公网ip一个123.45.67.89(伪),内网主机一台,需要转发的服务跑在8001端口。注意,公网主机的80端口转发必须使用root权限,形如上面的那一条指令,用root去连接公网主机。否则链接会建立失败。腾讯云现在貌似只能使用ubuntu角色连接ssh,改也改不了,所以我只能绑定到非80端口,这样地址就变成papapa.bulabula.xxx:xxxx,拖着端口在后面,感觉超级不爽,也就没去配置autssh这些东西,结果链接很容易就挂起,重连的时候公网主机还在监听这个端口,就建立不起链接。。。于是我干脆放弃了。。。
最后采用了这种办法:http://www.upwzr.com/2016/10/08/run-ngrok/