背景
當 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