Mạng Linux & Container
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):

6 bước ghép nền tảng Container Networking từ Namespace đến Debug

🗺️ 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 DOWN → sudo 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

Tóm tắt luồng Egress SNAT qua Bridge, FORWARD và MASQUERADE

Tóm tắt luồng Inbound Publish Port DNAT qua PREROUTING và FORWARD

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 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.

Thảo luận & góp ý

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

Bài tiếp theo

Module 3 — Kubernetes Networking: tổng quan