防火墙行为不一致

防火墙行为不一致

我有一个带有多个节点的 docker swarm。它们通过wireguard 接口连接。所有 docker swarm 通信都发生在由wireguard 提供的内部网络内部。在下面的示例中,面向互联网的接口为eth0,wireguard 接口为intr

我向堆栈添加了一个ocks5代理,在撰写文件中看起来像这样:

services:
  proxy:
    hostname: proxy
    image: httptoolkit/docker-socks-tunnel
    ports:
      - 1080:1080/tcp

我的目标是限制对此服务的访问,因此只有 intr 网络上的客户端(例如发起wireguard 接口)才能使用它。

这是我使用的一组简约命令:

# replace ufw with firewalld
systemctl stop docker
systemctl stop ufw
apt remove --purge ufw
apt install -y firewalld
systemctl enable firewalld
systemctl start firewalld
systemctl start docker

# add eth0 to public zone, this will prevent all incoming connections, except ssh and ipv6-dhcp
firewall-cmd --zone=public --add-interface=eth0
# allow 51830/udp (wireguard) so that the internal wireguard interfaces can connect on the nodes
firewall-cmd --zone=public --add-port=51820/udp --permanent

# create a new zone for intr, add the intr interface to it
firewall-cmd --new-zone=intr --permanent
firewall-cmd --zone=intr --add-interface=intr --permanent
# allow docker swarm ports on it
firewall-cmd --permanent --zone=intr --add-service=docker-swarm --permanent

# create a policy that allows traffic between docker and intr interfaces
firewall-cmd --permanent --new-policy docker-intr --set-target=ACCEPT
firewall-cmd --permanent --policy docker-intr --add-ingress-zone intr
firewall-cmd --permanent --policy docker-intr --add-egress-zone docker

# change default policy of "docker" zone to drop
firewall-cmd --permanent --zone=docker --set-target=DROP

# for this example, allow socks5 on intr zone
firewall-cmd --permanent --zone=intr --add-port=1080/tcp --permanent

firewall-cmd --reload

执行完上面的命令后,似乎可以正常工作了。如果我尝试通过wireguard访问它,那么端口是开放的:

nc -vz -w1 10.1.2.1 1080`
Connection to 10.1.2.1 1080 port [tcp/socks] succeeded!

如果我尝试在公共地址上访问它,那么它就会被删除:

nc -vz -w1 my.server.com 1080`
Connection to my.server.com (1.2.3.4) port 1080 (tcp) timed out: Operation now in progress

对于端口 2377/tcp (swarm) 也是如此:它似乎在内部接口的地址上开放,但在公共地址上被拒绝

但是,如果我重新启动操作系统,则会发生以下情况:

  1. 2377/tcp(docker swarm)即使在 docker 启动后仍然保持关闭
  2. 1080/tcp (socks) 在所有接口上都开放,包括 eth0(socks 服务的容器启动后)
  3. 但如果我firewall-cmd --reload一分钟后执行,那么 1080/tcp 在 eth0 上再次关闭

我还没有对此进行测试,但我怀疑如果我关闭 docker 堆栈并再次启动它,则会出现相同的问题。

根据永久的firewalld设置,1080/tcp应该被关闭,但被docker动态覆盖,这怎么可能?根据官方文档(https://docs.docker.com/network/packet-filtering-firewalls/#integration-with-firewalld),docker与firewalld无缝集成。

我究竟做错了什么?

相关内容