为什么MASQUERADE都在POSTROUTING做
MASQUERADE都在POSTROUTING做,为什么不能在output做
1、iptables flow graph:
2、output之后的routing和rerouting:
对于本机 app 发出(outcoming)的流量,netfilter 有2次 routing 过程,称为 routing 和 (re)routing。在routing的过程中,内核会为数据包指定source ip
流转如下:routing —> output —> rerouting
-
OUTPUT 链在 第一次 routing 之后:
对于本机 app 发出的流量,第一次 routing 除了确定下一跳之外,对于没有指定源IP的数据包,还将会为其选择源IP地址。当数据包经过了iptables OUTPUT链,某条rule为其打上了fwmark或者改变了其目标地址后,由于数据包属性已经改变,需要第二次路由,即 (re)routing。 -
OUTPUT 链之后的 rerouting :
Linux内核协议栈在实现第一次路由和第二次路由时,其逻辑是一样的。但请注意由于第一次路由时会为skb选择source地址,那么第二次路由时的命中路由条目的source属性将永远不会生效,所以多个网口设备策略路由时常常需要用 MASQUERADE 重写 outcoming 数据包的 src IP 以保证正确,这是一种 workaround。
3、分析总结:
当流量从output发出后,先是经过routing,根据目的ip选择从哪块网卡发出,然后决定源ip,此时你做snat后,需要经过rerouting,因为如果你目的ip变了,那么源ip要重新决定,但是如果你目的ip没变,变了源ip,那么待会rerouting的时候又是根据目的ip来决定你的源ip,此时又变成原来的那个源ip,你的snat改写没有生效