如何设置 FirewallD 来过滤到 docker 暴露端口的流量

War*_*ius 8 iptables docker firewalld

我已经设置了一个 pi-hole docker 容器并在 CentOS7 上公开了 dns 端口和端口 80。然而,这些端口现在可用于所有来源,这不是很方便,因为它在 VPS 上运行。

所以我试图让 firewallD 过滤到我的 docker 容器的流量。

所以我的 docker 容器运行如下:

docker ps
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS                       PORTS                                                        NAMES
18881454da0c        pihole/pihole:latest   "/s6-init"          24 hours ago        Up About an hour (healthy)   0.0.0.0:53->53/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:53->53/udp   pihole
Run Code Online (Sandbox Code Playgroud)

在 firewallD 上,我设置了以下 acl(通过此过滤器可以很好地过滤到 CentOS 的流量):

sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: docker0
  sources:
  services: 
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="<home ip>/32" accept
Run Code Online (Sandbox Code Playgroud)

我已经将 docker0 接口设置为 zone public:

sudo firewall-cmd --permanent --zone=public --change-interface=docker0
sudo firewall-cmd --get-active-zones
public
  interfaces: docker0
Run Code Online (Sandbox Code Playgroud)

但是当我从互联网上进行端口扫描时,我仍然看到所有暴露在 docker 中的端口。

我可以使用 iptables 命令解决这个问题:

sudo iptables -N CUSTOM_PIHOLE
sudo iptables -A CUSTOM_PIHOLE --source <home ip> --destination 172.17.0.2 -j ACCEPT
sudo iptables -R DOCKER 1 --source 0.0.0.0/0 --destination 172.17.0.2 -j CUSTOM_PIHOLE 
sudo iptables -D DOCKER 3
sudo iptables -D DOCKER 2
Run Code Online (Sandbox Code Playgroud)

但是当 firewallD 重新加载时,这个配置就会丢失。

有没有办法使用 firewallD 过滤到 docker-container 的流量?