现希望将一台没有公网IP的Windows机器的3389端口,借助一台具有公网IP的无root权限的服务器,转发至公网,实现内网穿透。
其实现在已经有很多方案,例如frp、nps等。我之前一直用frp,但考虑到frp这种东西相对于我的需求还是比较重的,而且比较担心安全性问题,所以趁着这次换服务器,换一种方案。
WXC推荐我直接使用SSH的tunnel功能,他的博客有比较详细的说明。
我这里有一点不太一样的是我没有这台服务器的root权限,这就导致无法修改/etc/ssh/sshd_config
并添加GatewayPorts yes
,所以无法通过一次ssh -L
将本地端口转发至远程并开放到公网。
因此,我的做法是:
- 在Windows执行
ssh -R 0.0.0.0:13389:localhost:3389 your_username@your_server -p your_port
,将本地的3389端口转发到远程的13389(但23389只有远程机器才能访问)。 - 在远程执行
ssh -L 0.0.0.0:23389:localhost:13389 your_username@localhost
将远程的13389端口转发到23389上并开放至公网。
对于第一步,我本来是想通过winsw将ssh命令注册为服务,但是可能winsw对于ssh这种交互式的不太支持,ssh启动了但是一直连不上。可能通过对ssh加一些参数可以解决,不过试了半天感觉太麻烦就放弃了。
最终我用了MyEnTunnel这个软件(WXC博客里有),直接通过该软件来配置隧道。配置完之后通过计划任务将它设为开机启动(之所以搞计划任务而不是直接把它放到“启动”文件夹是因为我希望开机即使不登录也会启动该软件)。
对于第二步,由于希望在远程服务器上保持隧道,所以我直接通过screen执行然后detach。具体来说就是先执行screen ssh -L 0.0.0.0:23389:localhost:13389 your_username@localhost
,然后ctrl+A D
。
对于希望最终数据传输不经过公网服务器的内网穿透,有一个解决方案是zerotier,是一种P2P性质的内网穿透。
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。