Mạng Linux & Container/Tổng kết module Container Networking
14/21
Bài 14 / 21~8 phútContainer NetworkingMiễn phí lượt xem

Tổng kết module Container Networking

Cheat sheet ip netns/veth/bridge/NAT, bản đồ namespace → Internet, self-assessment 4 outcomes, cầu sang Kubernetes networking.

TL;DR: Module 2 ghép plumbing Linux thành mạng container: network namespace (stack riêng) → veth (cáp hai đầu) → bridge (LAN ảo kiểu docker0) → SNAT/MASQUERADE (ra Internet) → DNAT (publish port) → debug bằng nsenter/tcpdump đúng view. Docker không viết stack TCP mới — nó script các bước đó. Bookmark trang này: cheat sheet lệnh, map netns→NAT, glossary, self-assessment trước khi sang Module 3 (pod = netns, Service = DNAT scale).

Đã đi qua những gì

Bạn bắt đầu từ isolation: mỗi container bridge mode cổ điển là một netns — iface, route, iptables, socket riêng; 127.0.0.1 host ≠ 127.0.0.1 container. Netns mới thường chỉ có lo DOWN — quên ip link set lo up là trap đầu tiên.

Tiếp theo cáp: veth pair nối hai netns (hoặc netns–host); cả hai đầu UP, IP/route khớp → ping. Mini-challenge ghép netns + veth + bridge + gateway trên bridge — đúng mô hình docker0 không cần Docker daemon, chưa cần SNAT/DNAT.

Rồi hai chiều NAT: egress = ip_forward + filter FORWARD + nat POSTROUTING (MASQUERADE/SNAT); inbound publish = DNAT PREROUTING + FORWARD vào container — map 1-1 với docker run -p. Cuối cùng debug: vào đúng netns (nsenter -t <pid> -n / ip netns exec), survey L2→L3→NAT host→app, tcpdump đúng điểm trên path.

Bản đồ ghép (khái niệm):

flowchart LR
    NS["1. Network namespace<br/>isolated stack"] --> VETH["2. veth pair<br/>cable 2 ends"]
    VETH --> BR["3. Bridge<br/>docker0-style LAN"]
    BR --> SNAT["4. SNAT / MASQUERADE<br/>egress"]
    SNAT --> DNAT["5. DNAT<br/>publish port"]
    DNAT --> DBG["6. Debug<br/>nsenter / tcpdump"]

🗺️ Cheat sheet

ip netns — tạo / vào / dọn

ViệcLệnh
List netnsip netns list
Tạosudo ip netns add c1
Chạy lệnh trong nssudo ip netns exec c1 CMD / ip -n c1 …
Identify netns của PIDip netns identify PID
Xoásudo ip netns del c1

Trap: netns mới ≈ chỉ lo, và lo mặc định DOWNsudo ip netns exec c1 ip link set lo up.

veth — nối hai netns (hoặc netns–host)

ViệcLệnh
Tạo pairsudo ip link add veth-a type veth peer name veth-b
Move đầu vào netnssudo ip link set veth-b netns c1
Up + IP trong nsip netns exec c1 ip link set veth-b up rồi ip addr add …
Route default (qua GW bridge)ip netns exec c1 ip route add default via 10.10.0.1
Xoá (cắt cả pair)sudo ip link del veth-a

Quy tắc: luôn kiểm cả hai đầu UP và peer còn tồn tại trước khi đổ lỗi iptables/app.

Bridge — Docker-style LAN (lab mini-challenge)

ViệcLệnh
Tạo + up bridgesudo ip link add br0 type bridge rồi ip link set br0 up
Gán gateway trên bridgesudo ip addr add 10.10.0.1/24 dev br0
Gắn đầu host veth vào bridgesudo ip link set veth-h1 master br0
Port / FDBbridge link / bridge fdb show br br0
Ping chéo hai “container”ip netns exec c1 ping -c1 10.10.0.11

Acceptance LAN bridge: ping c1↔c2 không cần SNAT/DNAT/ip_forward ra WAN — path L2/L3 nội bridge.

NAT — SNAT egress + DNAT publish

ViệcLệnh / knob
Bật forwardsudo sysctl -w net.ipv4.ip_forward=1
Survey filter FORWARDsudo iptables -L FORWARD -n -v
Survey natsudo iptables -t nat -L -n -v
MASQUERADE egress (POSTROUTING)sudo iptables -t nat -A POSTROUTING -s 10.10.0.0/24 ! -o br0 -j MASQUERADE
SNAT tĩnh (khi IP egress cố định)… -j SNAT --to-source PUBLIC_IP
DNAT publish (PREROUTING)sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.10.0.10:80
Cho path forward (khi policy DROP)rule FORWARD ACCEPT theo iface/subnet lab
ChiềuRewrite gìHook / chain hay gặpDocker map
Egress (container → Internet)Sourcefilter FORWARD + nat POSTROUTINGMASQUERADE subnet bridge
Ingress publish (client → host:port → app)Destinationnat PREROUTING + filter FORWARDdocker run -p host:container
flowchart LR
    subgraph EGRESS["Egress"]
        C1["Container"] --> BR1["Bridge"]
        BR1 --> FW1["FORWARD"]
        FW1 --> POST["POSTROUTING<br/>MASQUERADE"]
        POST --> WAN["WAN"]
    end
flowchart LR
    subgraph INGRESS["Publish port"]
        CLI["Client"] --> HOST["Host:8080"]
        HOST --> PRE["PREROUTING<br/>DNAT"]
        PRE --> FW2["FORWARD"]
        FW2 --> CTR["Container:80"]
    end

Hai câu tách lỗi ngay:

  1. Ping peer cùng bridge OK, Internet fail → soi ip_forward, FORWARD, POSTROUTING MASQUERADE — không soi INPUT host trước.
  2. DNAT counter tăng nhưng app im → thường FORWARD DROP hoặc app không listen trong netns (sai view ss).

Debug — nsenter / tcpdump / runbook

ViệcLệnh
PID container (Docker)docker inspect -f '{{.State.Pid}}' CTR
Join chỉ network nssudo nsenter -t PID -n CMD
Survey trong nsnsenter -t PID -n ip -br a / ip route / ss -lntp
Xác nhận view nsreadlink /proc/self/ns/net (so host vs sau nsenter)
Capture eth trong nssudo nsenter -t PID -n tcpdump -ni eth0 …
Capture trên path hosttcpdump -ni veth-host hoặc br0 / eth0

Runbook L2 → L3 → NAT host → app (đừng nhảy thẳng iptables -L INPUT):

  1. L2: link UP, veth pair, master bridge, FDB/ARP sau traffic.
  2. L3: addr + route trong đúng netns.
  3. NAT/filter host (nếu path ra/vào WAN/publish): ip_forward, FORWARD, nat PRE/POST.
  4. App: ss -lntp trong ns (TCP); ICMP không cần listen.

📖 Glossary module

Thuật ngữĐịnh nghĩa 1 câu
Network namespace (netns)Partition kernel: stack mạng riêng (iface, route, iptables/nft, socket) cho process.
ip netnsFrontend iproute2 tạo/list/exec/delete named netns.
lo trong netns mớiLoopback thường có sẵn nhưng DOWN — phải up trước khi dùng 127.0.0.1.
veth pairHai netdev peer: TX một đầu = RX đầu kia; “cáp” xuyên netns.
Bridge (br0 / docker0)Switch L2 ảo; gom đầu host của veth thành LAN container.
Gateway trên bridgeIP L3 trên device bridge (vd 10.10.0.1/24) — default route container trỏ về đây.
ip_forwardSysctl cho host forward gói giữa iface (router-on-a-host).
SNATRewrite source IP (thường POSTROUTING) khi egress.
MASQUERADESNAT động theo IP iface egress — Docker hay dùng cho subnet bridge.
DNATRewrite destination (thường PREROUTING) — nền docker -p.
conntrackKernel nhớ mapping NAT để reply reverse đúng.
FORWARDChain filter cho gói xuyên host (container ↔ WAN / publish path).
nsenter -nJoin network namespace của PID target (production: PID từ docker inspect).
tcpdump đúng điểmCapture eth-in-ns / veth-host / bridge / WAN theo giả thuyết tầng.

⚠️ Pitfall tổng hợp

  • "ss / curl localhost trên host = app container." Sai netns — 127.0.0.1 không chung.
  • "Quên lo up trong netns mới." Loopback fail dù “đã có lo”.
  • "Chỉ up một đầu veth." Peer DOWN = im lặng; luôn kiểm cả pair.
  • "Ping bridge fail → thêm MASQUERADE ngay." LAN bridge trước hết là L2/L3; NAT cho path ra ngoài/publish.
  • "Container không ra net → soi INPUT / UFW host." Path egress = FORWARD + POSTROUTING, không phải INPUT sshd.
  • "Có DNAT là publish xong." Còn FORWARD + app listen đúng port trong container; bind publish 127.0.0.1 chỉ local host.
  • "Debug bằng restart Docker / flush nat." Vào đúng ns, layer-by-layer, tcpdump; flush nat phá production và thường sai tầng.
  • "macOS Docker Desktop = cùng view ip netns." Lab netns/veth/bridge/iptables cần Linux kernel (VM/WSL2 đủ netns).

✅ Self-assessment

Bạn đã đạt module này nếu trả lời được:

Bài tiếp theo — Module 3

Bạn đã tự tay dựng mô hình Docker bridge + NAT. Module 3 scale cùng plumbing lên cluster: pod ≈ netns (+ shared netns multi-container), CNI script veth/bridge/route thay daemon Docker, Service / kube-proxy = DNAT (và biến thể) ở quy mô nhiều node, Ingress L7, NetworkPolicy filter theo identity.

Bắt đầu Module 3: Tổng quan — Kubernetes Networking

Bài này đáng gửi cho bạn học cùng?

Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.

Bài này có giúp bạn hiểu bản chất không?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên

Bài tiếp theo

Module 3 — Kubernetes Networking: tổng quan