- 论坛徽章:
- 0
|
5可用积分
本帖最后由 lujian19861986 于 2012-12-20 09:08 编辑
在 net/ipv4/netfilter/ 目录下找到ip_conntrack_core.c。
看netfilter架构图,在PREROUTING,会调用ip_conntrack_in(),
/* Allocate a new conntrack: we return -ENOMEM if classification
* failed due to stress. Otherwise it really is unclassifiable */
static struct ip_conntrack_tuple_hash *
init_conntrack(struct ip_conntrack_tuple *tuple,
struct ip_conntrack_protocol *protocol,
struct sk_buff *skb)
{
}
/* On success, returns conntrack ptr, sets skb->nfct and ctinfo */
static inline struct ip_conntrack *
resolve_normal_ct(struct sk_buff *skb,
struct ip_conntrack_protocol *proto,
int *set_reply,
unsigned int hooknum,
enum ip_conntrack_info *ctinfo)
{
struct ip_conntrack_tuple tuple;
struct ip_conntrack_tuple_hash *h;
struct ip_conntrack *ct;
IP_NF_ASSERT((skb->nh.iph->frag_off & htons(IP_OFFSET)) == 0);
if (!ip_ct_get_tuple(skb->nh.iph, skb, skb->nh.iph->ihl*4,
&tuple,proto))
return NULL;
/* look for tuple match */
h = ip_conntrack_find_get(&tuple, NULL);
if (!h) {
h = init_conntrack(&tuple, proto, skb);
if (!h)
return NULL;
if (IS_ERR(h))
return (void *)h;
}
ct = tuplehash_to_ctrack(h);
...
return ct;
}
/* Netfilter hook itself. */
unsigned int ip_conntrack_in(unsigned int hooknum,
struct sk_buff **pskb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
struct ip_conntrack *ct;
enum ip_conntrack_info ctinfo;
resolve_normal_ct()...
...
}
打印信息发现,每次访问www.baidu.com,每个包都进入ip_conntrack_in()。
总结下流程:ip_conntrack_in->resolve_normal_ct()-> init_conntrack()
总结
问题:
1. ip_conntrack_core.c中实现一个session初始化流程?
若是访问百度,发一个[SYN]包,就跑到init_conntrack打印信息,分配一个 conntrack 的空间,最终session建立起来的,在POSTROUTING才将这个conntrack接入连接跟踪全局链表中?服务器回应的[ACK,SYN],就不用分配了,直接可以找到此连接/* look for tuple match */
h = ip_conntrack_find_get(&tuple, NULL);//此时返回不为NULL
2. init_conntrack()具体作用是?return -ENOMEM用途是?
分配一个 conntrack 的空间,若想QQ(使用udp 8000等)无法登陆,可以代码识别skb的目的端口是不是QQ协议端口,提前return -ENOMEM。这样就session创建不起来了
|
最佳答案
查看完整内容
回复 2# lujian19861986 对于 TCP 报文来说,应该就是 RPEROUTING 处收到 SYN 包,就会分配一个 conntrack 的。-ENOMEM 说明是内存耗尽了。内存分配失败时,返回这个值。
|