Chinaunix

标题: 关于DNAT的接收处理 [打印本页]

作者: asweisun_shan    时间: 2011-09-19 11:36
标题: 关于DNAT的接收处理
有两台机器,一台机器的IP是A_ip,另一台是B_ip.

在A上配置了如下规则(没有配置SNAT规则):
iptables -t nat -A OUTPUT -d 10.6.0.0/16 -j DNAT
        --to-destination B_IP:100


现在A_IP发送到10.6.0.0的数据,会被转换成到B_ip:100.
并且接收到的应答应是到A_IP的。
这时就需要对接收到的包进行源地址转换,请问是在哪里进行转换的?

是路由之前,还是在路由之后?
谢谢。
作者: Godbach    时间: 2011-09-19 11:41
回复 1# asweisun_shan

这时就需要对接收到的包进行源地址转换,请问是在哪里进行转换的?

DNAT 是对包的目的地址进行转换
作者: Godbach    时间: 2011-09-19 11:42
本帖最后由 Godbach 于 2011-09-19 11:44 编辑

回复 1# asweisun_shan
DNAT 应该是在路由之前
作者: 瀚海书香    时间: 2011-09-19 16:37
回复 1# asweisun_shan
应答包的源地址修改是在conntrack_in的hook点进行的,而conntrack_in的hook点的操作是在PRE_ROUTING上完成的。
所以应答包的源地址修改是在路由之前完成的。
作者: asweisun_shan    时间: 2011-09-19 22:04
回复 4# 瀚海书香


非常谢谢。
能告诉我内核中处理的代码吗?

另外,NF_INET_PRE_ROUTING这个hook还会处理DNAT相关的内容吗?
我觉得只要iptables没有相应规则,则就不处理了。
作者: nu_teller    时间: 2011-09-19 22:55
回复 5# asweisun_shan

   2.6.20内核:
    nf_nat_rule.c ->  ipt_dnat_reg
就是在PREROUTING点上做的DNAT
作者: asweisun_shan    时间: 2011-09-23 22:50
看了下内核源码。
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

作者: xtx1188    时间: 2011-09-24 20:19
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2