三條命令助你快速實現 SSH 內網穿透

大雄45發表於2022-09-26
導讀 最近小白在遠端操作一個私有化的專案時正好用到了這個,簡單總結了下便有了此文章。

三條命令助你快速實現 SSH 內網穿透三條命令助你快速實現 SSH 內網穿透

ssh 反向隧道相信大多數同學都比較瞭解,就算不了解也一定在日常工作中聽說過,其實拋開那些專業的術語,通常我們藉助 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 內網穿透的核心流程,如果要做得更加的優雅的話,我們還需要考慮幾點最佳化:

  1. 為三臺機器上的 ssh 客戶端分別配置公私鑰
  2. 為主機 B 上的 ssh 方向隧道建立服務程式,避免重啟後隧道丟失
  3. 儘量保證公網主機 A 的網路安全,可單獨為隧道埠配置防火牆策略

當然,ssh 反向隧道除了能代理 ssh 服務外,它也能對內網的其他服務做 socket 轉發,這裡本文就不再展開。總之,建立 SSH 反向隧道這種事情大多數情況都是迫於無奈的臨時選擇,我們在用完後要及時釋放連線,避免長期閒置被不法分子盯上後帶來的損失。

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2916281/,如需轉載,請註明出處,否則將追究法律責任。

相關文章