巧用 SSH 打通外網限制

文案轉載於:知乎李耀

鏈接:https://zhuanlan.zhihu.com/p/444319023

漫圖來源於:捷哥

文案格式排版:釋然

筆者在工作中遇到此場景,如下兩條網絡限制下,總部如何訪問分公司內部 web 服務器?

初看需求,我們第一個想到的肯定是內網端口映射到公網,或者 vpn,但是不修改網絡策略情況下很難實現。有沒有別的方法呢,我們繼續從純網絡角度分析現有條件。

網絡通信是雙向的,有請求,有迴應,就是我們俗稱的 “通”。dmz 可以訪問外部 22 端口,代表請求,回包兩個通信通道都是通暢的,我們是否可以藉助回包通道,從外部發起到內部的反向訪問呢?答案當然是有的,我們來試一試,需要 ssh 工具。

我們在 dmz 執行如下命令。

[root@dmz]#  ssh -f -N -g -R  6606:10.1.1.1:80 root@115.100.100.100

**-f:代表後臺運行程序
**

-N:表示使用遠程端口轉發創建 ssh 隧道

-g:監聽本機所有 IP 地址

-R,表示使用遠程端口轉發創建 ssh 隧道

命令結合起來什麼意思呢,我們使用 root 用戶遠程連接到 115.100.100.100,並且遠程主機監聽 6606 端口,當訪問此端口時,會跳轉到 dmz 的 80 端口。此過程會使用到 ssh 隧道。dmz 運行之後,總部服務器的已經有了端口監聽。

[root@center]# netstat -tunlp | grep 6606
    tcp        0      0 127.0.0.1:6606          0.0.0.0:*               LISTEN      8616/sshd: root
    我們在總部服務器嘗試端口提示拒絕,代表網絡已經打通了,但是dmz服務器並沒有監聽80端口,所以報端口拒絕。
[root@center]# telnet 127.0.0.1 6606
    Trying 127.0.0.1...
    telnet: connect to address 127.0.0.1: Connection refused

如法炮製,再把 web 服務器到 dmz 的網絡反向打通,dmz 服務器訪問本地 80 端口時將跳轉到 web 服務器的 80 端口。

[root@web]# ssh -f -N -g -R  80:10.1.1.1:80 root@10.1.1.2

再次到總部服務器測試訪問就能通信了。

[root@center]# telnet 127.0.0.1 6606
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.

我們最後從網絡角度來回顧數據包的的轉發過程。

從總部服務器看到如下信息。

#dmz服務器以115.100.100.101:29493作源,訪問本地22端口,建立了tcp連接。
[root@center]# ss | grep 115.
    tcp    ESTAB      0      0      172.16.1.1:22                115.100.100.101:29493
[root@center]# netstat -tpna | grep 115.
    tcp        0      0 172.16.1.127:22      101.230.91.53:29493     ESTABLISHED 8555/sshd: root

#本地端口也對應到了進程號8616
[root@center]#netstat -tunlp | grep 6606
    tcp        0      0 127.0.0.1:6606          0.0.0.0:*               LISTEN      8616/sshd: root
[root@center]# ps -ef | grep 8616
    root      8616  8555  0 Dec03 ?        00:01:04 sshd: root.

當總部服務器訪問 127.0.0.1:6606 時,網絡連接信息如下。

雙向通道已經建立
[root@center]# ss | grep 6606
    tcp    ESTAB      0      0      127.0.0.1:6606                 127.0.0.1:51158
    tcp    ESTAB      0      0      127.0.0.1:51158                127.0.0.1:6606

我們最後用圖片來展示最終網絡轉發過程。

dmz 發起 ssh 連接到總部服務器,並且遠程端口轉發。遠程服務器訪問轉發端口時,數據將封裝到回包通道,由於 ssh 本身加密,外部網絡無法知曉網絡交互邏輯,從而實現反向訪問。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/OrTSztQomhEOyG79M9zylA