天天看點

使用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進行代碼拉取了。

繼續閱讀