Networking

當客戶端和主機在同一台機器上時,ssh 如何工作?

  • August 15, 2014

我在 docker 容器的幫助下說明了我的問題,但這個例子與問題的其餘部分是正交的。事實上,任何允許使用橋接介面和 ssh 的程序都可以。

我使用了一個 Docker 容器,它在後台執行一個sshd守護程序,該守護程序由supervisord它在前台執行。我主要使用 ssh 來獲得一種安全的 X11 轉發方式,而不必將 mount 綁定/tmp/.X11-unix到可能的容器中並將套接字完全暴露給容器。如果我docker top containername在啟動容器後立即使用,我會得到以下輸出:

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4732                535                 1                   19:56               ?                   00:00:00            /usr/bin/python /usr/bin/supervisord
root                4745                4732                0                   19:56               ?                   00:00:00            /usr/sbin/sshd

這是預期的。現在,我將容器上的 22 埠暴露給主機上的 5000 埠。因此,我可以使用ssh -X username@localhost -p 5000. 我知道當客戶端和主機是不同的電腦和不同的網路時 ssh 是如何工作的,但是當客戶端和主機是同一台電腦時我有一些問題(在我的情況下,客戶端是我的普通機器,主機是我普通機器上的容器)。我知道 docker 在我的普通機器上的物理網路設備和我機器上的虛擬網路設備之間建立了一座橋樑。

  1. 但是我的普通機器和容器究竟是如何相互通信的呢?他們是否使用網橋設備分配給他們的 IP 地址並通過這些地址進行通信?
  2. 此過程中涉及的埠如何消除使用 IP 地址的需要?
  3. 當客戶端和主機在同一台機器上並按照我剛剛概述的方式進行配置時,是否有最有效/推薦的方式來使用 ssh。

廣泛的網際網路搜尋沒有找到足夠的答案。話雖如此,我當然不會斷言這樣的網站不存在!

僅限本地通信如何工作?很簡單:與普通的非本地通信完全一樣,只是網路堆棧檢測到通信的目的地在同一台機器上,因此不需要將流量向下交給堆棧到物理層,而是將其傳遞到IP層的接收部分。

特別是這意味著 IP 地址仍然是必需的,因為 IP 網路連接總是需要源埠和地址以及目標埠和地址——在這種情況下,“特殊”部分只是源地址和目標地址相同127.0.0.1/localhost

從 SSH 或任何其他網路協議的角度來看,沒有任何變化。

就虛擬化而言,有兩種方法:橋接網路和 NAT。

  • 使用橋接網路,虛擬機是網路的完整成員,擁有自己的地址和一切。這工作如下:

    • 虛擬化軟體在主機中創建一個虛擬網路介面,以反映虛擬機內部的模擬物理設備。
    • 在主機上,您創建一個網橋並將虛擬設備和物理設備都綁定到它。這有點像交換機,物理設備作為網路其餘部分的上行鏈路。
    • 就像真正的交換機一樣,網橋設備知道連接到它的 IP 地址,並將相應地傳送流量,並且不會在針對連接到網橋的(虛擬)設備之一的線路上發送流量。在網路堆棧中,它位於鏈路層。
  • 使用 NAT,您不能直接與虛擬機通信,必須將主機用作路由器,就像大多數家庭網路一樣。

    • 您仍然有連接到(虛擬)交換機的虛擬介面。但這個交換機的作用不像網橋,也沒有連接到物理網路。
    • 主機的網路介面連接到物理網路和虛擬網路,並充當 NAT 路由器。如果您想直接與虛擬機對話,則必須進行埠轉發。

我不確定 Docker 究竟是如何運作的,可能是它使用了另一種方法,只是直接將物理主機上的埠連接到虛擬機的埠,而不需要整個 NAT shebang。

在您的 SSH 範例中,實際上在後台發生了很多事情:

  • 如果您執行ssh user@localhost -p 5000,網路堆棧會檢測到這是本地的,並且不會線上路上發送流量。相反,它會將其發送到本地機器的 5000 埠。
  • 正在偵聽埠 5000 的 NAT 轉發器將流量發送到虛擬介面,在該介面中,它作為正常流量從虛擬機接收到埠 22。

引用自:https://serverfault.com/questions/620633