为什么 tcpdump 无法写入 pcap 文件?

为什么 tcpdump 无法写入 pcap 文件?

在调试似乎无法连接的 python irc 机器人的过程中,我想“我知道,我只需 tcpdump 它并查看它在做什么。” 所以我像平常一样运行 tcpdump,它说它捕获了数据包,但实际上并没有写入 cap 文件。

akraut@lance ~/pcaps $ sudo tcpdump -w pyhole -s 0 "port 6667"
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C17 packets captured
17 packets received by filter
0 packets dropped by kernel
4294966881 packets dropped by interface
akraut@lance ~/pcaps $ ls -la
total 8
drwxr-xr-x 2 akraut akraut 4096 Feb  6 11:50 .
drwxr-xr-x 8 akraut akraut 4096 Feb  6 11:50 ..
akraut@lance ~/pcaps $ 

答案1

您可能需要使用 strace 检查 tcpdump 的行为,看看它是否在执行任何奇怪的操作(例如 chrooting),看看它是在 gentoo 还是其他可能会破坏二进制文件的发行版中。

答案2

好了,我解开了谜团。跟着我一起解开谜团吧Funtoo 的 TCPDump 和丢失的 pcap 文件之谜

我使用 strace 来查看发生了什么,相关行如下:

chroot("/var/lib/tcpdump")              = 0
chdir("/")                              = 0
--- SNIP ---
open("/tmp/lol.wat", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 ENOENT (No such file or directory)

所以...

lance ~ # ls /var/lib/tcpdump/
blah  blah.cap  irc.cap  pyhole

嘿,看!我尝试创建的所有 cap 文件!

查看了 tcpdump 默认使用的使用标志后,我看到了以下内容:

lance ~ # grep tcpdump /usr/portage/profiles/use*desc
use.local.desc:net-analyzer/tcpdump:chroot - Enable chrooting when dropping privileges

那么为什么要这样做呢?我的观点是这样的:

  1. 许多与原始网络流量交互的应用程序必须以 root 身份运行。
  2. 原始网络流量在现实中具有多种有效值和无效值。
  3. 这些应用程序存在许多漏洞。(Wireshark、Ethereal、tcpdump 等)
  4. 因此,tcpdump 在 root 身份下获取对网络接口的访问权限,将自身限制在 中/var/lib/tcpdump,然后放弃 root 权限并开始捕获。

结果,当我指定./blah或时,blah它工作正常。但/tmp/blah没有,因为/var/lib/tcpdump/tmp不存在。

所有这些的一个巧妙的附加功能是:当使用 suid 标志安装 tcpdump SetUID 时,您可以授予用户组访问权限,tcpdump而无需授予他们 sudo 或 root 访问权限。可能的用途包括为您的网络工程师或研究人员提供捕获框。

我只是希望 Gentoo/Funtoo 在安装时能有一条消息说明这一切。

tl;dr:Gentoo/Funtoo 将您的 pcap 文件放入/var/lib/tcpdump

答案3

语法是正确的:我刚刚尝试过(尽管是在端口 80 上),它在当前工作目录中生成了一个 pcap 文件,给出了与您使用的相同选项。

这可能和你试图以 root 身份写入的主目录有关(因为 sudo)?你是否可能使用带有 root-squashing 的 NFS 安装主目录 sudo touch ~akraut/pcaps/foo??

您可以尝试将 pcap 写入 /tmp/ 或其他地方吗?

相关内容