Linux重启防火墙后容器网络无法被访问的解决办法

背景

在系统运行的时候,可能会操作防火墙的配置,可能重启防火墙。不料,重启防火墙之后,却导致运行在上面的容器无法被访问了。只能重启docker服务后才正常。

分析

docker实现容器的服务能被外部访问,借助的是iptables的请求转发。主要涉及到DNAT的端口转换,即nat表的规则。

在docker启动服务的时候,会根据已有的容器的端口映射和容器IP,在nat表中添加DNAT的端口映射规则,并开启ipv4的转发。这样容器的服务就可以被外部网络访问了。

同时,再将容器对外部的访问通过SNAT进行源IP的转换(MASQUERADE),使容器可以访问外部的网络。

当我们重启iptables之后,就会发现,容器就无法访问外部网络,外部网络也无法访问容器了。

因为docker服务启动的时候,会创建上面的规则,而且是临时创建的,包括ipv4转发。所以如果重启iptables服务之后,这些规则就被清除了。而如果再重启网络后,ipv4转发的配置也会被清除。这样就导致容器的转发网络就失效了。

为了解决这个问题,我们就需要将docker创建的防火墙规则永久存储下来。

下面是永久保存防火墙规则的命令:

iptables-save > /etc/sysconfig/iptables

而ipv4转发的配置的永久保存,请参考《Linux重启网络后导致容器网络无法连接的解决办法》。

这样就再也不怕重启防火墙和重启网络了,也不怕系统重启了。

总结

docker服务启动时会临时创建防火墙规则和ipv4转发,但是重启防火墙就会清除这些临时规则,导致容器网络被破坏。我们需要将这些配置永久存储起来,就不怕重启操作了。


原文地址: http://www.yu7s.com/article/20240422201137749.html

相关推荐
Fcy6482 分钟前
Linux下 应⽤层⾃定义协议与序列化(JSON方法)
linux·json
UseLessQQ4 分钟前
云原生 kubernetes 中的service
云原生·容器·kubernetes
koi77u21 分钟前
嵌入式学习————————TCP并发服务器(1)
linux·学习
毕竟是shy哥28 分钟前
windows电脑WSL下本地构建docker镜像
windows·docker·容器
小灰灰搞电子2 小时前
Rust 相关容器(集合)详解
开发语言·容器·rust
上学的小垃圾8 小时前
基于docker安装MySQL(openEuler系统)
linux·mysql·docker·容器
一直C10 小时前
Linux网络编程|HTTP协议详解(报文、请求方法、状态码)
linux·http·wireshark·vim·visual studio
Brilliantwxx12 小时前
【Linux】 进程(10) 进程控制深度解析:创建、终止与等待
linux·运维·服务器·c语言·开发语言·网络
欧米欧13 小时前
Linux基础指令上
linux·运维·服务器
ARM|X86+FPGA工业主板厂家14 小时前
基于嵌入式 GPU 的智能服务机器人
linux·运维·arm开发·fpga开发·机器人