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ệ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 |
flowchart LR
subgraph EGRESS["Egress"]
C1["Container"] --> BR1["Bridge"]
BR1 --> FW1["FORWARD"]
FW1 --> POST["POSTROUTING<br/>MASQUERADE"]
POST --> WAN["WAN"]
endflowchart LR
subgraph INGRESS["Publish port"]
CLI["Client"] --> HOST["Host:8080"]
HOST --> PRE["PREROUTING<br/>DNAT"]
PRE --> FW2["FORWARD"]
FW2 --> CTR["Container:80"]
endHai 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 đá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
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