在Linux上“离线”运行子进程的命令(无外部网络)


15

我有一个程序要在脱机模式下进行测试,而又不中断我的实际网络。该程序仍然需要连接到本地套接字,包括Unix域套接字和环回。它还需要侦听回送并且对其他应用程序可见。

但是尝试连接到远程计算机应该失败。

我想有一个工具,它的工作原理是strace/ unshare/ sudo,只是运行在互联网(和LAN)隐蔽和一切仍在工作的命令:

$ offline my-program-to-test

该问题的答案提示:阻止进程的网络访问?

那里有一些建议,例如以其他用户身份运行然后操纵iptables或unshare -n。但是在两种情况下,我都不知道要与主系统共享unix域套接字和环回的诱惑-该问题的答案仅告诉我如何取消共享整个网络。

我正在测试的程序仍然需要连接到我的X服务器和dbus,甚至还能够在环回侦听来自系统上其他应用程序的连接。

理想情况下,我想避免创建chroot或用户或VM等,因为它就像拔掉网络电缆一样令人讨厌。即问题的关键是我怎样才能使它简单如一个sudo

我希望该过程能够正常运行100%,除了指定非本地地址的网络调用会失败。理想情况下,保持相同的uid,相同的homedir,相同的pwd,相同的所有内容,除了...离线。

我使用的是Fedora 18,因此无法移植的Linux回答就很好(甚至期望)。

我什至很乐意通过编写C程序来解决此问题,如果涉及到这一点,那么涉及编写C的答案就可以了。我只是不知道C程序在保留本地网络的同时撤销外部网络访问权限时需要执行什么系统调用。

任何尝试支持“离线模式”的开发人员都可能会喜欢此实用程序!

Answers:


9

传统的答案是以另一个用户身份运行该程序并使用iptables -m owner。这样,即可共享网络配置。但是,随着名称空间的出现,有一种更简单的方法。

使用名称空间,您可以取消共享网络,如果需要有限的网络访问,则可以创建虚拟网络链接。

要共享Unix域套接字,您需要做的就是在此2010补丁程序之后2.6.36或更高版本中拥有一个足够新的内核(在撰写本文时,除RHEL / CentOS以外,所有当前发行版都是这种情况)。

在其自己的IP名称空间中运行程序。在启动程序之前,请建立一个虚拟以太网接口。似乎没有太多的文档资料。我在一些博客中找到了正确的咒语:

在下面的代码段中,我使用了手册页中列出ns_execthis包装器,setns以从受限命名空间中运行的进程中调出网络链接的主机端。您实际上并不需要:您可以从受限名称空间外部设置链接的主机端。从内部进行操作仅有助于流程控制,否则在建立链接之后但在启动程序之前,需要进行一些同步才能设置链接。

unshare -n -- sh -c '
  # Create a virtual ethernet interface called "confined",
  # with the other end called "global" in the namespace of PID 1
  ip link add confined type veth peer name global netns 1

  # Bring up the confined end of the network link
  ip addr add 172.16.0.2/30 dev confined
  ip link set confined up

  # Bring up the global end of the network link
  ns_exec /proc/1/ns/net ifconfig global 172.16.0.1 netmask 255.255.255.252 up

  # Execute the test program
  exec sudo -E -u "$TARGET_USER" "$0" "$@"
' /path/to/program --argument

您需要以root用户身份执行所有这些操作。在引入内核3.8用户的命名空间可以使这是可行的,没有特殊权限,除了建立网络链接的全球终端。

我不知道如何在两个名称空间之间共享本地主机。虚拟以太网接口创建点对点网桥。如果需要,您可以使用iptables转发规则来重定向流量lo


好的附加信息,谢谢。我认为veth给了我指向命名空间“外部”的链接,但是我的新命名空间仍然相当于一个单独的网络节点,而不是减去非本地接口的同一个网络节点。含义是(?):Unix域/抽象套接字仍将失败,并且可以通过iptables转发环回,但是转发无法实现共享-也就是说,原始名称空间和受限名称空间都可能正在监听环回,并且两组(动态地) -更改)端口将需要在两个名称空间中均可见...开始猜测我想要的东西在这里是不可能的:-/
Havoc P

1

这也可以通过与iptables规则匹配的cgroup来实现。我写了一个抽象步骤的工具。尽管它需要root权限才能进行初始设置,否则它是setuid二进制文件,但我认为它提供了一种相当直接的方式来解决问题。它需要一个足够新的iptables版本,并且需要适当的netfilter模块。

https://github.com/quitesimpleorg/qsni


0

/ !! \这可能不是一个有效的答案,因为这会将您的所有流量都带走,而不仅仅是一个pid的流量。

我没有使用过,但我认为您可能会使用Comcast:

https://github.com/tylertreat/Comcast

设置为100%丢包

再次说明,我尚未对此进行测试,但是从理论上讲,可以根据他们的自述文件进行修改:


的Linux

在Linux上,您可以iptables用来丢弃传入和传出的数据包。

$ iptables -A INPUT -m statistic --mode random --probability 1 -j DROP
$ iptables -A OUTPUT -m statistic --mode random --probability 1 -j DROP

或者,您可以使用tc支持某些其他选项的。

$ tc qdisc change dev eth0 root netem reorder 0 duplicate 0 corrupt 1

重置:

$ tc qdisc del dev eth0 root netem
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.