我发现很多工程师可能不知道 linux 并没有 local -> local 这条网络链路,当我们 curl localhost:8000 的时候本质是走了一次 outbound 链路,然后被 lo 导回来,变成一次 inbound 链路。

所以熟悉 nf 立刻就知道一个 curl localhost 会走哪些 chains 了:
1. outbound: OUTPUT + POSTROUTING
2. inbound: PREROUTING + INPUT

这就是为什么 “网上最容易找到的 iptables 各 table 各 chain 关系的图,怎么都像是画图的人根本不知道还可以同一台机器内 process -> process 一样,只画了 interface -> process, interface -> interface, process -> interface,导致看不出 process -> process 会经过哪些 chain”。

如果自己用过 AF_PACKET + SOCK_RAW 模拟 tcpdump 抓包,会发现 lo 上会抓到双重流量,这就是因为一次 egress 一次 ingress (tcpdump 本身处理得很好所以你看不到 lo 的双重流量)

如果用 pwru 也能看到 lo 上的 rx 路径的软中断,是一次完整的收包链路。

所以,local -> local 的流量,本质是一次 tx + 一次 rx。
 
 
Back to Top