概述

inux防火墙主要工作在网络层,属于典型的包过滤防火墙。在RHEL中常用的有两种火墙工具iptables和firewalld,但软件本身其实并不具备防火墙功能,他们的作用都是在用户空间中管理和维护规则,只不过规则结构和使用方法不一样罢了,真正利用规则进行过滤是由内核netfilter完成的。
netfilter IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的 链(chain)中。我马上会详细讨论这些规则以及如何建立这些规则并将它们分组在链中。
iptables和firewalld的区别

  • 与直接控制 iptables 相比,使用 FirewallD 有两个主要区别:

1. FirewallD 使用区域和服务而不是链式规则。

2. FirewallD可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。

  • Firewalld 跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。

  • iptables 服务在 /etc/sysconfig/iptables 中储存配置,而 FirewallD 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里,使用 iptables 的时候每一个单独更改意味着清除所有旧有的规则和从 /etc/sysconfig/iptables 里读取所有新的规则,使用 firewalld 却不会再创建任何新的规则;仅仅运行规则中的不同。因此 FirewallD 可以在运行时改变设置而不丢失现行配置。

火墙策略之三链五表

netfilter是Linux 2.4内核引入的全新的包过滤引擎。由一些数据包过滤表组成,这些表包含内核用来控制信息包过滤的规则集。iptables等等都是在用户空间修改过滤表规则的便捷工具。

netfilter在数据包必须经过且可以读取规则的位置,共设有5个控制关卡。这5个关卡处的检查规则分别放在5个规则链中(有的叫钩子函数(hook functions)。也就是说5条链对应着数据包传输路径中的5个控制关卡,链中的规则会在对应的关卡检查和处理。任何一个数据包,只要经过本机,必然经过5个链中的某个或某几个。

PREROUTING 数据包刚进入网络接口之后,路由之前 
INPUT 数据包从内核流入用户空间。 
FORWARD 在内核空间中,从一个网络接口进入,到另一个网络接口去。转发过滤。 
OUTPUT 数据包从用户空间流出到内核空间。 
POSTROUTING 路由后,数据包离开网络接口前。 

默认表  表中存放数据 
filter

经过本机内核的所有数据(input output forward) 

nat 不经过内核的数据(postrouting prerouting input output) 
mangle 当filter和nat表不够用时使用,表中记录对链数据的补充解释说明(input output forward postrouting prerouting) 

iptables的使用

因为防火墙之间存在冲突,所以在使用iptables时须关闭并冻结firewalld

yum install iptables-servicessystemctl mask firewalldsystemctl enable --now iptables.service

保存策略

 方式一

iptables-save > /etc/sysconfig/iptables

方式二

service iptables save

iptables 命令参数

参数 含义
-t 定表名称
-n 不做解析
-L 查看
-A 添加策略
-p 指定协议
–dport 指定目的地端口
-s 定来源
-j 指定动作
ACCEPT 允许
DROP 
REJECT  拒绝
SNAT  源地址转换
DNAT 目的地地址转换
-F 清空表中策略
-N 新建链
-E 更改链名称
-X 删除链
-D 删除规则
-I 插入规则
-R 更改规则
-P 更改默认规则

注意:火墙策略是由上到下读取,当第一条与第二条发生冲突时,第一条策略生效。

操作案例

1. 查看表filter策略

iptables -t filter -nL

2清空所有策略

iptables -t filter -F

3指定INPUT链允许所有

iptables -A INPUT -j ACCEPT

看策略(默认查看filter)

iptables -nL

4删除INPUT链中的第一条策略

iptables -D INPUT 1

查看策略(默认查看filter)

iptables -nL

5.改变INPUT链的默认状态为丢弃,执行完改行命令后linux客户端会断开连接

iptables -P INPUT DROP

图片

6. 指定协议为tcp,端口为22的被允许,这次可再次通过客户端连接linux

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

查看策略(默认查看filter)

iptables -nL

图片

firewalld的使用

开启

systemctl enable --now firewalld.service

关闭

systemctl disable --now iptables.service

冻结

systemctl mask iptables.service

解冻

systemctl unmask firewalld.service

trusted (信任区域) 放通所有传入流量
home (家庭区域) 允许ssh、ipp-slient、mdns、saba-client或dhcpv6-client预定义服务匹配的传入流量,其余全部回绝
work  (工作区域) 允许ssh、ipp-slient、dhcpv6-client预定义服务匹配的传入流量,其余统统请回
public (公共区域) 允许ssh或dhcpv6-client预定义类服务匹配的传入流量,其余统统请回
dmz  (隔离区域) 外网 -> dmz -> 防火墙 -> 内网 允许ssh预定义服务匹配的传入流量,其余统统请回
block  (限制区域) 和trusted 相反它会拒绝所有传入流量
drop  (丢弃区域) 丢弃所有传入流量,包括包含ICMP的错误响应
internal  (内部区域) 默认值时与home区域相同
externa

 (外部区域) 用于外部流量传入,其余全部请回

常用命令选项参数

–get-default-zone 显示当前默认区域
–set-default-zone=<zone> 设置某区域为默认区域
–get-active-zone 查看当前使用的区域和对应的网卡接口
–get-zone 显示所有可用区域
–get-zone-of-interface=<interface> :显示指定接口绑定的区域
–zone=<zone> –add-interface=<interface> :为指定接口绑定区域
–zone=<zone> –change-interface=<interface> :为指定的区域更改绑定的网络接口
–zone=<zone> –remove-interface=<interface> :为指定的区域删除绑定的网络接口
–get-zone-of-source=<source>[/<mask>] :显示指定源地址绑定的区域
–zone=<zone> –add-source=<source>[/<mask>] :为指定源地址绑定区域
–zone=<zone> –change-source=<source>[/<mask>] :为指定的区域更改绑定的源地址
–zone=<zone> –remove-source=<source>[/<mask>] :为指定的区域删除绑定的源地址
–list-all-zones :显示所有区域及其规则
[–zone=<zone>] –list-all :显示所有指定区域的所有规则,省略–zone=<zone>:时表示仅对默认区域操作
[–zone=<zone>] –list-services :显示指定区域内允许访问的所有服务
[–zone=<zone>] –add-service=<service> :为指定区域设置允许访问的某项服务
补充内容:–add-service={http,https}
加上大括号可以一次性添加多个服务
[–zone=<zone>] –remove-service=<service> :删除指定区域已设置的允许访问的某项服务
[–zone=<zone>] –list-ports :显示指定区域内允许访问的所有端口号
[–zone=<zone>] –add-port=<portid>[-<portid>]/<protocol> :为指定区域设置允许访问的某个/某段端口号(包括协议名)
[–zone=<zone>] –remove-port=<portid>[-<portid>]/<protocol> :删除指定区域已设置的允许访问的端口号(包括协议名)
[–zone=<zone>] –list-icmp-blocks :显示指定区域内拒绝访问的所有 ICMP 类型
[–zone=<zone>] –add-icmp-block=<icmptype> :为指定区域设置拒绝访问的某项 ICMP 类型
[–zone=<zone>] –remove-icmp-block=<icmptype> :删除指定区域已设置的拒绝访问的某项ICMP类型
firewall-cmd –get-icmptypes :显示所有 ICMP 类型
 

常用管理命令

  •     firewall-cmd --state    ##查看火墙状态    firewall-cmd --get-active-zones    ##查看当前火墙中生效的域    firewall-cmd --get-default-zone    ##查看默认域    firewall-cmd --list-all    ##查看默认域中的火墙策略    firewall-cmd --list-all --zone=work    ##查看指定域的火墙策略    firewall-cmd --set-default-zone=trusted    ##设定默认域    firewall-cmd --get-services    ##查看所有可以设定的服务    firewall-cmd --permanent --remove-service=cockpit    ##移除服务(刷新后生效)    firewall-cmd --reload    重启服务    firewall-cmd --permanent --add-source=172.25.254.0/24 --zone=block    ##指定数据来源访问指定域    firewall-cmd --reload        firewall-cmd --permanent --remove-source=172.25.254.0/24 --zone=block    ##删除自定域中的数据来源    firewall-cmd --permanent --remove-interface=ens224 --zone=public    ##删除指定域的网络接口    firewall-cmd --permanent --add-interface=ens224 --zone=block    ##添加指定域的网络接口    firewall-cmd --permanent --change-interface=ens224 --zone=public    ##更改网络接口到指定域

高级规则

firewall-cmd –direct –get-all-rules :查看高级规则

firewalld中的NAT地址转换

firewall-cmd –add-masquerade
firewall-cmd –reload