0

同胞编码员。我正在使用 libnetfilter_queue 模块和 iptables 规则 ipatbles -I OUTPUT 1 -p all -j NFQUEUE --queue-num 11220 监控我的传出流量

一个名为 Jitsi(在 Java 上运行)的应用程序表现出一种以前从未遇到过的奇怪行为:我处理 NFQUEUE 数据包的监控程序清楚地表明正在发送 UDP 数据包,但是当我查看时:“/ proc/net/udp”和“/proc/net/udp6”它们是空的,而且“/proc/net/protocols”有一个用于UDP的“sockets”列,它是0。但是UDP数据包不断被发送。然后大约一分钟后,“/proc/net/udp”和“/proc/net/protocols”开始显示有关UDP数据包的正确信息。又过了一会儿,在发送 UDP 数据包时,它们中没有任何信息。

我唯一的结论是,应用程序有可能在不创建套接字的情况下发送 UDP 数据包和/或可能创建一个套接字,然后删除它(这样内核认为没有)并且仍然使用一些晦涩的方法来发送外面的包。

请问有人对这种行为有想法吗?

4

2 回答 2

4

两个想法:

尝试通过 strace 运行应用程序并查看该输出。

您还可以尝试通过带有套接字操作过滤器的systemtap运行它。从那个链接:

probe kernel.function("*@net/socket.c").call {
  printf ("%s -> %s\n", thread_indent(1), probefunc())
}
probe kernel.function("*@net/socket.c").return {
  printf ("%s <- %s\n", thread_indent(-1), probefunc())
}
于 2011-09-26T17:03:46.060 回答
0

感谢 Paul Rubel 给了我正确方向的提示。strace 显示 Java 应用程序正在使用 IPv6 套接字。我仔细查看了 /proc/net/udp6 和那些套接字。我可能第一次看得太粗略了,主要是因为我什至没想到会在那里找到它们。这是我第一次偶然发现 IPv6 套接字上的 IPv4 数据包。但这就是 Java 所做的。干杯。

于 2011-09-27T20:01:53.350 回答