inux防火墙主要工作在网络层,属于典型的包过滤防火墙。在rhel中常用的有两种火墙工具iptables和firewalld,但软件本身其实并不具备防火墙功能,他们的作用都是在用户空间中管理和维护规则,只不过规则结构和使用方法不一样罢了,真正利用规则进行过滤是由内核netfilter完成的。
netfilter ip 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的 链(chain)中。我马上会详细讨论这些规则以及如何建立这些规则并将它们分组在链中。
在rhel7里有几种防火墙共存:firewalld、iptables、ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。如下图:
iptables和firewalld的区别
-
与直接控制 iptables 相比,使用 firewalld 有两个主要区别:
firewalld 使用区域和服务而不是链式规则。
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时须关闭并冻结firewalld
yum install iptables-services
systemctl mask firewalld
systemctl enable --now iptables.service
保存策略
** 方法一**
iptables-save > /etc/sysconfig/iptables
方法二
service iptables save
iptables命令
iptables
-t ##指定表名称
-n ##不做解析
-l ##查看
-a ##添加策略
-p ##指定协议
–dport ##指定目的地端口
-s ##指定来源
-j ##指定动作
accept ##允许
drop ##丢弃
reject ##拒绝
snat ##源地址转换
dnat ##目的地地址转换
-f ##清空表中策略
-n ##新建链
-e ##更改链名称
-x ##删除链
-d ##删除规则
-i ##插入规则
-r ##更改规则
-p ##更改默认规则
注意:火墙策略是由上到下读取,当第一条与第二条发生冲突时,第一条策略生效。
查看表filter策略
清空策略,在input链中指定允许所有,查看策略(默认查看filter)
删除input链中的第一条策略
iptables -p input drop 改变input链的默认状态为丢弃
指定协议为tcp,端口为22的被允许
firewalld的开启与关闭
systemctl disable --now iptables.service 关闭
systemctl unmask firewalld.service 解冻
systemctl enable --now firewalld.service 开启
systemctl mask iptables.service 冻结
firewall的模式
trusted | 信任模式:接受所有连接 |
home | 家庭网络:允许ssh,mdns, ipp-client, samba-client, dhcp-client |
work | 工作网络:允许ssh, ipp-client, dhcp-client |
public | 公共模式:ssh,dhcp-client |
dmz | 军工级:ssh |
block | 拒绝所有 |
drop | 丢弃,所有的连接都不回复 |
intter | 内部网络:ssh,mdns,ipp-client,samba-client |
externa | l ipv4网络地址伪装发送 sshd |
管理命令
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