docker容器内彻底移除iptables服务的实现方法

背景

我创建的容器使用的是centos6的标准镜像,所以内置了iptables服务。容器启动后iptables服务默认就启动了。iptables设置的规则默认是所有流量都无法通行。而对于服务器的管理使用的是宿主机的防火墙。这样就导致在实现用iptables动态给容器添加端口映射时不成功的现象,后来发现是容器内的防火墙阻断了。因为容器的防火墙和宿主机的防火墙会同时起作用,在设置防火墙有关的规则时经常会遇到问题,需要将容器内外的防火墙都进行设置。甚至会造成防火墙管理上的混乱。即使将防火墙设置为开机不自启,也关闭了防火墙服务。但是无法保证人为手动重启过防火墙或某些进程会重启防护墙,从而导致防火墙管理的规则出现问题。所以最好的办法就是干掉防火墙。

 

分析

iptables 是 Linux 操作系统中用于配置和管理网络防火墙规则的工具。它允许管理员定义规则集,以控制网络流量的传入、传出和转发。iptables 主要用于实现网络安全策略,如阻止未经授权的访问、过滤恶意流量、实现端口转发等。

 

iptables是Linux内置的工具,iptables管理的系统的防火墙使用了一个iptables的伪服务程序(真服务程序是后台常驻的,这个没有常驻)。所以在卸载上会比较麻烦。iptables服务只是一组脚本而已。关于防火墙服务的概念的理解,请阅读《一文讲明白iptables和firewall的区别》。

 

iptables的服务的配置文件在:/usr/lib/systemd/system/iptables.service

文件内容:

[Unit]                                                                                                                                                                                                              

Description=IPv4 firewall with iptables

After=syslog.target

AssertPathExists=/etc/sysconfig/iptables

 

[Service]

Type=oneshot

RemainAfterExit=yes

ExecStart=/usr/libexec/iptables/iptables.init start

ExecReload=/usr/libexec/iptables/iptables.init reload

ExecStop=/usr/libexec/iptables/iptables.init stop

Environment=BOOTUP=serial

Environment=CONSOLETYPE=serial

 

[Install]

WantedBy=basic.target

iptables这里的服务使用的是/usr/libexec/iptables/iptables.init 脚本。因为iptables只是使用这个脚本模拟的服务的操作,所以感觉似乎iptables服务是真实的,但是iptables并没有常驻的后台进程。

 

换句话说,iptables的服务只是操作上和服务一样,便于操作和管理。iptables有一个二进制的命令文件。再配合这个模拟的服务配置iptables.service ,这个配置里使用了iptables.init 脚本,实现了服务的启停等操作。

 

所以,我们要彻底停止iptables服务,不能像卸载软件那样来操作。

 

彻底移除iptables服务的方法:

1. 停止已运行的iptables服务

systemctl stop iptables  # centos7

service iptables stop  # centos6

停止iptables服务并不是真停止iptables服务,而是通过iptables解除内核的防火墙钩子,取消对流量的过滤功能。如果不先取消,直接移除服务,其实防火墙钩子没有解除,依然会对流量进行过滤。

 

2.禁止服务开机启动

systemctl disable iptables # centos7

rm -f /etc/systemd/system/basic.target.wants/iptables.service  # centos6

iptables的开机启动是在/etc/systemd/system/basic.target.wants目录中添加了一个软链文件:

/etc/systemd/system/basic.target.wants/iptables.service -> /usr/lib/systemd/system/iptables.service

这个软链指向了/usr/lib/systemd/system/iptables.service,就是开头说的服务配置文件。

centos6中没有systemctl命令,service不支持disable,所以直接手动删除一下即可,效果一样。

禁止开启启动是免得每次开机都有报错。

 

3.移除iptables服务的配置文件

mv /usr/lib/systemd/system/iptables.service /usr/lib/systemd/system/iptables.service.bak

你可以使用rm命令删除,也可以使用mv命令更换名字。反正只要默认的标准文件名称的文件不存在就行了。

 

这样操作之后,再也启动不了iptables服务了,查看服务的状态:

c5ed66d7998c436fbfc0c08c8f58ccf8.png

 

 

服务的启动状态为fail。当然这个并不影响iptables命令的执行,因为它是二进制文件。我们只要断开了iptables操作系统内核的防火墙钩子就行了,不必删除iptables命令。

 

现在就再也不怕手动不小心启动了iptables服务,也不怕其他进程启动了防火墙了。那么我们只需要管理宿主机的防火墙即可。

 

总结

容器和宿主机都有防护墙,不仅会增加管理的复杂度,而且很容易出错。不仅如此,在设置防火墙规则给容器做动态端口映射时,还会被容器内的防护墙阻断。所以为了彻底规避这个问题,避免因为容器重启后或者其他进程启动了防火墙,我们直接彻底移除iptables防火墙,就可以防患于未然了。


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

相关推荐

  1. 容器服务docker 映射服务

    2024-04-24 06:28:08       29 阅读
  2. ubuntusnap

    2024-04-24 06:28:08       52 阅读
  3. 通过iptables限制docker 容器运行端口

    2024-04-24 06:28:08       36 阅读
  4. docker配置容器访问主机服务

    2024-04-24 06:28:08       64 阅读
  5. Docker容器服务访问宿主机中MySql服务

    2024-04-24 06:28:08       25 阅读

最近更新

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

    2024-04-24 06:28:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-24 06:28:08       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-24 06:28:08       82 阅读
  4. Python语言-面向对象

    2024-04-24 06:28:08       91 阅读

热门阅读

  1. zabbix图形乱码解决方案

    2024-04-24 06:28:08       35 阅读
  2. nginx日志自定义和统计处理

    2024-04-24 06:28:08       37 阅读
  3. Unity 线程相关知识

    2024-04-24 06:28:08       43 阅读
  4. uniapp 搜索内容关键字高亮

    2024-04-24 06:28:08       31 阅读
  5. c++ reinterpret_cast类型转换简单实验

    2024-04-24 06:28:08       32 阅读
  6. 基于Python的智能语音识别系统设计

    2024-04-24 06:28:08       31 阅读
  7. spring boot项目怎么预防CSRF攻击

    2024-04-24 06:28:08       34 阅读
  8. 【MongoDB】--MongoDB的组合索引

    2024-04-24 06:28:08       32 阅读
  9. mongodb分片集群搭建

    2024-04-24 06:28:08       29 阅读