<aside>
💡
如果主機有安裝docker容器, 請解釋一下網路資料的流動優先次序
</aside>
當主機安裝 Docker 容器時,Linux 核心(Kernel)會透過 iptables / nftables 路由與過濾鏈(Chains) 來決定網路資料的流動與優先次序。 [1, 2]
核心結論:Docker 網路鏈具有最高優先權
Docker 啟動時會在主機的防火牆中插入專屬的過濾規則。這些規則的執行順序是**「Docker 內部規則」優先於「主機傳統防火牆(如 UFW、Firewalld)的自訂規則」**。 [1, 2]
1. 外部進入主機的資料流優先次序 (Inbound)
當外部封包(例如瀏覽器請求)送達主機的實體網卡時,Linux 核心會依序經過以下四道關卡: [1]
- PREROUTING 鏈:封包進來的第一站。Docker 會在此處將主機 Port(如 8080)轉換為容器內部 Port(如 80),進行 DNAT(目的地位址轉譯)。 [2]
- DOCKER 鏈:Docker 專屬的防火牆核心。此處會優先檢查該 Port 是否有綁定容器。如果有,封包會被直接放行(ACCEPT)並導向容器。 [1]
- DOCKER-USER 鏈:這是 Docker 預留給管理員的自訂關卡。如果你有寫規則,它會在 DOCKER 鏈之前或之中被觸發,是用來「攔截或封鎖」特定外部 IP 存取容器的唯一正確位置。
- FORWARD 鏈(傳統防火牆):如果封包通過了 DOCKER 鏈,它就會繞過主機一般的
INPUT 鏈,直接透過 FORWARD 轉發到 docker0 虛擬網卡,最後送進容器。 [1, 3]
⚠️ 常見地雷:因為 Docker 規則優先權極高,如果你在主機用 UFW 或 Firewalld 設定「封鎖所有人存取 8080 埠」,通常會無效,外部依然能連進容器。
2. 容器主動外出的資料流優先次序 (Outbound)
當容器內的程式需要連到網際網路(例如下載套件或呼叫外部 API)時,資料流向如下: [1]
- 容器內 eth0:封包從容器內部的虛擬網卡發出。
- veth pair 隧道:透過成對的虛擬線路,瞬間傳遞到主機端的接口。
- docker0 網橋:抵達主機的軟體交換機(Bridge)。
- POSTROUTING 鏈 (SNAT):主機核心將封包的來源 IP(例如
172.17.0.2)偽裝(Masquerade)成主機的實體公網 IP,然後由實體網卡發送出去。 [1, 2, 3]