在调试似乎无法连接的 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
那么为什么要这样做呢?我的观点是这样的:
- 许多与原始网络流量交互的应用程序必须以 root 身份运行。
- 原始网络流量在现实中具有多种有效值和无效值。
- 这些应用程序存在许多漏洞。(Wireshark、Ethereal、tcpdump 等)
- 因此,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/ 或其他地方吗?