作者jasonkey123 (jasonkey123)
看板LinuxDev
标题[问题] netfilter修改目的ip位址问题.
时间Sun Mar 16 02:29:38 2014
linux kernel:2.6.32
问题:自己做简单的kernel module,想把目的地的ip位址重导向(单纯想练习)
linux pc eth ip: 192.168.1.130
client eth ip: 192.168.1.3
如client ping 192.168.1.130则导向 192.168.1.2
这个module hook在NF_INET_PRE_ROUTING
以下为重导向的程式码
static unsigned int myfunc(unsigned int hook,
struct sk_buff **pskb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *)){
struct nf_nat_range range = {
.flags = IP_NAT_RANGE_MAP_IPS | IP_NAT_RANGE_PROTO_SPECIFIED,
.min_ip = in_aton("192.168.1.2"),
.max_ip = in_aton("192.168.1.2"),
};
struct iphdr *iph = ip_hdr(pskb);
if( iph->saddr ==in_aton("192.168.1.3")) {
if(iph->protocol == IPPROTO_ICMP){
struct nf_conn *ct;
enum ip_conntrack_info ctinfo;
ct = nf_ct_get((pskb), &ctinfo);
if(!ct){
printk("ct is null\n");
return NF_ACCEPT;
}
if ( test_bit(IPS_DST_NAT_DONE_BIT, &(ct->status)) ){
printk("IPS_DST_NAT_DONE_BIT is set\n");
return NF_ACCEPT;
}
printk("nf_nat_setup_info\n");
return nf_nat_setup_info(ct, &range, hook);
}
}
}//end myfunc()
hook函式为myfunc()
hook在NF_INET_PRE_ROUTING
但是实测结果却ping不通,cat /proc/net/ip_conntrack 的结果也有问题.
错误的结果如下
icmp 1 22
src=192.168.1.3 dst=192.168.1.130 type=8 code=0 id=512 packets=1 bytes=60
[UNREPLIED]
src=192.168.1.130 dst=192.168.1.2 type=0 code=0 id=0 packets=0 bytes=0
mark=0 secmark=0 use=2
但如果移除此module,
iptables -t nat -A PREROUTING -i eth2 -d 192.168.1.130 -j DNAT
--to-destination 192.168.1.2
这样测试,就很正常,结果也符合预期
cat /proc/net/ip_conntrack 结果正常,如下,封包有redirect到192.168.1.2
icmp 1 29
src=192.168.1.3 dst=192.168.1.130 type=8 code=0 id=512 packets=8 bytes=480
src=192.168.1.2 dst=192.168.1.3 type=0 code=0 id=512 packets=7 bytes=420
mark=0 secmark=0 use=2
请问是module里漏掉了什麽处理吗?
※ 编辑: jasonkey123 来自: 114.33.12.243 (03/16 02:36)
1F:推 cobrasgo:printk里的东西有印出来吗? 03/16 17:44
2F:→ jasonkey123:这行有印出 printk("nf_nat_setup_info\n"); 03/16 19:54
3F:推 cobrasgo:你要不要把else也加上去,看实际上跑到哪了? 03/17 00:06
4F:→ jasonkey123:return nf_nat_setup_info() 确定有跑到这行. 03/17 00:55
5F:推 yvb:看你的ip_conntrack, src=192.168.1.3 <=> dst=192.168.1.2 03/17 18:53
6F:→ yvb:但 DNAT 的则是 dst=192.168.1.130 <=> src=192.168.1.2 03/17 18:53
7F:→ yvb:至於code的部分, return nf_nat_setup_info(...) hook 是 ?? 03/17 18:55
8F:→ yvb:nf_nat_setup_info() 第三个参数是 maniptype, hook 是什麽? 03/17 18:57
※ 编辑: jasonkey123 来自: 220.133.3.213 (03/17 21:36)
9F:→ jasonkey123:感谢yvb大,原来是maniptype填错.现在已经解决. 03/17 21:50