具体步骤

  1. 安装 Firewalld (注意卸载关闭除了 iptables 以外的防火墙)

    1
    2
    3
    4
    # 安装 firewalld
    apt install firewalld
    # 启动并设置开机自启
    systemctl enable --now firewalld
  2. 在 Docker 中禁用 iptables, 编辑文件 /etc/docker/daemon.json 添加以下配置

    1
    2
    3
    {
    "iptables": false
    }
  3. 重启 Docker

    1
    2
    # 重启 Docker
    systemctl restart docker
  4. Firewalld 启用当前区域下的伪装, 通常是 public

    1
    2
    3
    4
    # 允许 public 区域伪装
    firewall-cmd --zone=public --add-masquerade --permanent
    # 重启 firewalld
    firewall-cmd --reload
  5. 为了让 Docker 能够重新访问端口, 将其接口添加到 trusted 区域

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 查看 Docker 使用的网络接口, 一般为 docker0
    ip link show

    # 添加 docker0 接口到 trusted 区域
    firewall-cmd --permanent --zone=trusted --add-interface=docker0
    # 重启 firewalld
    firewall-cmd --reload
    # 重启 Docker
    systemctl restart docker
  6. 将主机接口添加到 public 区域

    1
    2
    3
    4
    5
    6
    7
    # 查看主机使用的网络接口, 一般为 eth0
    ip addr

    # 添加 eth0 接口到 public 区域
    firewall-cmd --permanent --zone=public --add-interface=eth0
    # 重启 firewalld
    firewall-cmd --reload

    此时防火墙应该设置完毕, 添加端口和删除端口操作和日常无异, 正常添加即可.

参考

https://dev.to/soerenmetje/how-to-secure-a-docker-host-using-firewalld-2joo

https://docs.docker.com/network/iptables/