为什么 tcpdump 不会写一个 pcap 文件?

akr*_*aut 8 networking filesystems tcpdump

在调试一个似乎无法连接的python irc bot的过程中,我想“我知道,我只是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 $ 
Run Code Online (Sandbox Code Playgroud)

小智 11

您可能想用 strace 检查 tcpdump 的行为,看看它是否在做任何奇怪的事情,比如 chrooting,如果它在 gentoo 或其他可能支持二进制文件的发行版中。


akr*_*aut 10

好的,我已经解开了这个谜团。跟随我一起解开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)
Run Code Online (Sandbox Code Playgroud)

所以...

lance ~ # ls /var/lib/tcpdump/
blah  blah.cap  irc.cap  pyhole
Run Code Online (Sandbox Code Playgroud)

你看!我试图创建的所有上限文件!

在查看了默认情况下使用 tcpdump 构建的使用标志后,我看到了:

lance ~ # grep tcpdump /usr/portage/profiles/use*desc
use.local.desc:net-analyzer/tcpdump:chroot - Enable chrooting when dropping privileges
Run Code Online (Sandbox Code Playgroud)

那么为什么要这样做呢?我的理论是这样的:

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

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

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

我只是希望 Gentoo/Funtoo 能有一条关于安装的消息,说明所有这些。

tl;dr:Gentoo/Funtoo 把你的 pcap 文件放在/var/lib/tcpdump.