Total Pageviews

Thursday 29 June 2017

内网web服务穿透攻略

研究了下内网穿透,即从外网访问内网web服务。
本来想想这种事情除了开VPN,似乎没有别的办法,直到前段时间一同事告诉我他通过ssh隧道实现了这个需求,并发给我一篇英文博客,当时只是随便瞄了几眼文章里的图,没有时间去看。于是后来断断续续的暗暗研究,由于英语不好,都是搜索中文文章,但看了好多篇文章,都是单单讲SSH,没有涉及到HTTP,没有说到我需求的关键点。直到最后,再回头看看前面那篇英文博客,一切都豁然开朗了!
那篇文章在这 https://chamibuddhika.wordpress.com/2012/03/21/ssh-tunnelling-explained/ (请自备梯子)
好了,下面开始进入正题。由于是『微攻略』,只涉及到操作的步骤,不讲具体原理。
看了好多篇文章,ssh隧道需要借助中间主机(外网需可访问)进行端口转发,而且分为本地转发和远程转发,我们这里需要的是远程转发。
核心命令,即在内网主机执行:
ssh -C -f -N -R *:{中间主机监听端口}:localhost:{内网主机监听端口}{中间主机用户名}@{中间主机} [-p {中间主机ssh端口}]

举个栗子,假设: 内网主机:192.168.100.101
中间主机:123.123.123.123(ssh端口为333,一般默认为22)
需要从外网访问内网主机的web服务端口:8080
希望中间主机监听的端口:2222
登陆主机的用户:root
那么在内网主机上需要执行的命令为:
1
ssh -C -f -N -R 2222:localhost:8080 root@123.123.123.123 -p 333
然后会提示输入中间主机的用户密码,输入完毕后,则建立ssh隧道完毕。
此时在中间主机执行:
1
curl localhost:2222
就可以看到打印出内网主机返回的http信息。
至此核心部分已经完成了,还剩下几个问题:
  1. 第三方主机(HTTP客户端)尚无法通过中间主机访问内网web服务
  2. 每次执行此命令还需要输入中间主机的用户密码
  3. 即使是守护进程中运行的,也会在一段时间后断开连接
    我们一个个解决:
1.需要开启中间主机的GatewayPorts:
通过vi /etc/ssh/sshd_config 文件,将 GatewayPorts 设置为 yes,保存退出vi。然后执行
1
/etc/init.d/sshd restart
这是centos的命令,其他linux版本可能有所不同
然后就可以在家里用自己电脑,访问内网的WEB服务了!比如在浏览器里打开http://123.123.123.123:2222/something就能看到内网的web页面了~
2.把内网主机的ssh公钥添加到中间主机的相应用户的~/.ssh/authorized_keys中,甚至可以设置中间主机别名
3.通过autossh(一个命令行工具),当隧道断开连接后,可自动重连,通过包管理工具安装好后,只需将上述命令的ssh替换为autossh即可,比如上面的例子,改为autossh就是:
1
autossh -C -f -N -R 2222:localhost:8080 root@123.123.123.123 -p 333
好了,接下来就可以愉快的玩耍了.

No comments:

Post a Comment