Linux应用程序在没有套接字的情

时间:2011-09-26 16:54:11

标签: linux sockets udp netfilter procfs

其他程序员。 我正在使用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的“套接字”列,它是0。 但UDP数据包不断发送。 然后大约一分钟后,“/ proc / net / udp”和“/ proc / net / protocols”开始显示有关UDP数据包的正确信息。 并且在一段时间之后,在发送UDP数据包时,它们中没有信息。

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

请问有关此类行为的人是否有所帮助,请?

2 个答案:

答案 0 :(得分: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())
}

答案 1 :(得分:0)

谢谢Paul Rubel给我一个正确方向的暗示。 strace表明Java应用程序正在使用IPv6套接字。我仔细看了一下/ proc / net / udp6那里有那些插座。我可能在第一次看到过于粗略的观点,主要是因为我甚至没想到会在那里找到它们。这是我第一次在IPv6套接字上偶然发现IPv4数据包。但这就是Java所做的。 欢呼声。