- 论坛徽章:
- 0
|
看了下内核源码。
NAT注册了4个钩子,数据结构在nf_nat_ops中。
如果iptables配置了DNAT规则,则调用DNAT相关的target,就是ipt_dnat_reg(这个并不修改任何地址)。
如果配置了SNAT,则调用SNAT相关的target。
发送数据的时候,
是先修改目的地址--->路由--》发送出去。
接收数据包时,
IP层处理-》PRE_ROUTING->路由->LOCAL_IN->TCP层。
接收的时候,在PRE_ROUTING, LOCAL_IN都可以修改接收包的源地址。
PRE_ROUTING的处理函数是nf_nat_in:
LOCAL_IN的处理函数是nf_nat_fn;
而有如下的调用关系;
nf_nat_in(PRE_ROUTING)
|------nf_nat_fn(LOCAL_IN)
|------nf_nat_packet
|------manip_pkt(修改数据包!!)
所以,在路由前后都存在修改数据包地址的可能性。
至于什么场景下会在路由前,什么场景会在路由之后,就不得知了。
(以上只是个人揣测,自己还要继续看代码。)
回复 asweisun_shan
应答包的源地址修改是在conntrack_in的hook点进行的,而conntrack_in的hook点的操作 ...
瀚海书香 发表于 2011-09-19 16:37 ![]() |
|