作者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