天天看点

使用ssh反向隧道进行内网穿透

使用ssh反向隧道进行内网穿透

背景:公司在不同地域不同资源池的vpc中建有子网,其中内网1和内网2的机器都无公网ip,都是通过SNAT访问公网。需求是需要在内网2的机器中从内网1的服务器B提供的git服务拉取代码,当然有诸多方式比如vpn等来打通两个内网网络,这里只介绍通过ssh反向隧道的方式打通。

这个方式是借助了服务器c有公网ip,利用服务器C的特定端口监听,实现远程端口转发。

服务器A: 192.168.1.36 ssh有权限访问

服务器B: 192.168.1.86 无ssh访问权限,和服务器A内网互通,对内网提供git服务(https,使用443端口)

服务器C: 144.6.121.* 有公网ip,有ssh的root访问权限

服务器D: 172.18.150.12 在另一内网下,也是通过SNAT访问公网,需要从git拉取代码进行构建

步骤:

1.首先打开服务器C的特定端口,用于端口转发,此处使用6767。示例机器使用iptables,如果使用firewalld service,请相应转换为firewall-cmd 命令打开端口。

iptables -I INPUT -p tcp --dport 6767 -j ACCEPT

iptables -I OUTPUT -p tcp --sport 6767 -j ACCEPT

2.登陆服务器A, 使用ssh反向代理进行端口远端转发。

ssh -R 6767:192.168.1.86:443 [email protected].*

(autossh 版本,autossh断开后可以自动重连,所有ssh使用的参数和autossh一致。不同的是增加了 -M参数,-M参数,这个参数指定一个端口,这个端口是外网的C机器用来接收内网A机器的信息,如果隧道不正常而返回给A机器让他实现重新连接。

autossh -M 6766 -fCNR 6767:192.168.1.86:80 [email protected].*

参数解释:

-f 后台执行ssh指令

-C 允许压缩数据

-N 不执行远程指令

-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口

-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口

)*

输入服务器C的登陆密码,登陆后,在服务器C验证是否能访问git服务:

curl -ik https://127.0.0.1:6767

HTTP/1.1 302 Found
Server: nginx
Date: Mon, 02 Sep 2019 10:30:50 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 106
Connection: keep-alive
Cache-Control: no-cache
Location: https://127.0.0.1:6767/users/sign_in
           

但是 curl -ik https://144.6.121.*:6767 Connection refused. 使用netstat查看端口情况,发现6767打开的是127.0.0.1:6767,因此外网无法访问。

[[email protected] ~]# netstat -apn |grep 6767
tcp        0      127.0.0.1:6767            0.0.0.0 *               LISTEN      88582/sshd: [email protected] 
tcp6       0      0 :::6767                 :::*                    LISTEN      88582/sshd: [email protected]
           

参考 https://blog.csdn.net/u012911347/article/details/80765894,使ssh隧道监听0.0.0.0而不是127.0.0.1.

登陆服务器C:

修改vim /etc/ssh/sshd_config

添加GatewayPorts yes

service sshd restart即可

再次curl -ik https://144.6.121.*:6767 服务可以访问了。

3. 登陆服务器D,可以直接通过https://144.6.121.*:6767进行代码拉取了。

继续阅读