由于最近写的一个小项目接了腾讯云语音消息的SDK, 项目需要接收腾讯云POST过来的回调请求来处理业务逻辑. 公司的网络环境向来是个恼人的问题, 所以需要构思新一轮的网络中转骚操作.
其实将项目部署在有公网ip的测试主机上也可以进行测试, 但是自然是没有在本地开着IDE调试打断点来的爽快. 考虑了一下下就pass掉了~
说起这类内网穿透的需求, 首先当然会想到frp, ngrok之类的服务, 而且我之前也部署了一套自用的ngrok. 但是无奈公司的网络限制严格, frp的ip直连是不允许的, 自建ngrok的域名也无法访问, 有点头疼.
经过为时半天的不懈研究, 发现利用SSH隧道进行端口转发, 可以实现开发机上的端口对外网监听, 且使用Xshell开启隧道挺方便. 大概的流量链路是: 开发机 -> 测试机 -> 虚拟桌面(可以直连外网ip) -> VPS, 端口一路转发过去.
Xshell上的操作大概是: 开启隧道窗格 -> 新建转移规则 -> 根据需求选择Local. Remote或者Dynamic并填写ip和端口号. 由于不是本文重点, 所以不多赘述.
端口转发搭完之后, 一直都能正常使用, 中转这么多次还能保持不错的稳定性, 好顶赞~
这几天最近由于某些客观原因, 我需要换一台测试机来转发端口, 也就是说流量链路中的第二步需要在另一台主机上进行操作. 看起来应该不会造成什么影响, 直接打开Xshell窗口, 添加转发规则搞起.
但是测试的时候, 发现这条链路一直都是不通的. 观察了转移规则的状态, 都是打开, 正常, 没有问题. 那问题应该就出在那一台新的测试主机上了. netstat一看, 发现我转发的那个端口只对127.0.0.1开放了, 并没有对外监听, 果然是这里的问题.
其实在搭建这个流量链路的最后一步, 在有公网VPS配置端口转发的时候, 就发现它是对127.0.0.1开放端口, 不过由于当时急着操作, 直接用nginx配了一个反向代理凑合用了, 没有对其深究. 而今天思考这个问题的原因是, 我发现在旧的那一台测试机上, 使用同样方法开启的端口转发, 它却是对0.0.0.0开放的. 这表明一定是可以通过什么方式配置使其对外监听端口的.
查阅一些资料之后, 找到了正确的做法: 只需要修改远程机器的/etc/ssh/sshd_config
, 将GatewayPorts
选项修改为yes
. 如果配置里面没有GatewayPorts
项的话, 直接在最下面加一行GatewayPorts yes
就行. 重启ssh服务即可生效.
在向同事打听消息之后得知, 旧的那台测试主机确实也是修改过这个设置的.
提醒: 这样当然做是不安全的!!
由于测试主机处在内网, 可以隔绝大部分外部风险, 相对较为安全. 但如果是处在公网环境的VPS采用这个配置, 就非常需要留意安全问题了. 相对稳妥的做法是, 在不需要端口转发的时候将GatewayPorts
设为no
, 或是使用nginx来反向代理端口.
reference: https://www.ssh.com/ssh/tunneling/example