相信很多使用Centos7的朋友和我一样,都是删除默认的firewalld服务,而重新安装iptables做为防火墙。这一篇文章我们一起来看看如何修改iptables规则以及如何使得修改的iptables规则永久生效。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
前提条件
这篇文章的前提条件是centos7机器已经按照下面方法删除了firewalld服务,并安装了iptables。同时将iptables设置为了开机自启动
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service
sudo yum -y install iptables-services
sudo systemctl start iptables.service
sudo systemctl enable iptables.service
修改iptables的两种方式
修改配置文件
配置文件的路径为/etc/sysconfig/iptables
,直接编辑这个文件,例如在该文件最上面的规则插入一条允许80端口的规则
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
之后如果想马上生效,需要重启iptables服务
systemctl restart iptables
再查看iptables规则的时候会发现刚才的规则已经生效了,如下最上面那条
[root@k8s-master sysconfig]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
51 3152 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
1 229 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 30 packets, 3520 bytes)
pkts bytes target prot opt in out source destination
之后通过reboot
命令重启机器,之后查看iptables规则发现修改的规则依然生效。
这说明直接修改iptables的配置文件会永久生效。
命令行
除了直接修改配置文件,也可以命令行快速修改规则。尤其是在批量用脚本修改iptables的场合命令行会更适用一些。
例如直接在命令行添加了一个允许443端口的规则
[root@k8s-master ~]# iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
[root@k8s-master ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
535 38884 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
192 32397 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 30 packets, 1940 bytes)
pkts bytes target prot opt in out source destination
可以看到命令跑完就直接生效,但是命令对应的规则并没有被写到配置文件里面,所以开机以后就失效了。
那么该如何保存命令行修改的规则呢?
保存命令行修改的规则
第一种方法
执行命令service iptables save
,如下
[root@k8s-master ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
之后查看下配置文件,发现新的规则被写进了配置文件中,并且里面还写了是通过命令行写入的
# Generated by iptables-save v1.4.21 on Sun Apr 26 22:00:57 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4:440]
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sun Apr 26 22:00:57 2020
之后再重启机器就依然是生效的了。
第二种方法
执行命令iptables-save > xxx
写入到一个文件,开机以后执行命令iptables-restore < xxx
用来恢复。
例如删除掉刚才配置文件里面的443端口那条命令,然后将完整规则保存到别的目录
[root@k8s-master sysconfig]# iptables-save > /tmp/iptables.bak
[root@k8s-master sysconfig]# cat /tmp/iptables.bak
# Generated by iptables-save v1.4.21 on Sun Apr 26 22:24:10 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [351:44722]
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sun Apr 26 22:24:10 2020
之后在/etc/rc.d/rc.local
中添加如下命令
/usr/sbin/iptables-restore < /tmp/iptables.bak
之后给rc.local
文件添加可执行权限使得可以被开机运行
chmod a+x rc.local
再开机就会发现虽然配置文件没有更改,但是规则还是生效了。但是这样子有一个弊端,因为真正保存完整规则的并不是配置文件,而是另外的一个文件,如果运维人员没有记录好容易造成问题。
总结
总结一下两种修改iptables规则的方法:
- 直接修改配置文件
- 命令行修改规则
而其中直接修改配置文件会自动永久生效,通过命令行修改规则可以用下面两种方法永久生效:
service iptables save
iptables-save
和iptables-restore
以及开机文件/etc/rc.d/rc.local
我个人比较建议的方式是,少量更改可以考虑修改配置文件,大量批量修改用命令行然后用service iptables save
保存到配置文件中。