我想在我的 Swarm 上全局部署一个容器,将一些 iptables 规则应用于主机的网络。具体来说,我想向一些覆盖网络添加规则,这些规则似乎位于每个覆盖网络的唯一命名空间中。
这是我的docker-compose:
version: '3.8'
services:
test:
image: docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/run/docker/netns:/var/run/netns
cap_add:
- NET_ADMIN
- SYS_ADMIN
networks:
host_netns:
deploy:
mode: global
command: sleep infinity
networks:
host_netns:
external:
name: "host"
如果我执行到容器中并安装 iproute2,我可以看到网络命名空间:
/ # ip netns ls
default
1-n57c2x71vc (id: 0)
ingress_sbox (id: 1)
但是,如果我尝试运行iptables
,我会收到安装错误:
/ # ip netns exec 1-n57c2x71vc iptables -L
"mount --make-rslave /" failed: Permission denied
我被难住了。为什么有些东西试图将我的根重新挂载为从属?
值得一提的是,如果我做一个简单的iptables -L
,我确实可以正确地看到我的主机的所有 iptables 规则。
答案1
似乎一种解决方法是使用nsenter -n /var/run/netns/<namespace> -- iptables
而不是ip netns exec
。nsenter
只设置进程命名空间,它将在只有上述两个大写字母添加的容器中工作。 似乎在和ip netns exec
中对内容进行了一些更花哨的重新安装,以便进程在常规位置找到网络命名空间链接。无论出于什么原因,如果没有,安装是不可能的。我确实尝试过卸载所有安装,但这没有帮助。/etc
/sys
--privileged
ro