我正在尝试从网络命名空间内捕获流量,并以非特权用户身份在主机上使用 Wireshark 查看。为此,我tcpdump
在目标网络命名空间内运行,并将捕获的数据写入/tmp/fifo
主机可访问的命名管道。
当我尝试通过运行在主机上的 Wireshark 中查看此流量时wireshark -k -i /tmp/fifo
,收到错误消息:
Couldn't run dumpcap in child process: Permission denied
运行ls -l /bin/dumpcap
输出权限-rwxr-xr-- 1 root wireshark
,这解释了为什么dumpcap
不属于该组的用户无法执行wireshark
。
由于用户实际上只是从管道读取字节,因此不需要 root 权限或能力。我可以把用户添加到wireshark
组,但该dumpcap
二进制文件有一些我不太想授予的能力。或者,我可以剥离这些能力dumpcap
,使其可由所有人执行。简单测试一下,这种方法确实有效,但可能会dumpcap
以意想不到的方式崩溃,因为它本来就是用这些能力来执行的。
有没有更直接的方法来实现我的目标?
更新后的答案:
dumpcap
Wireshark在与二进制文件相同的位置进行查找wireshark
(1、2)。将两个可执行文件复制到不同的目录:
dumpcap 二进制文件现在归您所有,并且可以执行。
从该目录运行 Wireshark:
先前的答案(当我认为
/usr/bin/dumpcap
路径在编译时是硬编码时):如果您的系统有可用的非特权用户命名空间(
unshare --user
),您可以使用具有不同权限的命名空间覆盖 /bin/dumpcap。制作一份属于您自己的副本:
输入一个用户命名空间,您可以在其中拥有 root 权限 - 并且同时授予您创建挂载命名空间的权限:
这样
--keep-caps
您就可以直接mount
在命名空间内调用,因为不可能做sudo
任何事情(/bin/sudo 由“外部”根拥有,您无权将其映射到命名空间中)。在命名空间 shell 中,将 dumpcap 的副本挂载到 Wireshark 期望的路径上,然后在同一个 shell 中运行 Wireshark: