Tổng kết module Linux Network Internals
Cheat sheet ip/iptables, glossary (sk_buff, veth, bridge, netfilter), self-assessment khớp 4 learning outcomes, và cầu sang container networking.
TL;DR: Module 1 dựng bốn mảnh plumbing kernel mà mọi mạng container đều ghép: (1) path gói qua stack (sk_buff, softirq, netfilter hooks), (2) device ảo (veth / tun / tap), (3) Linux bridge (switch L2, FDB, docker0), (4) iptables tables/chains trên đúng hook. Docker không phát minh mạng riêng — nó script bốn mảnh đó. Bookmark trang này: cheat sheet lệnh, glossary, và self-assessment trước khi sang netns + SNAT/DNAT ở Module 2.
Đã đi qua những gì
Bạn bắt đầu từ xương sống: gói vào host không “tới thẳng” process — NIC ring → softirq/NAPI → sk_buff → protocol + netfilter → socket receive buffer. Drop khi quá tải có thể ở ring, softnet backlog, rule netfilter, hoặc rcvbuf đầy — cùng một timeout app, bốn hướng fix khác nhau.
Tiếp theo là cổng vào stack: veth pair như cáp hai đầu (nền container), tun mang IP (L3) cho VPN process, tap mang Ethernet (L2) cho VM. Rồi bridge nối nhiều port (thường đầu host của veth) thành LAN ảo, học MAC qua FDB — đúng thứ Docker gọi bridge network. Cuối cùng iptables/netfilter: table filter/nat, chain PRE/INPUT/FORWARD/OUTPUT/POST, và rule Docker inject (DOCKER-USER, MASQUERADE) — nền đọc iptables -L trước khi đào SNAT/DNAT.
Bốn mảnh trên path gói (khái niệm):
flowchart LR
NIC["NIC / veth ring"] --> STK["Stack + sk_buff"]
STK --> DEV["Virtual devices"]
DEV --> BR["Bridge L2"]
BR --> NF["Netfilter<br/>filter + NAT"]
NF --> SOCK["Socket / egress"]🗺️ Cheat sheet
ip — link, addr, route, stats
| Việc | Lệnh |
|---|---|
| Liệt kê interface + state | ip link show |
| Stats RX/TX drop | ip -s link show / ip -s link show eth0 |
| Địa chỉ IP | ip addr show / ip -4 addr |
| Bảng route | ip route show |
| Tạo veth pair | sudo ip link add veth-a type veth peer name veth-b |
| Up / down | sudo ip link set veth-a up |
| Gán IP | sudo ip addr add 10.200.0.1/24 dev veth-a |
| Gắn vào bridge | sudo ip link set veth-h1 master br0 |
| Tạo bridge | sudo ip link add name br0 type bridge rồi ip link set br0 up |
| Xoá device (cắt pair) | sudo ip link del veth-a |
Quy tắc veth: luôn kiểm tra cả hai đầu UP và peer còn tồn tại trước khi đổ lỗi app/iptables.
Bridge — FDB
| Việc | Lệnh |
|---|---|
| Xem bảng MAC → port | bridge fdb show br br0 |
| Sau ping hai endpoint | Entry dynamic trỏ đúng port host-side |
Drop / socket (bài stack)
| Điểm nghi | Lệnh / nguồn |
|---|---|
| Ring / driver | ip -s link, ethtool -S (tuỳ driver) |
| Softirq backlog | /proc/net/softnet_stat |
| Socket queue | ss -tlnp / ss -tn — cột Recv-Q |
| Netfilter match | sudo iptables -L -n -v (cột pkts) |
iptables — tables & survey Docker
| Việc | Lệnh |
|---|---|
| filter (mặc định) + counter | sudo iptables -L -n -v |
| nat (MASQUERADE, publish) | sudo iptables -t nat -L -n -v |
| Policy / jump FORWARD | sudo iptables -S / iptables -L FORWARD -n -v |
| Chain user trước Docker | sudo iptables -L DOCKER-USER -n -v |
| Table | Việc chính | Chain hay gặp |
|---|---|---|
| filter | ACCEPT / DROP / REJECT | INPUT, FORWARD, OUTPUT |
| nat | DNAT / SNAT / MASQUERADE | PREROUTING, POSTROUTING |
| mangle | mark / modify (ít khi debug container đầu) | mọi hook chính |
| Chain | Gói nào | Container hay đụng |
|---|---|---|
| PREROUTING | Vào sớm, trước routing | DNAT publish port |
| INPUT | Terminate trên host | SSH/API host — không phải path container→WAN |
| FORWARD | Xuyên host | Container ↔ Internet / forward |
| OUTPUT | Sinh từ process host | Ít là path bridge cổ điển |
| POSTROUTING | Sắp ra device | MASQUERADE / SNAT |
flowchart LR
IN["Packet in"] --> PRE["PREROUTING"]
PRE --> RT{"Local or forward?"}
RT -->|"local"| INPUT["INPUT"]
RT -->|"forward"| FWD["FORWARD"]
INPUT --> LOCAL["Host process"]
FWD --> POST["POSTROUTING"]
APP["Host app send"] --> OUT["OUTPUT"]
OUT --> POSTHai câu tách lỗi ngay:
- Container ping peer cùng bridge ≈ path L2 (veth + FDB) — có thể không đi FORWARD L3.
- Container ra Internet ≈ filter FORWARD (+
DOCKER*) + nat POSTROUTING — đừng soi INPUT trước.
Bản đồ 4 mảnh ↔ Docker
| Mảnh M1 | Docker bridge mode “làm gì” |
|---|---|
| Stack + hooks | Gói vẫn softirq → sk_buff → netfilter |
| veth | eth0 trong container + peer host |
| Bridge | docker0 (hoặc bridge CNI) + MAC learning |
| iptables | Jump DOCKER-USER / DOCKER*, MASQUERADE, DNAT publish |
📖 Glossary module
| Thuật ngữ | Định nghĩa 1 câu |
|---|---|
sk_buff | Cấu trúc kernel bọc mỗi gói: metadata (device, protocol, header pointer) + trỏ payload. |
| Receive ring | Vùng DMA/driver nhận frame từ NIC trước khi softirq poll. |
| softirq / NAPI | Cơ chế kernel xử lý gói theo batch, tránh interrupt-per-packet. |
| Netfilter | Framework hook trên path IP trong kernel (chỗ DROP/NAT thật sự xảy ra). |
| iptables / nft | Frontend user-space gắn rule vào netfilter. |
| veth pair | Hai netdev kernel peer: TX một đầu = RX đầu kia (cáp L2 ảo). |
| tun | Device L3: user-space đọc/ghi IP packet (VPN điển hình). |
| tap | Device L2: user-space đọc/ghi Ethernet frame (VM / bridge lab). |
| Bridge | Switch L2 ảo trong kernel; nối nhiều port, học MAC. |
| FDB | Forwarding Database: bảng MAC → port của bridge. |
docker0 | Bridge mặc định Docker bridge network trên host. |
| PREROUTING | Chain/hook sớm: DNAT / publish port thường bám đây. |
| FORWARD | Chain cho gói xuyên host (container ↔ WAN). |
| POSTROUTING | Chain trước khi ra device: SNAT / MASQUERADE. |
| MASQUERADE | SNAT động theo IP egress — Docker hay dùng cho container ra ngoài. |
| DOCKER-USER | Chain filter Docker khuyến nghị để admin gắn policy trước rule Engine. |
| rcvbuf / Recv-Q | Buffer nhận socket; Recv-Q phình = app không đọc kịp (hoặc peer dồn). |
⚠️ Pitfall tổng hợp
- "Timeout app = mạng hỏng / chỉ cần soi iptables." Drop còn ở ring, softnet,
rcvbuf— cầnip -s link, softnet_stat,ss, và counter iptables. - "Chỉ
ip link setmột đầu veth." Pair có hai admin state; một đầuDOWN= traffic im dù IP “đẹp”. - "tun và tap thay nhau được." L3 vs L2 — bridge Ethernet cần tap/veth, VPN IP-only thường tun.
- "Gán IP lên port slave trên bridge." Endpoint/IP thường nằm đầu “máy”; port master
br0thường không cần IP (gateway gắn trên bridge device nếu cần). - "Container không ra net → chặn ở INPUT / UFW host." Path ra ngoài là FORWARD + nat POSTROUTING, không phải INPUT sshd.
- "Ping peer trên docker0 fail = iptables chắc chắn." Trước hết: cả hai veth UP, master bridge, FDB/ARP — L2 gãy trước khi kể FORWARD.
- "Docker có network stack riêng." Cùng softirq/
sk_buff/hooks; Docker chỉ tạo device, bridge, và inject rule.
✅ Self-assessment
Bạn đã đạt module này nếu trả lời được:
- Trace hành trình gói tin qua Linux network stack từ NIC interrupt tới application socket
- Nếu chưa: đọc lại 01 — Linux network stack, mục RX path,
sk_buff, netfilter hooks, và bảng drop.
- Nếu chưa: đọc lại 01 — Linux network stack, mục RX path,
- Explain virtual network devices (veth, tun/tap) và khi nào dùng từng loại
- Nếu chưa: đọc lại 02 — Virtual network devices, bảng container / VPN / VM và pitfall một đầu DOWN.
- Implement Linux bridge nối các network interface và quan sát MAC learning
- Nếu chưa: đọc lại 03 — Linux bridge, lab tạo
br0+ gắn veth, vàbridge fdb show.
- Nếu chưa: đọc lại 03 — Linux bridge, lab tạo
- Explain iptables tables/chains và cách Docker map rule vào netfilter hooks
- Nếu chưa: đọc lại 04 — iptables và netfilter, bản đồ PRE/INPUT/FORWARD/POST và survey chain
DOCKER*.
- Nếu chưa: đọc lại 04 — iptables và netfilter, bản đồ PRE/INPUT/FORWARD/POST và survey chain
Bài tiếp theo — Module 2
Bạn đã có bốn mảnh Lego. Module 2 ghép chúng trong network namespace: netns → veth nối container–host → bridge network tay → container ra Internet (SNAT) → publish port (DNAT) → debug.
Bắt đầu Module 2: Tổng quan — Container 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