因为公司需要远程操作和其他一些奇奇怪怪的原因,需要实现穿透内网,外网访问局域网中的服务. 实现类似于花生壳的功能. 大学时期觉得花生壳老牛逼了,明明是内网的服务居然可以外网访问.

准备:现在有内网机器 A ,可以访问外网,可以访问 B ,一台具有公网IP的Linux服务器 B IP地址为 2.2.2.2.

ssh端口映射

假设办公室的内网机器 A 操作系统为Linux,开启了WEB访问端口为 80 。我们希望在家中也能访问办公室 A 上的WEB页面。

那么你可以这么做:

首先让服务器 A 与远程主机 B 建立一个反向代理,将 A 的80端口映射到 B2222端口上.

ssh -ngfNTR 2222:localhost:80 [email protected]

输入主机 B 的密码,这样远程主机 B 访问自己的2222端口,相当于访问 A 的80端口。

接下来在远程主机 B 上执行:

ssh -fCNL *:2223:localhost:2222 localhost

将本机的2222端口正向代理到自己的2223端口上。

至此,端口转发完成。我们在家里的浏览器上键入 http://2.2.2.2:2223/ 与在公司直接访问主机 A80 端口是一样的。

如何工作的: B 2223 –> B 2222 –> A 80

然而不幸的是SSH连接是会超时关闭的,如果连接关闭,隧道无法维持,为此我们需要一种方案来提供一条稳定的SSH 反向隧道。一个最简单的方法就是autossh,这个软件会在超时之后自动重新建立SSH隧道,这样就解决了隧道的稳定性问题。

goproxy

如果只是映射单个端口,使用SSH是比较简便快捷的。如果转发多个服务器的多个端口,使用SSH不免有些繁琐,而且不容易辨认那些端口映射了什么。

goproxy托管在GitHub上,他是一个功能强大的端口转发、内网穿透工具。通过他的--k参数,可以比较容易辨认、控制这些进程。

这个软件功能挺强大的,改天要好好研究一下。但是配置有些繁琐,个人感觉很臃肿。

frp

这个是我找到的比较好用的软件之一了。配置简单,跨平台。这个项目托管在GitHub上,你可以点击这里跳转。 这个软件的配置简直简单到令人发指。这里不多赘述,具体可以参见官方example.