我有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 髮夾將透過以下命令完成iptables和route_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。