- 論壇徽章:
- 8
|
本帖最后由 firocu 于 2014-10-12 14:36 編輯
最簡單的路由器 在postrouting 做了snat(masquade)那么回來的報文怎么unsnat呢?
我看了九賤的帖子,一筆帶過了。 我不太懂的地方是在nat_packet這個函數里面在發(fā)現是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的代碼和原來沒多大變化就是函數名字變了===========
發(fā)包-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) { //正好和發(fā)包是的 ct->status |= IPS_SRC_NAT;匹配了, 開始de-snat.
struct nf_conntrack_tuple target;
}
|
|