- static unsigned int
-
ipt_snat_target(struct sk_buff *skb, const struct xt_action_param *par)
-
{
-
struct nf_conn *ct;
-
enum ip_conntrack_info ctinfo;
-
const struct nf_nat_multi_range_compat *mr = par->targinfo;
/* SNAT只能应用于POST_ROUTING和LOCAL IN */
-
NF_CT_ASSERT(par->hooknum == NF_INET_POST_ROUTING ||
-
par->hooknum == NF_INET_LOCAL_IN);
/*
得到conn track的信息,conn track为netfilter的一个基础。留在以后学习。
目前我们只需要知道netfilter保存了数据包的连接信息。
*/
-
ct = nf_ct_get(skb, &ctinfo);
-
-
/* Connection must be valid and new. */
- /*
- 这里对conn进行了验证。
- 要做SNAT,必须是新建的连接——很明显的道理。
- 但是有的7层应用,可能需要多条相关的conn,这时就需要IP_CT_RELATED。
- */
-
NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED ||
-
ctinfo == IP_CT_RELATED IP_CT_IS_REPLY));
-
NF_CT_ASSERT(par->out != NULL);
-
-
return nf_nat_setup_info(ct, &mr->range[0], IP_NAT_MANIP_SRC);
-
}