日常开发中,我们经常有内网穿透需求,比如需要把内网开发机器上的网站给外网用户演示用。
解决这个问题的办法很多,有的简单,有的复杂。
Ngrok
Ssh、autossh
Natapp
Frp
Lanproxy
Spike
花生壳
VPN
路由器端口映射
ssh 这种方案是比较快捷的,且不依赖第三方服务。
实验条件:
1.公网机器:centos7 , 192.168.0.110 (由于是做实验,没有直接用公网机器来做)
2.内网开发机:本机 win10(可以是其他可以使用ssh客户端的任何机器),本机运行了一个web程序,端口8888
实验目的:
通过访问 http://192.168.0.110:70/ 的请求转发到 本地 8888
实验步骤:
1.配置 192.168.0.110 防火墙 端口:
firewall-cmd --zone=public --add-port=70/tcp --permanent
firewall-cmd --reload
2.110 用的是openSSH, 所以需要开启110机器上的 sshd 相关配置:
配置文件:/etc/ssh/sshd_config
需要修改的配置项: GatewayPorts =yes
如果不修改,转发端口永远绑定到 loopback 网络接口,配置成功后,只能在 192.168.0.110 机器上用 localhost:70访问,无法在其他机器上用 192.168.0.110:70访问
3.win10 机器上,打开PowerShell ,输入以下命令建立隧道:
ssh -p 22 -qngfNTR "[::]:70:localhost:8888" root@192.168.0.110
参数说明:
-p : 是 192.168.0.110 是ssh 端口
-qngfNTR: 建立隧道相关参数,固定的
"[::]:70:localhost:8888" : [::]:70 表示把70端口绑定到所有的网络接口上;localhost:8888表示需要被转发的内网服务器端口,本例中是localhost:8888
root@192.168.0.110 : 公网机器 用户名 IP , 本实验用内网机器模拟。
4.大功告成:
在任意一台机器上就可以通过
http://192.168.0.110:70/ 访问 win10机器上的web服务了。
实验过程中踩过的坑:
1.win10 PowerShell 中 关闭 ssh 连接窗口后,ssh 隧道没有关闭的问题:
查看已经建立的ssh连接:
Get-Process -Name ssh
杀死ssh连接:
Get-Process -Name ssh | Stop-Process
其他ssh客户端需要注意类似的问题,否则多次执行 ssh -p 22 -qngfNTR "[::]:70:localhost:8888" root@192.168.0.110 会建立多个隧道
2.请注意 绑定都所有网络接口 "[::]:70:localhost:8888" ,[::] 不能少,否则 只会绑定到 loopback 接口。
参考资料:
https://blog.csdn.net/yueliang2100/article/details/82735799
https://blog.csdn.net/HoKis/article/details/79007546
https://superuser.com/questions/588591/how-to-make-ssh-tunnel-open-to-public
https://www.jianshu.com/p/bad33004bb4f
https://www.ssh.com/ssh/tunneling/example