背景
我创建的容器使用的是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服务了,查看服务的状态:
服务的启动状态为fail。当然这个并不影响iptables命令的执行,因为它是二进制文件。我们只要断开了iptables操作系统内核的防火墙钩子就行了,不必删除iptables命令。
现在就再也不怕手动不小心启动了iptables服务,也不怕其他进程启动了防火墙了。那么我们只需要管理宿主机的防火墙即可。
总结
容器和宿主机都有防护墙,不仅会增加管理的复杂度,而且很容易出错。不仅如此,在设置防火墙规则给容器做动态端口映射时,还会被容器内的防护墙阻断。所以为了彻底规避这个问题,避免因为容器重启后或者其他进程启动了防火墙,我们直接彻底移除iptables防火墙,就可以防患于未然了。
原文地址: http://www.yu7s.com/article/20240418111446390.html