使用 docker 容器的機器之間的連接埠映射

使用 docker 容器的機器之間的連接埠映射

我有2台機器。

  • 192.168.0.10
  • 192.168.0.20

其中運行一些 docker 服務。

在第二台機器上,我在幾個連接埠上看到來自第一台機器上的服務的傳入流量。

但是當我檢查第一台主機時,我沒有看到這些連接埠正在使用。

例如我會看到:

 192.168.0.10:48002 ->  192.168.0.20
 192.168.0.10:51364 ->  192.168.0.20
 192.168.0.10:52502 ->  192.168.0.20

但是當我在 192.168.0.10 上檢查這些連接埠時,它們並未顯示正在使用中。

所以會是空的:

sudo netstat -tulpan | grep '52502'

可能是什麼原因造成的?我懷疑這可能與 docker 容器和連接埠映射有關?

編輯:

掃描服務本身會顯示以下內容:

tcp6       0      0 127.0.0.1:48806         127.0.0.1:8088          ESTABLISHED 1065071/java

內部連接埠連接到 docker 網路上的另一個連接埠...然後就什麼都沒有了。我是否可以假設這是所有其他流量都經過的某種隧道?我該如何映射這個?

答案1

當連接到 tcp 服務時,目標連接埠是預先知道的(例如80對於 http 服務),但來源連接埠是在建立套接字時隨機選擇的,通常連接埠號碼高於 32767。

您看到的三個連接埠192.160.0.10是連接的來源端口192.168.0.20

答案2

容器流量並非源自或終止於 Docker主持人因為它是從 Docker 路由到 Docker 的容器。主機本身充當路由器,並且沒有用於此流量的套接字(例外情況是docker-proxy處理NAT 髮夾當未使用 停用時--userland-proxy=false,在這種情況下 NAT 髮夾將透過以下命令完成iptablesroute_localnet)。

正如 Docker 所使用的iptables和 NAT,這一切都由 Netfilter 跟踪連線

若要查看追蹤的流量,請使用conntrack命令(conntrack如果需要,安裝包)。由於所有這些流量都經過 NAT,因此此命令將顯示所有相關流量:

conntrack -L --any-nat -d 192.168.0.20

它應該在位址為 192.168.0.10 的系統上運行,顯示從位址為 192.168.0.20 的系統看到的來源 NAT 流(容器作為客戶端)。

如果系統上位址為 192.168.0.20 的目標應用程式也在 Docker 容器中,則在該系統上執行相同的命令將顯示目標 NAT 流(容器作為伺服器)。如果沒有,則不會顯示任何內容,因為沒有可顯示的 NAT。

相關內容