三條命令助你快速實現 SSH 內網穿透
ssh 反向隧道相信大多數同學都比較瞭解,就算不了解也一定在日常工作中聽說過,其實拋開那些專業的術語,通常我們藉助 ssh 的反向隧道來實現兩個網絡隔離的主機間通信。最近小白在遠程操作一個私有化的項目時正好用到了這個,簡單總結了下便有了此文章。
在操作之前,我先將需要的資源列出一個表格,大家在操作前可以先按照如下準備資源:
這裏爲了操作方便機器全部用的 root 賬號,大家不要學我😂
我的需求很簡單,即客戶內網 B 中有一批剛裝完操作系統的服務器,我需要在公司或者家中的電腦上通過 Ansible Playbook 批量對這些機器進行初始化。
第一步:開啓 ssh server 代理功能
在位於公網服務器上打開 sshd 的GatewayPorts
開關,並重啓 sshd
sed -i "s/#GatewayPorts no/GatewayPorts yes/g" /etc/ssh/sshd_config
systemctl restart ssh
打開代理功能意味着,當我們在建立 ssh 反向隧道後,監聽的地址會從默認的 127.0.0.1 更換成 0.0.0.0,方便 ssh 客戶端遠程登錄。
第二步:建立 ssh 反向隧道
在客戶內網 B 中找一臺能訪問 121.41.218.68 地址的服務器,登錄上去,並在終端內執行下述命令:
ssh -lroot -p22 -qngfNTR 8822:localhost:22 121.41.218.68 -o ServerAliveInterval=10
這一步的關鍵信息其實就是在主機 B 和主機 A 之間建立一條 SSH 隧道,隧道端口的映射關係是主機B:22 <--> 主機A:8822
之所以加上 ServerAliveInterval=10,是讓客戶端每 10s 發送一個心跳保持隧道的鏈接,否則這條連接很容易被重置。
第三步:本地 ssh client 代理
目前有了 ssh 的隧道也只能滿足我本地主機 C 能通過 121.41.218.68 的 8822 端口 ssh 登錄到客戶內網的 B 主機,還不能滿足我進行批量運行任務的需求。
此時,我們就需要在自己電腦上配置 ssh 客戶端的 socket 代理來滿足需求,配置位於~/.ssh/config
host hosta
HostName 121.41.218.68
Port 8822
User root
host 10.155.0.*
User root
Port 22
ProxyCommand ssh hosta -W %h:%p
至此,我就可以在本地用 ansible-playbook 無縫的進行操作了。
總結
上述 3 步是整個 ssh 內網穿透的核心流程,如果要做得更加的優雅的話,我們還需要考慮幾點優化:
-
爲三臺機器上的 ssh 客戶端分別配置公私鑰
-
爲主機 B 上的 ssh 方向隧道創建服務進程,避免重啓後隧道丟失
-
儘量保證公網主機 A 的網絡安全,可單獨爲隧道端口配置防火牆策略
當然,ssh 反向隧道除了能代理 ssh 服務外,它也能對內網的其他服務做 socket 轉發,這裏本文就不再展開。總之,建立 SSH 反向隧道這種事情大多數情況都是迫於無奈的臨時選擇,我們在用完後要及時釋放連接,避免長期閒置被不法分子盯上後帶來的損失。
本文轉載自:「雲原生小白」,原文:https://url.hi-linux.com/Um2bJ,版權歸原作者所有。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/_7EXB1b5UTR8WsyePVOQMw