Mạng Linux & Container/Tổng kết module Linux Network Internals
6/21
Bài 6 / 21~8 phútLinux Network InternalsMiễn phí lượt xem

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

ViệcLệnh
Liệt kê interface + stateip link show
Stats RX/TX dropip -s link show / ip -s link show eth0
Địa chỉ IPip addr show / ip -4 addr
Bảng routeip route show
Tạo veth pairsudo ip link add veth-a type veth peer name veth-b
Up / downsudo ip link set veth-a up
Gán IPsudo ip addr add 10.200.0.1/24 dev veth-a
Gắn vào bridgesudo ip link set veth-h1 master br0
Tạo bridgesudo 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ệcLệnh
Xem bảng MAC → portbridge fdb show br br0
Sau ping hai endpointEntry dynamic trỏ đúng port host-side

Drop / socket (bài stack)

Điểm nghiLệnh / nguồn
Ring / driverip -s link, ethtool -S (tuỳ driver)
Softirq backlog/proc/net/softnet_stat
Socket queuess -tlnp / ss -tn — cột Recv-Q
Netfilter matchsudo iptables -L -n -v (cột pkts)

iptables — tables & survey Docker

ViệcLệnh
filter (mặc định) + countersudo iptables -L -n -v
nat (MASQUERADE, publish)sudo iptables -t nat -L -n -v
Policy / jump FORWARDsudo iptables -S / iptables -L FORWARD -n -v
Chain user trước Dockersudo iptables -L DOCKER-USER -n -v
TableViệc chínhChain hay gặp
filterACCEPT / DROP / REJECTINPUT, FORWARD, OUTPUT
natDNAT / SNAT / MASQUERADEPREROUTING, POSTROUTING
manglemark / modify (ít khi debug container đầu)mọi hook chính
ChainGói nàoContainer hay đụng
PREROUTINGVào sớm, trước routingDNAT publish port
INPUTTerminate trên hostSSH/API host — không phải path container→WAN
FORWARDXuyên hostContainer ↔ Internet / forward
OUTPUTSinh từ process hostÍt là path bridge cổ điển
POSTROUTINGSắp ra deviceMASQUERADE / 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 --> POST

Hai câu tách lỗi ngay:

  1. Container ping peer cùng bridge ≈ path L2 (veth + FDB) — có thể không đi FORWARD L3.
  2. Container ra Internetfilter FORWARD (+ DOCKER*) + nat POSTROUTING — đừng soi INPUT trước.

Bản đồ 4 mảnh ↔ Docker

Mảnh M1Docker bridge mode “làm gì”
Stack + hooksGói vẫn softirq → sk_buff → netfilter
vetheth0 trong container + peer host
Bridgedocker0 (hoặc bridge CNI) + MAC learning
iptablesJump DOCKER-USER / DOCKER*, MASQUERADE, DNAT publish

📖 Glossary module

Thuật ngữĐịnh nghĩa 1 câu
sk_buffCấu trúc kernel bọc mỗi gói: metadata (device, protocol, header pointer) + trỏ payload.
Receive ringVùng DMA/driver nhận frame từ NIC trước khi softirq poll.
softirq / NAPICơ chế kernel xử lý gói theo batch, tránh interrupt-per-packet.
NetfilterFramework hook trên path IP trong kernel (chỗ DROP/NAT thật sự xảy ra).
iptables / nftFrontend user-space gắn rule vào netfilter.
veth pairHai netdev kernel peer: TX một đầu = RX đầu kia (cáp L2 ảo).
tunDevice L3: user-space đọc/ghi IP packet (VPN điển hình).
tapDevice L2: user-space đọc/ghi Ethernet frame (VM / bridge lab).
BridgeSwitch L2 ảo trong kernel; nối nhiều port, học MAC.
FDBForwarding Database: bảng MAC → port của bridge.
docker0Bridge mặc định Docker bridge network trên host.
PREROUTINGChain/hook sớm: DNAT / publish port thường bám đây.
FORWARDChain cho gói xuyên host (container ↔ WAN).
POSTROUTINGChain trước khi ra device: SNAT / MASQUERADE.
MASQUERADESNAT động theo IP egress — Docker hay dùng cho container ra ngoài.
DOCKER-USERChain filter Docker khuyến nghị để admin gắn policy trước rule Engine.
rcvbuf / Recv-QBuffer 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ần ip -s link, softnet_stat, ss, counter iptables.
  • "Chỉ ip link set một đầu veth." Pair có hai admin state; một đầu DOWN = 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 br0 thườ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
  • Explain virtual network devices (veth, tun/tap) và khi nào dùng từng loại
  • 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.
  • Explain iptables tables/chains và cách Docker map rule vào netfilter hooks

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

Đặ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

Module 2 — Container Networking: tổng quan