添加规则的两个常用选项:
-A,在末尾追加规则。
-I,在指定位置前插入规则。如果不指定,则在首行插入
添加新的防火墙规则时,使用管理选项“-A”、“-I”,前者用来追加规则,后者用来插入规则。
例如,若要在 filter 表 INPUT 链的末尾添加一条防火墙规则,可以执行以下操作(其中 “-p 协议名”作为匹配条件)。
[root@localhost ~]# iptables -F #清空规则
如果不写表名和链名,默认清空filter表中所有链里的所有规则
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j REJECT #禁止所有主机ping本机
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j ACCEPT #允许ping通,-A在前一条规则后添加
#匹配到了就不在匹配后面的规则
[root@localhost ~]# iptables -t filter -I INPUT 1 -p icmp -j ACCEPT #指定序号插入,插入到第一条
#即时生效
[root@localhost ~]# iptables -t filter -A INPUT -p tcp -j REJECT #禁止任何主机tcp
[root@localhost ~]# iptables -I INPUT 1 -p udp -j ACCEPT #允许任何主机udp
[root@localhost ~]# iptables -nL --line-number #查看行规则的位置
#拒绝某一台主机,其他的可以:
[root@localhost ~]# iptables -t filter -A INPUT -s 192.168.233.22 -p icmp -j REJECT
#拒绝多台主机:
[root@localhost ~]# iptables -t filter -A INPUT -s 192.168.233.22,192.168.233.23 -p icmp -j REJECT
#不允许21的数据包出去,其他的就都ping不通了
[root@localhost ~]# iptables -t filter -A OUTPUT -s 192.168.233.21 -p icmp -j REJECT
#指定端口:
[root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j REJECT
#协议在前,指定端口号在后,否则识别不了端口,无法匹配就会报错!
[root@localhost ~]# iptables -t filter -A INPUT -s 192.168.233.22 -p tcp --dport 22 -j REJECT
#指定IP地址的服务端口拒绝
[root@localhost ~]# iptables -t filter -A INPUT --dport 22 -p tcp -j REJECT #错误的写法
iptables v1.4.21: unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
练习,写一个禁止192.168.233.22:80的端口入访问:
[root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 80 -j REJECT
[root@localhost ~]# iptables -t filter -A INPUT -s 192.168.233.22 -p tcp --dport 80 -j REJECT
删除规则
D删除 :
1.根据序号删除内容
[root@localhost ~]# iptables -D INPUT 1 #删除指定的INPUT链中的第一条规则
2、内容匹配删除(有两个相同的则作用为去重) 如果有两个重复的规则,则删除序号较小的
[root@localhost ~]# iptables -D INPUT -p icmp -j REJECT #删除序号小的
演示删除序号较小的
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j REJECT
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j ACCEPT
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j REJECT
[root@localhost ~]# iptables -nL INPUT --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
[root@localhost ~]# iptables -D INPUT -p icmp -j REJECT #第二次就时删除指定。
[root@localhost ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
注意:按照内容匹配删除规则,只能每次删除内容相同序号较小的规则。
直到删除最后一条时,才能将该规则全部清除 。
一定要报保证该匹配的内容存在,且完全匹配规则才能删除,不然报错。
修改规则 (不推荐使用)
-R 直接修改。
为了保险起见,我们可以尝试着先添加一条新的规则,
确保新规则不会带来任何不利的影响再删除旧的规则(也能达到替换的效果)
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j ACCEPT
[root@localhost ~]# iptables -nL INPUT --line-number #查看规则
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
[root@localhost ~]# iptables -R INPUT 1 -p icmp -j REJECT #替换
[root@localhost ~]# iptables -nL INPUT --line-number #ACCEPT替换成了REJECT
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
修改默认规则:
默认策略是指四表五链中链的默认策略,INPUT,FORWARD,OUTPUT,filter三条链的默认值为ACCEPT
就像是设定黑名单一样,默认其他的协议操作都是允许的,只有指定加入的且声明权限的为(DROP 或 REJECT)
是拒绝禁止的对象。
[root@localhost ~]#iptables -P INPUT DROP
[root@localhost ~]# iptables -t filter -A INPUT -p ICMP -j ACCEPT #在主机配置一条允许的,
相当与设置了白名单
1.-F 仅仅是清空链中的规则,并不影响 -P 设置的规则,默认规则需要手动进行修改
2.-P 设置了DROP后,使用 -F 一定要小心!
#防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决
此时的解决方案有三种:
第一种:我的防火墙设置只是临时设置,并为保存,重启服务器即可
第二种:操作服务器,重启iptables服务
第三种:进入机房操作该服务器(将设置恢复,重新修改规则)炸!
在生产中都是默认DROP
通用匹配:
网络协议、IP地址、网络接口等条件。
协议匹配: -p协议名
地址匹配: -s 源地址、-d目的地址
#可以是IP、网段、域名、空(任何地址)
接口匹配: -i入站网卡、-o出站网卡
感叹号”!”表示取反
网络协议:
[root@localhost ~]# iptables -A INPUT ! -p icmp -j ACCEPT #除了icmp以外,所有的协议都可以进入
#这是假的取反。定义的默认策略还在执行ACCEPT,只有该变默认策略,才能生效
[root@localhost ~]#iptables -P INPUT DROP #这时候才能取反
#其他的服务不受影响,这个时候,把策略清空,所有的协议都将被DROP
[root@localhost ~]#iptables -F
#只能进虚拟机重启
IP地址:
[root@localhost ~]# iptables -A INPUT -s 192.168.233.22 -j DROP #禁止22的数据进入
网络接口:
[root@localhost ~]# iptables -I INPUT 1 -i ens33 -s 192.168.233.0/24 -j DROP #禁止指定的网络设备名称ens33的所有网段
#怎么使整个网段不能用指定的端口
[root@localhost ~]# iptables -t filter -A INPUT -s 192.168.233.0/24 -p tcp --dport 80 -j REJECT #禁止整个网段访问80端口
隐藏扩展模块
iptables在使用-p 指定协议时,若指明特定协议后就无须再使用-m指明扩展模块的扩展机制。
例如若已经指明是 -p tcp协议则使用--dport及--sport等tcp模块内容时即可省略-m tcp。
端口匹配:
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22:80 -j REJECT #禁止整个网段访问22和80端口
#这里写发要注意,小的数字写在前面,大的写在后面
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80:22 -j REJECT #大的在前,小的在后,报错
iptables v1.4.21: invalid portrange (min > max)
Try `iptables -h' or 'iptables --help' for more information.
ICMP模块
ICMP类型可以是字符串、数字代码:
ICMP类型 含义
Echo-Request (代码为8) 表示请求
Echo--Reply (代码为0) 表示回显 #回复信息显示
Dest ination-Unreachable (代码为3) 表示目标不可达
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j REJECT #拒绝请求 其他的主机都不能ping本机,本机还是可以ping其他主机
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j REJECT #拒绝回显,本机ping不了其他的主机,且没有任何显示
#其他的主机还是ping通本机,因为出入的数据并没有被屏蔽,只针对自己。
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT ##当本机ping 不通其它主机时提示目标不可达,需要其他主机设置REJECT
在23上设置拒绝,才能生效,了解即可
[root@localhost ~]# iptables -A INPUT -s 192.168.233.21 -p icmp -j REJECT
显示匹配:
1、多端口匹配
要求以“-m 扩展模块”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件
-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j REJECT
多端口匹配,一次性禁止多个tcp网络协议的端口匹配规则
[root@localhost ~]# iptables -A INPUT -p udp -m multiport --dport 53,54,55 -j ACCEP
多端口匹配,一次性放通多个udp网络协议的端口匹配规则
2、IP范围匹配
-m iprange --src-range 源IP范围
-m iprange --dst-range 目的IP范围
[root@localhost ~]# iptables -A INPUT -p icmp -m iprange --src-range 192.168.233.20-192.168.233.30 -j REJECT
#禁止网段内的ip地址ping主机
3、MAC匹配
该方式范围过于有限,且操作不方便,用的不多,了解即可
-m mac --mac-source MAC地址
[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:f7:24:38 -j DROP
备份与还原iptables规则设置
yum -y install iptables iptables-services
systemctl start iptables.service
systemctl enable iptables.service
我们对iptables命令行中的设置,都是临时设置,只要遇到服务器关机,或者服务重启时,
所有的设置都会清空且还原为原本的设置。
为此,我们可以对已经测试完毕符合我们需求的防火墙设置进行备份,在必要时,可以一键还原
备份iptables设置
格式:iptables-save >/指定的文件
[root@localhost ~]# iptables-save >/opt/iptables.bak
一键导入,设置为当前防火墙设置
[root@localhost ~]#iptables-restore </opt/iptables.bak
修改iptables的默认设置
iptables的默认配置文件存在于 cat /etc/sysconfig/iptables
直接把配置导入配置文件:cat /opt/iptables.bak >/etc/sysconfig/iptables
#立即生效了,实验环境下,了解就可以了。不要尝试
[root@localhost opt]# systemctl restart iptables #重启之后生效的就是配置文件中的内容,操作需谨慎,
注意拍快照,方便还原