背景:
如果局域网有一台机器A,这台机器只能访问外网,但外网不能反向访问这台机器。同时在外网有一台有公网IP的机器B(阿里云,或者腾讯云等VPS),这样就可以通过简单的方法让外网的机器可以访问局域网的机器。我都是基于linux下的机器,原则上如果是windows,将个putty或者crt也能实现。
方案:
- 在局域网的机器上利用ssh -R的命令建立一条反向隧道。
nohup ssh -t -t -R 2266:127.0.0.1:22 user@外网机器B的IP >nohup.out &
意思是ssh上外网机器B,然后在机器B上打开监听端口2266,访问2266端口就是通过隧道访问局域网机器B的22端口。 由于采用的是nohup运行,设置好ssh免密码登陆,就不用每次都输入密码了。 2. 在外网机器B上,只能执行以下命令,就能反向ssh到局域网B的机器了。
ssh user@127.0.0.1 -p 2266
- 设置外网机器B的SSH心跳 这里存在一个问题,如果不设置SSH发送心跳,这条隧道很快就会超时,断开。所以在外网机器B上设置:经过这样的测试,发现一天了这个隧道还能用。
# 打开
sudo vim /etc/ssh/sshd_config
# 添加
ClientAliveInterval 30
ClientAliveCountMax 6
- 其他解决方法: 其他这样的设置已能解决我的需求了,我可以在家里上公网的机器然后通过这个隧道ssh回公司内网的机器,就能再跳去其他机器了。其实还有几种其他的方案: 4.1 云风也曾经介绍过类似的方案,参考这里,他也是采用ssh -R,但他多搞了几步,安装了vtund,让内网的机器成为路由,能更进一步自由地访问内网网络。 4.2 用N2N的VPN软件,建立一个VPN网络。 4.3 自己写个UPD的NAT打洞,穿越进来。