Hav*_*c P 18 linux networking lxc capabilities namespace
我有一个程序,我想在不关闭实际网络的情况下在离线模式下进行测试。该程序仍需要连接到本地套接字,包括 unix 域套接字和环回。它还需要侦听环回并对其他应用程序可见。
但是尝试连接到远程机器应该会失败。
我想有一个工具,它的工作原理是strace/ unshare/ sudo,只是运行在互联网(和LAN)隐蔽和一切仍在工作的命令:
$ offline my-program-to-test
Run Code Online (Sandbox Code Playgroud)
这个问题暗示了答案:阻止进程的网络访问?
那里有一些建议,例如以另一个用户身份运行然后操作 iptables,或unshare -n. 但在这两种情况下,我都不知道让 unix 域套接字和环回与主系统共享的咒语 - 该问题的答案只告诉我如何取消共享整个网络。
我正在测试的程序仍然需要连接到我的 X 服务器和 dbus,甚至能够监听来自系统上其他应用程序的环回连接。
理想情况下,我想避免创建 chroot 或用户或 VM 等,因为它变得和拔掉网线一样烦人。即问题的重点是我怎样才能使它像sudo.
我希望该过程能够 100% 正常运行,除非指定非本地地址的网络调用会失败。理想情况下,保持相同的 uid、相同的 homedir、相同的密码、相同的所有内容,除了...离线。
我正在使用 Fedora 18,因此不可移植的 Linux 答案很好(甚至是预期的)。
我什至很高兴通过编写 C 程序来解决这个问题,如果涉及到的话,那么涉及编写 C 的答案就很好。我只是不知道 C 程序需要进行哪些系统调用才能在保留本地网络的同时撤销外部网络访问。
任何试图支持“离线模式”的开发人员都可能会喜欢这个实用程序!
Gil*_*il' 11
传统的答案是以另一个用户身份运行程序并使用iptables -m owner. 这样,网络配置是共享的。然而,随着命名空间的出现,有一种更简单的方法。
使用命名空间,您可以取消共享网络,然后在需要有限的网络访问时创建虚拟网络链接。
要共享 unix 域套接字,您只需要拥有一个足够新的内核,在此 2010 补丁之后,即 2.6.36 或更高版本(在撰写本文时,除 RHEL/CentOS 之外的所有当前发行版都是这种情况)。
在其自己的 IP 命名空间中运行该程序。在启动程序之前,先建立一个虚拟以太网接口。似乎没有太多文档;我在一些博客中找到了正确的咒语:
在下面的代码片段中,我使用手册页中列出的ns_execis this 包装器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
Run Code Online (Sandbox Code Playgroud)
您需要以 root 身份执行所有这些操作。内核 3.8 中用户命名空间的引入可能使这在没有特殊权限的情况下可行,除了设置网络链接的全局端。
我不知道如何在两个命名空间之间共享 localhost。虚拟以太网接口创建点对点网桥。如果需要,您可以使用iptables转发规则来重定向流量lo。