Docker 埠對映防火牆規則配置

SangriaChant發表於2024-05-07

背景

當 docker 使用埠對映時, docker daemon 會建立 DOCKER 鏈繞過 firewalld 建立 iptables 規則,可能使 firewall 規則失效。

可以透過修改 DOCKER-USER 鏈來管理 docker 的防火牆規則或禁用 firewalld 直接配置 iptables(不推薦)

1. 停止 docker

不要在 Docker 執行時 Reload firewalld,否則會導致 Docker 鏈被刪除

systemctl stop docker

2. 清除並重建自定義規則鏈

firewall-cmd --permanent --direct --remove-chain ipv4 filter DOCKER-USER
firewall-cmd --permanent --direct --remove-rules ipv4 filter DOCKER-USER
firewall-cmd --permanent --direct --add-chain ipv4 filter DOCKER-USER

3. 允許 Docker 容器出站流量返回

使用 conntrack 模組匹配 RELATED, ESTABLISHED 兩種狀態的連線

# 允許出站流量返回,因為建立連線 ESTABLISHED 的資料包已經透過了防火牆的出站規則。
# 此規則優先順序為 1
# 沒有完全理解這個邏輯,但是加了這條容器內就可以聯網了
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
  -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT \
  -m comment --comment 'Allow containers to connect to the outside world'

4. 配置白名單

# 允許來自 IP 段的所有流量
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
  -s 10.60.22.0/24 -j ACCEPT \
  -m comment --comment 'Allow IP 10.60.22.0/24 to access'

5. 配置預設阻止

# 阻止其他的流量
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 10 \
  -j REJECT -m comment --comment 'reject all other traffic to DOCKER-USER'

6. Reload 防火牆

firewall-cmd --reload
firewall-cmd --get-active-zones

7. 重啟 docker

systemctl start docker

相關文章