Mạng Linux & Container/Module 2 — Container Networking: tổng quan
7/21
Bài 7 / 21~8 phútContainer NetworkingMiễn phí lượt xem

Module 2 — Container Networking: tổng quan

Ghép plumbing Linux thành mạng container: netns, veth, bridge from scratch, SNAT/DNAT, debug bằng nsenter/tcpdump. Prerequisite: Module 1.

TL;DR: Docker network không phải abstraction ma thuật — nó là script ghép bốn mảnh Module 1 trong network namespace: mỗi container một stack mạng riêng, nối host bằng veth pair, gom vào bridge (docker0), ra Internet qua SNAT/MASQUERADE, và publish port bằng DNAT. Module 2 dựng lại đúng pipeline đó from scratch (không cần Docker daemon), rồi luyện debug bằng nsenter, route/iptables trong netns, và tcpdump. Học xong bạn đọc được vì sao docker run -p hoạt động — và sửa khi không.

Vì sao module này tồn tại

Module 1 dạy bốn khối Lego trên host: stack, device ảo, bridge, netfilter. Production container hỏng ở chỗ khác: hai container "cùng network" nhưng không ping được; docker run -p 8080:80 mở port host mà packet không vào app; container curl được 1.1.1.1 từ host nhưng chính nó timeout.

CLI Docker che plumbing. docker network create chỉ là: tạo bridge → tạo netns → tạo veth pair → gắn một đầu vào netns, một đầu vào bridge → gán IP/route → chèn rule NAT. Không tự tay ghép một lần, mỗi lần debug bạn chỉ còn inspect + restart.

Module này không dạy Kubernetes Service hay CNI plugin (Module 3). Nó dạy ghép đủ một Docker-style bridge network bằng tay, rồi trace gói ra/vào và debug khi đứt ở giữa đường. Mọi pod network sau này chỉ là biến thể của cùng mô hình.

Đây là lộ trình ghép — đúng thứ tự bạn dựng lab và đúng thứ tự gói tin "chạm" khi container nói chuyện với thế giới:

flowchart LR
    N["1. Network namespace<br/>isolated stack"] --> V["2. veth pair<br/>cable 2 ends"]
    V --> L["3. Lab bridge<br/>docker0 from scratch"]
    L --> S["4. SNAT<br/>out to Internet"]
    S --> D["5. DNAT<br/>publish port"]
    D --> G["6. Debug<br/>nsenter / tcpdump"]

Sau module này bạn sẽ

  • Implement network namespace và nối chúng bằng veth pair có IP/route đúng.
  • Implement một Docker-style bridge network from scratch không cần Docker.
  • Trace đường gói container ra Internet (SNAT/MASQUERADE) và inbound publish port (DNAT).
  • Diagnose sự cố mạng container bằng nsenter, route/iptables trong netns và tcpdump.

Lộ trình module

Sáu bài concept + một mini-challenge xếp theo phụ thuộc kỹ thuật — mỗi bước dựng mảnh mà bước sau giả định bạn đã có:

  1. Network namespaces — vì sao container thấy mạng riêng — isolation layer. Mỗi netns có interface, route table, iptables ruleset riêng. ip netns add / exec là lệnh nền của mọi container network mode.

  2. Nối container bằng veth — ping qua 2 netns — "cáp ảo hai đầu": một đầu trong netns A, một đầu trong netns B (hoặc host). Gán IP, bật lo/veth, route đúng → ping hai chiều. Không veth = hai namespace cô lập tuyệt đối.

  3. Mini-challenge — dựng Docker bridge network from scratch — lab capstone module: bridge + nhiều netns + veth + IP/route, không Docker daemon. Đây là outcome "Implement Docker-style bridge" — bằng chứng bạn ghép được plumbing Module 1 trong namespace.

  4. Container ra Internet — SNAT và MASQUERADE — private IP container không route được trên Internet. Host rewrite source (POSTROUTING MASQUERADE/SNAT) + ip_forward. Trace gói từ netns → bridge → host NIC → reply về.

  5. Publish port — DNAT và docker -p — chiều ngược: client hit host:8080, kernel DNAT PREROUTING đẩy vào container:80. Map 1-1 với docker run -p — giờ bạn đọc rule thay vì tin CLI.

  6. Debug container networking — nsenter và tcpdump — khi đứt: vào đúng netns (nsenter/ip netns exec), kiểm route/iptables bên trong, bắt gói trên veth/bridge bằng tcpdump. Checklist triage production.

Bài tổng kết cuối module gom cheat sheet netns/veth/NAT, glossary, và self-assessment khớp bốn outcome trên — bookmark trước khi sang Kubernetes networking.

Yêu cầu trước khi bắt đầu

Kiến thức trong course:

  • Module 1 — Linux Network Internals — stack, veth/tun/tap, Linux bridge, iptables/netfilter. Module 2 giả định bạn đọc được ip link/bridge fdb/iptables -t nat -L và biết gói đi qua hook nào. Nếu còn mơ hồ bốn mảnh, quay lại Module 1 trước — lab mini-challenge sẽ rất nặng.

Môi trường thực hành (bắt buộc):

  • Linux (máy thật, VM, hoặc WSL2 với network namespace đầy đủ). macOS Docker Desktop không cho cùng view: netns/veth/bridge/iptables là kernel host Linux.
  • Quyền root hoặc sudo — tạo/xóa netns, veth, bridge, bật ip_forward, chèn rule NAT.
  • iproute2 (ip, ss, thường sẵn trên distro hiện đại) và iptables (hoặc iptables-nft compat). Lab ghi rõ lệnh; một số distro cần apt install iproute2 iptables / dnf install iproute iptables.
  • Terminal quen: copy command, đọc stderr, dọn lab (ip netns del, xóa bridge) để không để rác interface.

Docker daemon không bắt buộc cho phần lớn bài (mục tiêu là dựng không Docker). Có Docker hữu ích khi so sánh rule daemon chèn với rule bạn tự viết — không phải điều kiện vào module.

Time budget

BàiThời lượng
Tổng quan (bài này)~8 phút
Network namespaces~16 phút
Nối container bằng veth~16 phút
Mini-challenge bridge from scratch~40 phút
Container ra Internet (SNAT)~18 phút
Publish port (DNAT)~16 phút
Debug nsenter / tcpdump~18 phút
Tổng kết & cheat sheet~8 phút
Tổng module~2.5 giờ

Cách học module này hiệu quả

  • Chạy trên Linux có sudo, không chỉ đọc. Netns/veth/NAT chỉ "thấm" khi bạn thấy ip netns exec … ping fail rồi pass sau khi sửa route/rule.
  • Bám pipeline 6 bước. Gặp "container không ra net" → hỏi: netns còn iface up? veth còn pair? bridge port learned? SNAT/FORWARD? DNAT đúng port? — rồi mới tcpdump.
  • Dọn lab sau mỗi bài. Namespace và bridge sót sẽ đụng tên/IP bài sau. Cuối mỗi lab có cleanup; chạy hết trước khi sang bài mới.
  • Mini-challenge trước khi tin "đã hiểu Docker network". Nếu dựng bridge from scratch xong, docker network inspect chỉ còn là bản đồ bạn đã vẽ bằng tay.
  • Giữ terminal + watch -n1 ip -br a song song. Output sống trên máy bạn là bằng chứng, không phải screenshot bài.

Bài tiếp theo: Network namespaces — vì sao container thấy mạng riê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.

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

Network namespaces — vì sao container thấy mạng riêng