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

背景

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

 

分析

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

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

 

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

175c569c2b1d4a1f8a83cab8631b95d8.png 

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

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

 

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

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

iptables-save > /etc/sysconfig/iptables

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

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

 

总结

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

 


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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 06:58:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 06:58:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 06:58:04       87 阅读
  4. Python语言-面向对象

    2024-04-27 06:58:04       97 阅读

热门阅读

  1. STM32用HAL库函数实现硬件IIC

    2024-04-27 06:58:04       33 阅读
  2. *Python中的异常处理:try-except-else-finally详解

    2024-04-27 06:58:04       32 阅读
  3. Django杂记之数据查询和文件处理

    2024-04-27 06:58:04       25 阅读
  4. 【开发记录】arm v7配置青龙面板

    2024-04-27 06:58:04       32 阅读
  5. Django用户注册并自动关联到某数据表条目

    2024-04-27 06:58:04       32 阅读
  6. mpv编译播放器无视频输出

    2024-04-27 06:58:04       34 阅读
  7. “npm error code ELSPROBLEMS“问题解决

    2024-04-27 06:58:04       41 阅读
  8. 二分搜索法

    2024-04-27 06:58:04       36 阅读
  9. 前端点击地图上的位置获取当前经纬度

    2024-04-27 06:58:04       26 阅读
  10. LeetCode 每日一题 ---- 【2739.总行驶距离】

    2024-04-27 06:58:04       35 阅读