Chinaunix
标题:
关于nat还原的问题
[打印本页]
作者:
firocu
时间:
2014-10-12 10:38
标题:
关于nat还原的问题
本帖最后由 firocu 于 2014-10-12 14:36 编辑
最简单的路由器 在postrouting 做了snat(masquade)那么回来的报文怎么unsnat呢?
我看了九贱的帖子,一笔带过了。 我不太懂的地方是在nat_packet这个函数里面在发现是rely的报文,要判断ct→status & IPS_DST_NAT 为真 才修改skb里的IP port,我不清楚reply的报文何时给ct→status打的DST_NAT的标记位,看代码好象是prerouting的ip_nat_setup_info这个函数,可是我看到必须改了ct的tuple才能给ct→status打标记位,反复的修改ct,我觉得自己想的不对。
================答案3.17的代码和原来没多大变化就是函数名字变了===========
发包-POSTROUTING ->SNAT ->修改ct: nf_nat_setup_info-> ct->status |= IPS_SRC_NAT;->修改skb:nf_nat_packet
收报-PREOUTING-> DNAT->修改skb:nf_nat_packet
{
enum nf_nat_manip_type mtype = HOOK2MANIP(hooknum); //因为是在PREROUTING, 所以是DNAT, 我以前一直以为, de-snat在postrouting中做的.
if (mtype == NF_NAT_MANIP_SRC)
statusbit = IPS_SRC_NAT;
else
statusbit = IPS_DST_NAT; //到这里
/* Invert if this is reply dir. */
if (dir == IP_CT_DIR_REPLY)
statusbit ^= IPS_NAT_MASK; //翻转一下变成SNAT
/* Non-atomic: these bits don't change. */
if (ct->status & statusbit) { //正好和发包是的 ct->status |= IPS_SRC_NAT;匹配了, 开始de-snat.
struct nf_conntrack_tuple target;
}
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2