Netfilter 钩子看不到所有数据包
Netfilter hook doesn't see all packets
我写了一个内核模块,它使用 netfilter hook 来转储多播 DNS 数据包。
static uint32_t myhook(uint32_t hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn) (struct sk_buff *))
{
struct iphdr *ip_header;
uint8_t proto;
struct udphdr *udp_header;
unsigned int sip, dip, sport = 0, dport = 0;
if(!skb)
return NF_ACCEPT;
if(ntohs(skb->protocol) != ETH_P_IP)
return NF_ACCEPT;
ip_header = (struct iphdr *)skb_network_header(skb);
proto = ip_header->protocol;
if (proto != IPPROTO_UDP)
return NF_ACCEPT;
udp_header = (struct udphdr *)skb_transport_header(skb);
sip = (unsigned int)ntohl(ip_header->saddr);
dip = (unsigned int)ntohl(ip_header->daddr);
sport = (unsigned int)ntohs(udp_header->source);
dport = (unsigned int)ntohs(udp_header->dest);
if (dport == 5353)
pr_err("sip: %pI4h, sport: %u; dip: %pI4h, dport: %u\n", &sip, sport, &dip, dport);
return NF_ACCEPT;
}
/*
pre_routing_hook_ops.hooknum = NF_INET_PRE_ROUTING;
pre_routing_hook_ops.pf = PF_INET;
pre_routing_hook_ops.priority = NF_IP_PRI_FIRST;
pre_routing_hook_ops.hook = (nf_hookfn *) myhook;
*/
此内核模块不记录所有多播 dns 数据包的信息。但是,当我添加此 iptables
日志规则时:
iptables -t mangle -I PREROUTING 1 -j LOG --log-prefix="mylog" --log-level 4 --ipv4 -p udp --sport 5353
此 iptables
规则 sees/logs 所有多播 dns 数据包。我假设 iptables
也使用 netfilter 挂钩。我不知道为什么它看到所有 mdns 数据包而不是我的内核模块。任何想法为什么?提前致谢。
您的 iptables
规则正在检查 5353 的 source 端口,而您的 netfilter 代码正在检查 destination 端口5353。虽然大多数 mDNS 数据包的源端口和目标端口都为 5353,但这实际上并不是 RFC 6762 所要求的。
祝你好运!
我写了一个内核模块,它使用 netfilter hook 来转储多播 DNS 数据包。
static uint32_t myhook(uint32_t hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn) (struct sk_buff *))
{
struct iphdr *ip_header;
uint8_t proto;
struct udphdr *udp_header;
unsigned int sip, dip, sport = 0, dport = 0;
if(!skb)
return NF_ACCEPT;
if(ntohs(skb->protocol) != ETH_P_IP)
return NF_ACCEPT;
ip_header = (struct iphdr *)skb_network_header(skb);
proto = ip_header->protocol;
if (proto != IPPROTO_UDP)
return NF_ACCEPT;
udp_header = (struct udphdr *)skb_transport_header(skb);
sip = (unsigned int)ntohl(ip_header->saddr);
dip = (unsigned int)ntohl(ip_header->daddr);
sport = (unsigned int)ntohs(udp_header->source);
dport = (unsigned int)ntohs(udp_header->dest);
if (dport == 5353)
pr_err("sip: %pI4h, sport: %u; dip: %pI4h, dport: %u\n", &sip, sport, &dip, dport);
return NF_ACCEPT;
}
/*
pre_routing_hook_ops.hooknum = NF_INET_PRE_ROUTING;
pre_routing_hook_ops.pf = PF_INET;
pre_routing_hook_ops.priority = NF_IP_PRI_FIRST;
pre_routing_hook_ops.hook = (nf_hookfn *) myhook;
*/
此内核模块不记录所有多播 dns 数据包的信息。但是,当我添加此 iptables
日志规则时:
iptables -t mangle -I PREROUTING 1 -j LOG --log-prefix="mylog" --log-level 4 --ipv4 -p udp --sport 5353
此 iptables
规则 sees/logs 所有多播 dns 数据包。我假设 iptables
也使用 netfilter 挂钩。我不知道为什么它看到所有 mdns 数据包而不是我的内核模块。任何想法为什么?提前致谢。
您的 iptables
规则正在检查 5353 的 source 端口,而您的 netfilter 代码正在检查 destination 端口5353。虽然大多数 mDNS 数据包的源端口和目标端口都为 5353,但这实际上并不是 RFC 6762 所要求的。
祝你好运!