我正在使用netfilter的钩子编写一些内核模块。钩子函数:
uint main_hook(uint hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *) )
{
struct iphdr *ip;
struct udphdr *udp;
if (skb->protocol == htons(ETH_P_IP)){
ip = (struct iphdr *)skb->data;//skb_network_header(skb);
if (ip->version == 4 && ip->protocol == IPPROTO_UDP){
udp = (struct udphdr *)(skb->data + sizeof(struct iphdr));
printk("[udp-catch] packet from %d to %d\n", ntohs(udp->source), ntohs(udp->dest));
return NF_QUEUE;
}
}
return NF_ACCEPT;
}
我可以指定一些队列吗?如果没有,那我怎么能找到这个号码呢?
答案 0 :(得分:1)
来自libnetfilter_queue网页的功能文档:
创建队列时,num的默认值为0。
如果你在同一台机器上运行两个队列,比如一个队列发送IP数据包而另一个队列接收,你需要创建两个不同号码的队列:
发送强>
qh = nfq_create_queue(h, 0, &cb, NULL);
<强>得到:强>
qh = nfq_create_queue(h, 1, &cb, NULL);
要正确过滤IP表,您应指定netfilter队列号:
<强>发件人:强>
sudo iptables -A OUTPUT -p all -d <dest ip> -j NFQUEUE --queue-num 0
<强>接收器:强>
sudo iptables -A INPUT -p all -s <src ip> -d <dest ip> -j NFQUEUE --queue-num 1
您还可以查看iptables手册并搜索NFQUEUE。
希望这有所帮助。