最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Docker與firewalld網(wǎng)絡(luò)沖突解決方案

 更新時(shí)間:2026年06月11日 09:19:29   作者:2025發(fā)大財(cái)行好運(yùn)  
本文主要介紹了Docker容器網(wǎng)絡(luò)與firewalD防火墻服務(wù)在Linux系統(tǒng)中的交互機(jī)制及沖突根源解析,并提出四種解決方案,以確保Docker與firewalD規(guī)則管理的兼容性,下面就來(lái)詳細(xì)的了解一下

問(wèn)題解構(gòu)

該問(wèn)題核心在于理解 Docker 容器網(wǎng)絡(luò)與 firewalld 防火墻服務(wù)在 Linux 系統(tǒng)(特別是 CentOS/RHEL 7+)上的交互機(jī)制。Docker 在啟動(dòng)時(shí)會(huì)動(dòng)態(tài)配置系統(tǒng)的 iptables 規(guī)則以實(shí)現(xiàn)容器的網(wǎng)絡(luò)隔離、端口映射和通信 。firewalld 作為 iptables 的前端管理工具,其設(shè)計(jì)目標(biāo)之一是接管并管理系統(tǒng) iptables 規(guī)則 。當(dāng) firewalld 重啟時(shí),它會(huì)按照其自身配置重新生成 iptables 規(guī)則鏈,這一過(guò)程默認(rèn)會(huì)清除所有非其管理的規(guī)則,其中就包括了 Docker 在啟動(dòng)時(shí)創(chuàng)建的規(guī)則,從而導(dǎo)致依賴這些規(guī)則的容器網(wǎng)絡(luò)中斷 。

方案推演與詳細(xì)解答:

Docker 容器網(wǎng)絡(luò)與 firewalld 的關(guān)聯(lián)主要體現(xiàn)在對(duì)底層 iptables/netfilter 子系統(tǒng)的共同使用和規(guī)則管理沖突上。

1. 關(guān)聯(lián)機(jī)制與沖突根源

Docker 默認(rèn)使用 bridge 網(wǎng)絡(luò)模式。在此模式下,Docker 服務(wù)(dockerd)啟動(dòng)時(shí)會(huì)自動(dòng)創(chuàng)建名為 docker0 的虛擬網(wǎng)橋,并為每個(gè)容器創(chuàng)建一對(duì) veth 虛擬網(wǎng)絡(luò)接口,同時(shí),為了實(shí)現(xiàn)容器與外部網(wǎng)絡(luò)的通信、端口映射(-p 參數(shù))以及容器間的網(wǎng)絡(luò)隔離,Docker 會(huì)在宿主機(jī)的 iptables 的 nat、filter 和 mangle 表中插入一系列自定義規(guī)則鏈(如 DOCKER、DOCKER-ISOLATION-STAGE-1/2)和規(guī)則 。

firewalld 作為一個(gè)動(dòng)態(tài)防火墻管理器,其核心功能之一是通過(guò) firewall-cmd 命令管理一套預(yù)定義的 iptables 規(guī)則集。當(dāng) firewalld 服務(wù)啟動(dòng)或重啟時(shí),它會(huì)清空現(xiàn)有的 iptables 規(guī)則,然后根據(jù)其區(qū)域(zone)、服務(wù)(service)等配置重新構(gòu)建規(guī)則 。這個(gè)“清空并重建”的過(guò)程,會(huì)無(wú)條件地移除 Docker 之前創(chuàng)建的所有 iptables 規(guī)則。

下表對(duì)比了 Docker 與 firewalld 對(duì) iptables 的操作:

特性Dockerfirewalld
規(guī)則管理目標(biāo)實(shí)現(xiàn)容器網(wǎng)絡(luò)(橋接、NAT、端口映射、內(nèi)部通信控制)。管理系統(tǒng)級(jí)的網(wǎng)絡(luò)訪問(wèn)控制策略(基于區(qū)域、端口、服務(wù))。
規(guī)則操作方式動(dòng)態(tài)增刪。容器啟動(dòng)/停止、端口映射變更時(shí)自動(dòng)修改規(guī)則。整體接管。服務(wù)啟停、重載配置時(shí),清空并重建整個(gè)規(guī)則集。
關(guān)鍵沖突點(diǎn)其創(chuàng)建的 DOCKER、DOCKER-USER 等自定義鏈和規(guī)則不屬于 firewalld 管理范疇。默認(rèn)行為會(huì)清除所有非由其自身生成的 iptables 規(guī)則和鏈。
直接后果firewalld 重啟后,Docker 的 NAT 規(guī)則丟失,導(dǎo)致端口映射失效;過(guò)濾規(guī)則丟失,可能導(dǎo)致容器間或容器對(duì)外通信中斷。系統(tǒng)防火墻策略生效,但 Docker 網(wǎng)絡(luò)功能被破壞。

因此,重啟 firewalld 后,個(gè)別容器無(wú)法訪問(wèn)的直接原因通常是:

  • 端口映射失效:宿主機(jī)上通過(guò) -p 8080:80 映射的端口無(wú)法再被訪問(wèn),因?yàn)樨?fù)責(zé)目標(biāo)地址轉(zhuǎn)換(DNAT)的 iptables 規(guī)則已被清除 。
  • 容器網(wǎng)絡(luò)通信異常:容器可能無(wú)法訪問(wèn)外部網(wǎng)絡(luò),或者容器之間無(wú)法通信,因?yàn)?filter 表中允許或禁止特定流量的規(guī)則已丟失。

2. 解決方案

針對(duì)此沖突,有以下幾種主流解決方案,可根據(jù)實(shí)際需求選擇:

方案一:調(diào)整 Docker 的啟動(dòng)配置,使其規(guī)則不被 firewalld 清除(推薦)

這是 Docker 官方推薦并自較高版本起支持的方案。通過(guò)修改 Docker 守護(hù)進(jìn)程的配置,告訴系統(tǒng) Docker 管理的 iptables 規(guī)則應(yīng)被保留。

編輯 Docker 配置文件:

# 通常配置文件路徑為 /etc/docker/daemon.json
sudo vi /etc/docker/daemon.json

添加或修改 iptables 配置項(xiàng):

{
  "iptables": false
}
  • "iptables": false:此配置告訴 Docker 不要自動(dòng)管理 iptables 規(guī)則。這意味著 Docker 不會(huì)在啟動(dòng)時(shí)創(chuàng)建自己的 DOCKER 等鏈和規(guī)則。這通常需要結(jié)合方案二(使用 firewalld 直接管理)或方案三(手動(dòng)管理規(guī)則)來(lái)為容器配置網(wǎng)絡(luò)策略 。
  • 注意:更現(xiàn)代的實(shí)踐是依賴 Docker 與 firewalld 的協(xié)同。確保 Docker 版本較新(如 20.10+),并不設(shè)置 "iptables": false,而是利用 Docker 自動(dòng)創(chuàng)建的 DOCKER-USER 鏈。firewalld 從某個(gè)版本開始,默認(rèn)不會(huì)清除 DOCKER-USER 鏈中的規(guī)則 。這樣,Docker 的基礎(chǔ)規(guī)則(如端口映射的 NAT 規(guī)則)由 Docker 管理,而用戶自定義的訪問(wèn)控制規(guī)則可以添加到 DOCKER-USER 鏈,由 firewalld 或手動(dòng) iptables 命令管理且能在 firewalld 重啟后保留。

方案二:使用 firewalld 直接管理 Docker 容器的防火墻規(guī)則

此方案將容器視為網(wǎng)絡(luò)實(shí)體,通過(guò) firewalld 為其配置富規(guī)則(rich rules)或直接允許服務(wù)。這要求 firewalld 處于運(yùn)行狀態(tài),并且 Docker 的 iptables 規(guī)則管理未被禁用。

確保 firewalld 運(yùn)行并允許 Docker 服務(wù):

sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --permanent --add-service=docker
sudo firewall-cmd --reload

這允許了 Docker 守護(hù)進(jìn)程通信所需的端口 。

為容器端口添加規(guī)則:假設(shè)容器映射了宿主機(jī)的 8080 端口。

# 允許來(lái)自任何來(lái)源訪問(wèn)宿主機(jī)的8080端口(TCP)
sudo firewall-cmd --permanent --add-port=8080/tcp
# 或者,更精細(xì)地,只允許特定IP段訪問(wèn)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="8080" accept'
sudo firewall-cmd --reload

這種方法將容器端口的訪問(wèn)控制完全交由 firewalld 管理,規(guī)則在 firewalld 重啟后會(huì)由其自動(dòng)重建 。

方案三:停止使用 firewalld,換用傳統(tǒng)的 iptables-services

如果系統(tǒng)對(duì) firewalld 的依賴不強(qiáng),可以考慮用回靜態(tài)的 iptables 服務(wù)。

停止并禁用 firewalld

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask firewalld  # 防止被其他服務(wù)意外啟動(dòng)

安裝并啟用 iptables-services

sudo yum install iptables-services -y
sudo systemctl start iptables
sudo systemctl enable iptables
sudo systemctl start ip6tables
sudo systemctl enable ip6tables

保存當(dāng)前(包含Docker規(guī)則的)iptables 規(guī)則:

sudo iptables-save > /etc/sysconfig/iptables
sudo ip6tables-save > /etc/sysconfig/ip6tables

此后,iptables 服務(wù)重啟時(shí)會(huì)從這些文件加載規(guī)則,Docker 的規(guī)則得以保留 。

方案四:配置 Docker 使用 host 網(wǎng)絡(luò)模式

在創(chuàng)建容器時(shí)使用 --network host 參數(shù)。在此模式下,容器直接使用宿主機(jī)的網(wǎng)絡(luò)命名空間,沒(méi)有獨(dú)立的網(wǎng)絡(luò)棧,因此不涉及 Docker 創(chuàng)建 iptables 規(guī)則進(jìn)行 NAT 或隔離,從而完全避免了與 firewalld 的規(guī)則沖突 。但此模式犧牲了容器的網(wǎng)絡(luò)隔離性,容器端口直接暴露在主機(jī)上,可能帶來(lái)安全風(fēng)險(xiǎn)。

docker run --network host -d nginx

3. 診斷與臨時(shí)恢復(fù)

當(dāng)問(wèn)題發(fā)生后,可以按以下步驟診斷和臨時(shí)恢復(fù):

檢查容器狀態(tài)和端口映射:

docker ps # 查看容器是否在運(yùn)行
docker port <container_name> # 查看容器的端口映射信息

檢查關(guān)鍵的 iptables 規(guī)則是否丟失:

# 查看NAT表中是否存在Docker相關(guān)的DNAT規(guī)則
sudo iptables -t nat -L -n | grep -A 5 -B 5 DOCKER
# 查看FILTER表中DOCKER-USER等鏈
sudo iptables -L -n | grep -i docker

如果這些鏈存在但規(guī)則為空,或鏈本身缺失,則表明確實(shí)被清空了。

臨時(shí)恢復(fù)重啟 Docker 服務(wù)是最直接的恢復(fù)方法。這會(huì)觸發(fā) Docker 重新創(chuàng)建其所需的 iptables 規(guī)則。

sudo systemctl restart docker

注意:重啟 Docker 服務(wù)會(huì)導(dǎo)致所有正在運(yùn)行的容器停止并重新啟動(dòng)。對(duì)于生產(chǎn)環(huán)境,需評(píng)估影響。重啟后,容器的網(wǎng)絡(luò)訪問(wèn)應(yīng)能恢復(fù) 。

總結(jié)與建議

解決方案核心思想優(yōu)點(diǎn)缺點(diǎn)適用場(chǎng)景
方案一(配置 daemon.json)協(xié)調(diào) Docker 與 firewalld 的規(guī)則管理權(quán)。官方推薦,能兼顧兩者功能,利用 DOCKER-USER 鏈實(shí)現(xiàn)持久化自定義規(guī)則。需要對(duì) iptables 和 firewalld 有一定理解。大多數(shù)生產(chǎn)環(huán)境的推薦選擇。
方案二(firewalld 管理)將容器訪問(wèn)控制完全納入 firewalld 體系。規(guī)則集中管理,與系統(tǒng)防火墻策略統(tǒng)一。配置稍復(fù)雜,需為每個(gè)暴露的端口添加規(guī)則。希望統(tǒng)一使用 firewalld 管理所有網(wǎng)絡(luò)策略的環(huán)境。
方案三(改用 iptables-services)回歸靜態(tài) iptables 規(guī)則管理。規(guī)則持久化簡(jiǎn)單直接,沖突少。失去了 firewalld 的動(dòng)態(tài)管理能力和便利性。不依賴 firewalld 動(dòng)態(tài)特性的傳統(tǒng)環(huán)境。
方案四(host 網(wǎng)絡(luò))繞過(guò) Docker 的網(wǎng)絡(luò)棧和 iptables 規(guī)則。徹底避免沖突,網(wǎng)絡(luò)性能最好。無(wú)網(wǎng)絡(luò)隔離,安全性低。對(duì)網(wǎng)絡(luò)性能要求極高且信任容器內(nèi)應(yīng)用的場(chǎng)景。

最佳實(shí)踐建議:對(duì)于使用 CentOS/RHEL 7+ 且需要同時(shí)運(yùn)行 Docker 和防火墻的系統(tǒng),優(yōu)先采用方案一。確保使用較新版本的 Docker(>=20.10),并不要在 daemon.json 中設(shè)置 "iptables": false。然后,所有針對(duì) Docker 容器的自定義訪問(wèn)控制規(guī)則(如白名單),都通過(guò) iptables 命令添加到 DOCKER-USER 鏈,或者通過(guò)配置 firewalld 的富規(guī)則來(lái)間接管理。這樣既能保證 Docker 基礎(chǔ)網(wǎng)絡(luò)功能,又能使自定義防火墻規(guī)則在 firewalld 重啟后得以保留 。同時(shí),在重啟 firewalld 后,若發(fā)現(xiàn)容器網(wǎng)絡(luò)異常,應(yīng)首先考慮重啟 Docker 服務(wù)(sudo systemctl restart docker)以重建規(guī)則 。

到此這篇關(guān)于Docker與firewalld網(wǎng)絡(luò)沖突解決方案的文章就介紹到這了,更多相關(guān)Docker firewalld網(wǎng)絡(luò)沖突內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Docker構(gòu)建鏡像的兩種方式實(shí)現(xiàn)

    Docker構(gòu)建鏡像的兩種方式實(shí)現(xiàn)

    從 docker 鏡像倉(cāng)庫(kù)中下載的鏡像不能滿足我們的需求時(shí),可以通過(guò)以下兩種方式對(duì)鏡像進(jìn)行更改。本文就詳細(xì)的介紹了這兩種方法,感興趣的可以了解一下
    2021-09-09
  • 最新評(píng)論

    商河县| 绥棱县| 唐河县| 沾化县| 阳春市| 元阳县| 汝阳县| 怀宁县| 乐东| 顺义区| 涞水县| 苗栗市| 池州市| 汉川市| 隆安县| 永修县| 准格尔旗| 吉林市| 泰兴市| 乌兰浩特市| 繁峙县| 灯塔市| 丹巴县| 咸宁市| 图们市| 景谷| 全州县| 巨野县| 镇沅| 宜都市| 社会| 南澳县| 阿克陶县| 偏关县| 靖安县| 汽车| 乡宁县| 若尔盖县| 林西县| 永兴县| 岑溪市|