利用ssh隧道5分钟搞定内网穿透

时间:2024-03-03 10:35:29

日常开发中,我们经常有内网穿透需求,比如需要把内网开发机器上的网站给外网用户演示用。

 

解决这个问题的办法很多,有的简单,有的复杂。

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

http://arondight.me/2016/02/17/%E4%BD%BF%E7%94%A8SSH%E5%8F%8D%E5%90%91%E9%9A%A7%E9%81%93%E8%BF%9B%E8%A1%8C%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/

https://www.jianshu.com/p/bad33004bb4f

https://www.ssh.com/ssh/tunneling/example