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):

🗺️ Cheat sheet
ip netns — tạo / vào / dọn
| Việc | Lệnh |
|---|---|
| List netns | ip netns list |
| Tạo | sudo ip netns add c1 |
| Chạy lệnh trong ns | sudo ip netns exec c1 CMD / ip -n c1 … |
| Identify netns của PID | ip netns identify PID |
| Xoá | sudo ip netns del c1 |
Trap: netns mới ≈ chỉ lo, và lo mặc định DOWN → sudo ip netns exec c1 ip link set lo up.
veth — nối hai netns (hoặc netns–host)
| Việc | Lệnh |
|---|---|
| Tạo pair | sudo ip link add veth-a type veth peer name veth-b |
| Move đầu vào netns | sudo ip link set veth-b netns c1 |
| Up + IP trong ns | ip 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ệc | Lệnh |
|---|---|
| Tạo + up bridge | sudo ip link add br0 type bridge rồi ip link set br0 up |
| Gán gateway trên bridge | sudo ip addr add 10.10.0.1/24 dev br0 |
| Gắn đầu host veth vào bridge | sudo ip link set veth-h1 master br0 |
| Port / FDB | bridge 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ệc | Lệnh / knob |
|---|---|
| Bật forward | sudo sysctl -w net.ipv4.ip_forward=1 |
| Survey filter FORWARD | sudo iptables -L FORWARD -n -v |
| Survey nat | sudo 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ều | Rewrite gì | Hook / chain hay gặp | Docker map |
|---|---|---|---|
| Egress (container → Internet) | Source | filter FORWARD + nat POSTROUTING | MASQUERADE subnet bridge |
| Ingress publish (client → host:port → app) | Destination | nat PREROUTING + filter FORWARD | docker run -p host:container |


Hai câu tách lỗi ngay:
- Ping peer cùng bridge OK, Internet fail → soi
ip_forward, FORWARD, POSTROUTING MASQUERADE — không soi INPUT host trước. - 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ệc | Lệnh |
|---|---|
| PID container (Docker) | docker inspect -f '{{.State.Pid}}' CTR |
| Join chỉ network ns | sudo nsenter -t PID -n CMD |
| Survey trong ns | nsenter -t PID -n ip -br a / ip route / ss -lntp |
| Xác nhận view ns | readlink /proc/self/ns/net (so host vs sau nsenter) |
| Capture eth trong ns | sudo nsenter -t PID -n tcpdump -ni eth0 … |
| Capture trên path host | tcpdump -ni veth-host hoặc br0 / eth0 |
Runbook L2 → L3 → NAT host → app (đừng nhảy thẳng iptables -L INPUT):
- L2: link UP, veth pair, master bridge, FDB/ARP sau traffic.
- L3: addr + route trong đúng netns.
- NAT/filter host (nếu path ra/vào WAN/publish):
ip_forward, FORWARD, nat PRE/POST. - App:
ss -lntptrong 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 netns | Frontend iproute2 tạo/list/exec/delete named netns. |
lo trong netns mới | Loopback thường có sẵn nhưng DOWN — phải up trước khi dùng 127.0.0.1. |
| veth pair | Hai 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 bridge | IP L3 trên device bridge (vd 10.10.0.1/24) — default route container trỏ về đây. |
ip_forward | Sysctl cho host forward gói giữa iface (router-on-a-host). |
| SNAT | Rewrite source IP (thường POSTROUTING) khi egress. |
| MASQUERADE | SNAT động theo IP iface egress — Docker hay dùng cho subnet bridge. |
| DNAT | Rewrite destination (thường PREROUTING) — nền docker -p. |
| conntrack | Kernel nhớ mapping NAT để reply reverse đúng. |
| FORWARD | Chain filter cho gói xuyên host (container ↔ WAN / publish path). |
nsenter -n | Join network namespace của PID target (production: PID từ docker inspect). |
tcpdump đúng điểm | Capture 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.1không chung. - "Quên
loup 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.1chỉ 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:
- Implement network namespace và nối chúng bằng veth pair có IP/route đúng
- Nếu chưa: đọc lại 01 — Network namespaces + 02 — Nối container bằng veth; lab
ip netns add/exec, uplo, move veth, ping hai chiều.
- Nếu chưa: đọc lại 01 — Network namespaces + 02 — Nối container bằng veth; lab
- Implement một Docker-style bridge network from scratch không cần Docker
- Nếu chưa: làm lại 03 — Mini-challenge bridge from scratch: 2 netns + bridge + veth + IP cùng subnet + gateway trên bridge → ping chéo.
- Trace đường gói container ra Internet (SNAT/MASQUERADE) và inbound publish port (DNAT)
- Nếu chưa: 04 — SNAT/MASQUERADE (forward + POSTROUTING) và 05 — DNAT publish (PREROUTING +
docker -p).
- Nếu chưa: 04 — SNAT/MASQUERADE (forward + POSTROUTING) và 05 — DNAT publish (PREROUTING +
- Diagnose sự cố mạng container bằng nsenter, route/iptables trong netns và tcpdump
- Nếu chưa: 06 — Debug nsenter / tcpdump; runbook L2→L3→NAT→app, capture đúng điểm.
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 có giúp bạn hiểu bản chất không?
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.
Debug container networking — nsenter và tcpdump
Bài tiếp Kubernetes Networking (nhập môn)Module 3 — Kubernetes Networking: tổng quan
Thảo luận & góp ý
Hỏi đáp về bài này