06月14, 2020

在没有root权限的公网服务器上通过端口转发做内网穿透

现希望将一台没有公网IP的Windows机器的3389端口,借助一台具有公网IP的无root权限的服务器,转发至公网,实现内网穿透。

其实现在已经有很多方案,例如frpnps等。我之前一直用frp,但考虑到frp这种东西相对于我的需求还是比较重的,而且比较担心安全性问题,所以趁着这次换服务器,换一种方案。

WXC推荐我直接使用SSH的tunnel功能,他的博客有比较详细的说明

我这里有一点不太一样的是我没有这台服务器的root权限,这就导致无法修改/etc/ssh/sshd_config并添加GatewayPorts yes,所以无法通过一次ssh -L将本地端口转发至远程并开放到公网。

因此,我的做法是:

  1. 在Windows执行ssh -R 0.0.0.0:13389:localhost:3389 your_username@your_server -p your_port,将本地的3389端口转发到远程的13389(但23389只有远程机器才能访问)。
  2. 在远程执行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性质的内网穿透。

本文链接:https://debug.fanzheng.org/post/intranet-penetration-through-port-forwarding-on-servers-without-root-privileges.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。