论坛徽章: 0
5 可用积分
我需要conntrack 和 NAT 目的端口是4 的 udp包裹
在 conntrack helper() 里我这样写的:
if ( ct- > status & IPS_NAT_MASK) {
printk( "going to ALG part after NAT\n" ) ;
ret = NF_QUEUE;
}
第一个query ( dport 4) 在 MASQUERADE之后通过 ret = NF_QUEUE进入用户层进行进一步处理.
然后在那我用ipq_set_verdict() 把verdict NF_ACCEPT 传回内核来让包裹通过NAT
但是当反方向的response回来之后,response并没有被标记成IP_CT_IS_REPLY而是变成了IP_CT_NEW
我觉得是query的nf_conntrack_tuple在NF_QUEUE之后丢失了
因为我试过只用MASQUERADE而不把query发到userspace做进一步修改, response就能被认成 IP_CT_IS_REPLY.
而如果我我发到了userspace,就算什么都不改用ipq_set_verdict简单的传一个NF_ACCPET回来,response都不能被正确识别
我在helper被调用的时候输出了nf_conntrack_tuple的内容
对于Query,
ctinfo = IP_CT_NEW;
the original tuple is:
10.21.22.21:4 -> 10.23.24.24:4 l3num:2 protonum:17
the reply tuple:
10.23.24.24:4 -> 10.22.23.22:4 l3num:2 protonum:17
10.21.22.21 是querying node, 10.22.23.22 是 NAT and 10.23.24.24 是 responding node.
对于 Response:
ctinfo = IP_CT_NEW(但应该是 IP_CT_IS_REPLY)
original tuple:
10.23.24.24:4 -> 10.22.23.22:4 l3num:2 protonum:17
reply tuple:
10.22.23.22:4 -> 10.23.24.24:4 l3num:2 protonum:17
有谁能帮帮我么
我来回答