因为公司需要远程操作和其他一些奇奇怪怪的原因,需要实现穿透内网,外网访问局域网中的服务. 实现类似于花生壳的功能. 大学时期觉得花生壳老牛逼了,明明是内网的服务居然可以外网访问.
准备:现在有内网机器 A
,可以访问外网,可以访问 B
,一台具有公网IP的Linux服务器 B
IP地址为 2.2.2.2
.
ssh端口映射
假设办公室的内网机器 A
操作系统为Linux,开启了WEB访问端口为 80
。我们希望在家中也能访问办公室 A
上的WEB页面。
那么你可以这么做:
首先让服务器 A
与远程主机 B
建立一个反向代理,将 A
的80端口映射到 B
的2222
端口上.
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/
与在公司直接访问主机 A
的 80
端口是一样的。
如何工作的: B 2223
–> B 2222
–> A 80
然而不幸的是SSH
连接是会超时关闭的,如果连接关闭,隧道无法维持,为此我们需要一种方案来提供一条稳定的SSH 反向隧道。一个最简单的方法就是autossh
,这个软件会在超时之后自动重新建立SSH
隧道,这样就解决了隧道的稳定性问题。
goproxy
如果只是映射单个端口,使用SSH
是比较简便快捷的。如果转发多个服务器的多个端口,使用SSH
不免有些繁琐,而且不容易辨认那些端口映射了什么。
goproxy托管在GitHub上,他是一个功能强大的端口转发、内网穿透工具。通过他的--k
参数,可以比较容易辨认、控制这些进程。
这个软件功能挺强大的,改天要好好研究一下。但是配置有些繁琐,个人感觉很臃肿。
frp
这个是我找到的比较好用的软件之一了。配置简单,跨平台。这个项目托管在GitHub上,你可以点击这里跳转。 这个软件的配置简直简单到令人发指。这里不多赘述,具体可以参见官方example.