RHEL7系统中存在两种类型的防火墙: iptables和firewalld,严格意义上讲,iptables和firewalld都不是真正的防火墙,它们只是用来定义防火墙策略的管理工具而已。
iptables会把配置好的防火墙策略交给内核层面的 netfilter 处理;firewalld把配置好的防火墙策略交给内核层层面的nftables包过滤框架处理。
防火墙以从上向下的顺序来读取配置的策略规则,在找到匹配项后立即结束匹配工作病区执行匹配项中定义的行为(放行或阻止)。若在读取所有策略规则后没有匹配项,就执行默认策略。
iptables服务把用于处理过滤流量的策略称之为规则,多条规则组成了一个规则链,规则链按照数据包处理位置的不同进行分类,可分为:
- 数据路由前处理数据包 — PREROUTING
- 数据流入时处理 — INPUT
- 数据流出时处理 — OUTPUT
- 输出转法时处理 — FORWARD
- 数据路由后处理 — POSTROUTING
通常从内网向外网发送的数据都是良性的,通常需要处理的是从外网流向内网的数据,也就是INPUT规则链。iptables对不同数据的处理动作有:
- ACCEPT — 允许流量通过
- REJECT — 拒绝流量通过,且回复流量发送方被拒绝
- LOG — 记录日志信息
- DROP — 直接将流量丢弃,不响应发送方
iptables命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成功就会根据策略规则所预设的动作来处理这些流量,以下是常见的参数:
参数 | 作用 |
---|---|
-P | 设置默认策略 |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 将规则加入规则链末尾 |
-I | 将规则插入规则链头部 |
-s | 匹配源地址,加"!"表示除这个ip外 |
-d | 匹配目的地址 |
-i 网卡名称 | 匹配从这块网卡流入的数据 |
-o 网卡名称 | 匹配从这块网卡流出的数据 |
-p | 匹配协议,如tcp、udp、icmp |
-j | 指定该条规则的行为,有ACCEPT、REJECT、LOG、REJECT |
–dport | 匹配目标端口号 |
–sport | 匹配源端口号 |
查看已有防火墙规则 iptables -L
其中的policy ACCEPT表示默认动作是放行, target是对具体规则的动作,prot是协议,source是源地址,destination是目的地址
清空已有防火墙规则 iptables -F
设置指定规则链的默认动作 iptables -P 规则链名称 ACCEPT/REJECT/LOG/DROP
以上把INPUT规则链设置为drop后,xshell就无法连接到该目标linux主机了,此时ping该台主机也直接timed out
需要注意的是规则链的默认拒绝动作只能是DROP,而不能是REJECT。
在平常工作中,经常使用ping来检查目的主机是否在线,可以向防火墙的INPUT规则链中添加一条允许ICMP流量进入的规则,允许ping命令检测行为
向规则链中插入规则: iptables -I 规则链名 规则
(以下命令在linux主机上执行)
然后在ping该台主机就可以ping通了
删除规则链中指定的规则 iptables -D 规则链名 规则索引(从1开始)
把INPUT规则链设置为只允许指定网段的主机访问本机的22端口,拒绝来自其他所有主机的流量:
注意第一条规则使用选项 -I 将其插入到规则链头部,第二条规则使用 -A 将其添加到规则链尾部,这是因为防火墙策略规则是按照从上到下的顺序匹配的,因此一定要把允许动作放到拒绝动作前面,否则所有流量都将被拒绝。
向INPUT规则链中添加拒绝所有人访问主机18001端口的规则:
向INPUT规则链中添加拒绝192.168.56.104主机访问本机80端口(通常为web服务)的规则:
向INPUT规则链中添加拒绝所有主机访问本机 1000~1024端口的规则:
需要注意的是,使用iptables命令配置的防火墙规则默认在系统重启后失效,若想要防火墙策略永久生效,需要执行命令 service iptables save