使用Linux netfilter将源IP地址从struct iphdr*转换为字符串等效形式

12

我希望将使用netfilter捕获的数据包中的源IP和目标IP地址转换为char *。

在我的netfilter钩子函数中,我有:

sock_buff = skb; // argument 2 of hook function

// ip_header is struct iphdr*
ip_header = (struct iphdr *)skb_network_header(sock_buff);

// now how to convert ip_header->saddr & ip_header->daddr to char *
// ip_header->saddr & ip_header->daddr are of type __be32
感谢。

@ott-- 转换必须在内核模块中完成。我在linux/文件夹中找不到包含inet_ntoa()函数的头文件。但我在linux/inet.h中找到了in_aton(),它恰好相反,将char*转换为__be32。 - Jake
哎呀,内核出了问题。试试这行代码吧:printk("ip-address is " NIPQUAD_FMT "\n", NIPQUAD(ip_header->saddr));。我现在无法从这里访问我的Linux主机,所以我不知道这些宏的定义在哪里,并且这只适用于 IPv4。 - ott--
2个回答

25

内核的printf()函数族有专门用于IP地址的格式说明符(对于IPv4地址使用%pI4,对于IPv6地址使用%pI6)。

因此,对于IPv4,你可以使用以下方式:

char source[16];
snprintf(source, 16, "%pI4", &ip_header->saddr); // Mind the &!
或者写入动态分配的内存。
如果您只想打印调试输出,您还可以使用printk()。关于%p的许多其他功能,请参见此文档

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接