透過遠端連接埠轉送透過 Jumphost 進行 SSH 會話

透過遠端連接埠轉送透過 Jumphost 進行 SSH 會話

我們在透過遠端連接埠轉送進行 SSH 連線時遇到問題。

該場景是一個企業網絡,內部網路上的伺服器(我們稱之為「來源」)必須透過 SSH 登入 DMZ 中的伺服器(「目標」)。由於 DMZ 中的目標伺服器對於來自內部網路的連線被鎖定(甚至無法從內部網路看到),因此我們在 DMZ 中有一個跳轉主機(「jumphost」)。我們透過在跳轉主機上設定遠端連接埠轉送來實現此目的。

我們從內部網路上的來源伺服器執行此命令到跳轉主機:

origin> ssh -R *:1234:target:22 myusername@jumphost

這是為了在跳轉主機上建立 SSH 會話,使其開始偵聽連接埠 1234(只是一個任意連接埠號碼範例),並將該連接埠上的連線轉送至目標伺服器連接埠 22 (SSH)。

然後我們在連接埠1234 上建立第二個SSH 會話,仍然是從來源伺服器到跳轉主機,然後該會話實際上在連接埠22 上連接到目標伺服器- 這是我們的「真正」SSH 會話,我們可以在其中完成我們的工作目標伺服器:

origin> ssh jumphost -P 1234

配置

跳轉主機已配置為允許遠端連接埠轉發,在 sshd_config 中進行以下設定:

AllowTcpForwarding yes
GatewayPorts yes

此外,在來源伺服器和跳轉主機之間設定了防火牆開口,用於連接埠 22(用於初始 SSH 連線以設定遠端連接埠轉送)和連接埠 1234(用於轉送連接埠上的後續 SSH 連線)。跳轉主機和目標之間也有防火牆,已在連接埠 22 上開啟。

結果

當我們建立第二個連線(透過轉送連接埠的連線)時,該連線立即關閉(「連線被遠端主機關閉」)。

在目標伺服器上執行 tcpdump 顯示沒有任何活動,即連線似乎被阻止。

但是,我們能夠成功建立從跳轉主機到目標的常規 SSH 會話。僅當透過轉送連接埠進入時,連線才會關閉,儘管兩者都連接到連接埠 22 上的目標。

更重要的是,如果我們將連接埠轉送指向內部網路上的伺服器(即從內部網路上的原點到 DMZ 中的跳轉主機,然後返回內部網路上的第三台伺服器的連線),那麼 SSH會話建立成功。

猜測和疑問

所有這些讓我相信某些網路安全設定正在發揮作用,它阻止透過跳轉伺服器上的轉送連接埠連接到 DMZ 內的目標伺服器。不幸的是我知識不夠,無法知道:

(1) 從網路安全策略的角度來看,來自來源伺服器、透過跳轉伺服器上的轉送連接埠的 SSH 連線是否“不同”,是否可以在技術上被阻止,如果可以,如何阻止?需要做什麼才能解除該限制?

(2) 不允許此連接通過的任何其他原因 - 防火牆配置、路由器配置、來源站或跳轉主機上的 SSH 設置,還有其他原因嗎?

(3) 是否會因為來源伺服器不知道目標伺服器而失敗,導致第一個 ssh 指令無法如預期般運作?換句話說,第一個 ssh 指令(「目標」)中指定的主機名稱是在客戶端(來源)還是在我們連接到建立隧道(跳轉主機)的伺服器上解釋的?

最令我困惑的是,可以從跳轉主機到目標建立常規 SSH 會話,我認為透過轉送連接埠進入的 SSH 連線將是相同的,但不知怎的,事實並非如此。

非常感謝任何意見。

答案1

看起來您應該使用本地連接埠轉送而不是遠端連接埠轉送。您可能需要參考 Dirk Loss 撰寫的以下有用的部落格文章:

它包括以下說明圖:

ssh 連接埠轉送:本地與遠端

為了閱讀該圖,您需要知道它描述了創建和使用 SSH 隧道所涉及的 4 個不同角色之間的關係:

  • 用於建立隧道的ssh 用戶端(即sshOpenSSH 命令列客戶端);
  • sshd用於維護隧道另一端的ssh 伺服器(即OpenSSH 伺服器守護程序);
  • 應用程式伺服器(例如另一個 ssh 伺服器或 http 伺服器);
  • 想要透過隧道存取應用程式伺服器的應用程式用戶端(例如另一個 ssh 用戶端或 Web 瀏覽器)。

同樣重要的是要了解兩種不同類型的轉送對應於兩種不同的用例:

  • 本地轉發:應用程式用戶端透過 ssh 用戶端連接的地方

  • 遠端轉送:應用程式用戶端透過 ssh 伺服器連接

之所以稱為遠端轉發,是因為轉發是在遠端(在 ssh 伺服器)而不是在本地端(在 ssh 用戶端)執行的。我還發現“遠端轉發=反向轉發”是一個有用的助記符。

正如您所看到的,為了透過代理程式上的伺服器啟動從主機ssh上的用戶端到第三台主機的連接,您必須使用本機連接埠轉送。遠端連接埠轉送適用於您希望隧道入口點位於執行伺服器的主機而不是執行客戶端的主機的情況。originsshdjumphosttargetsshdssh

在手冊頁中,本機連接埠轉送語法編寫如下:

ssh -L [bind_address:]port:host:hostport user@remote

可以更直觀地寫成如下:

ssh -L [local_bind_address:]local_port:remote_host:remote_host_port user@proxy_host

或者,使用您的命名約定:

ssh -L [origin_bind_address:]origin_port:target_host:target_host_port user@jump_host

如果我們修改您的命令以使用本地連接埠轉發,那麼我們最終會得到以下結果:

user@origin:~$ ssh -L *:1234:target:22 myusername@jumphost

相關內容