如何列出 Firejail 中开放的互联网连接?

如何列出 Firejail 中开放的互联网连接?

我正在使用 firejail 来沙箱 Firefox。当我使用时lsof -i,没有显示连接。 Firejail 对进程进行命名空间隔离,所以我这样做

ps aux | grep firefox | awk ' { print $2} ' | while read p ; do nsenter -t $p lsof -i ; done

输入每个命名空间并使用 lsof -i。我nsenter -t <pid> -n lsof -i也尝试过,但什么也没有出现。但是当我以 root 身份运行时,这会起作用。用户不应该能够列出打开的套接字连接吗?

答案1

这条ps | grep | awk管道既古老又丑陋(这是非常古老的)。

顺便说一句,grep将匹配它自己的 pid...这就是为什么大多数变体使用一些技巧来排除 grep 的 pid。通常是一些可怕的事情,比如ps aux | grep command | grep -v grep。其中最好的一个是使用 grep 正则表达式的括号表达式。甚至更好的版本意识到管道输入grep几乎awk总是多余的毫无意义,不是必需的,甚至是不必要的,因为awk可以进行正则表达式模式匹配,并最终得到类似ps aux | awk '/[c]ommand/ {print $2}') 的结果。

无论如何,不​​要使用任何可怕的废话。它本来应该在九十年代就死掉了,但它的僵尸尸体却不断复活或重新发明。

请改用pgreporpsh(无标题)、-C(匹配 cmdlist)和-o(输出格式)选项。这就是他们的目的。

例如

pgrep -f firefox | xargs -I {} nsenter -n -t {} lsof -i

或者

ps h -C firefox -o pid | xargs -I {} nsenter -n -t {} lsof -i

或者,没有xargs

for pid in $(pgrep -f firefox) ; do
  nsenter -n -t "$pid" lsof -i
done

这远非完美,但它是一个比您当前正在做的事情要好得多的起点。

顺便说一句,pgrep可以列出命名空间中的所有 PID。还有lsns用于检查和提取有关名称空间的各种详细信息。甚至还ps可以选择列出与 PID 相关的各种命名空间。您可能应该阅读所有这些的手册页......特别是如果您想在没有自己的lsof二进制文件或到系统的 lsof 和/或 /usr/bin/ 的映射的名称空间中列出网络连接目录。

不幸的是,lsof它本身似乎没有任何内置的命名空间支持......也许在未来的某个版本中。

答案2

事实证明,firefox似乎为正在运行的和派生的firefox进程创建了另一个沙箱。因此,如果用户在命令行上使用 firefox 启动 firejail,则会显示当前用户的 lsns。

但是,如果从同一命令行我 grep 所有 firefox 进程,然后输入 net 命名空间,lsof -i则会失败:

nsenter: cannot open /proc/8958/ns/net: Permission denied

作为 root,lsns 显示 firefox 进程以及每个命名空间的关联 pid。如果我输入所有命名空间 和lsof -i,我会得到某些 pid 的 firefox 套接字的输出。

当我ls/proc/pid 时,其中 pid uid 是用户并生成了 lsof -i 输出,这些文件均由 root 所有,而不是由用户所有,这就是为什么lsof -i在所有 firefox 进程上以用户身份执行时不起作用的原因。

很难说这是否是预期的行为,因此任何意见都将不胜感激。

相关内容