数据包通过iptables chains的流程可以参考这里,解释的很详细。流程概述: Receive:
某个interface收到数据包 -> PREROUTING (manage, nat) -> route -> 是发送给本机的数据包? -> INPUT (manage, filter) -> app 不是 -> FORWARD (manage, filter) -> POSTROUTING (manage, nat) -> 某个interface发出
Send:
app发送数据包 -> route -> OUTPUT (manage, nat, filter) -> POSTROUTING (manage, nat) -> 某个interface发出
* Receive时判断是否是发送给本机的数据包的方法是:收到数据包的destination IP是否与本机某个interface的IP相同。
* Send的OUTPUT chain除了manage和filter以外nat表也有。nat的OUTPUT位于filter的之前,用于对从本机(app)发出的(而不是收到并FORWARD的)请求做DNAT或REDIRECT。
* Send的route阶段确定了数据包的source ip和source port。source ip和source port由app发送数据包时决定。如果app没有bind某个interface并且没有设置source ip/port,则source ip时为route使用的interface ip。
* filter表的INPUT, OUTPUT和FORWARD用来过滤数据包 -j ACCEPT /DROP
* nat表的PREROUTING用来DNAT(或REDIRECT), POSTROUTING用来SNAT(或MASQUERADE)
* FORWARD (以及所有forward之后的chain)需要net.ipv4.ip_forward=1
from https://oogami.name/991/
0 条评论。