红帽系的linux系统中防火墙--firewalld
firewalld简介
- firewalld是Red Hat系列Linux发行版(如Fedora、CentOS等)引入的一种动态防火墙管理工具,它充当了 Linux 内核的 Netfilter 框架的前端,具体防火墙执行是由内核的netfilter来执行的。
- firewalld提供了一个基于区域(zone)和服务(service)的简化配置界面,使得管理防火墙规则更加容易。
- 它支持动态更新防火墙规则,可以在运行时添加、删除、修改规则,而不需要重新加载整个防火墙配置。
- firewalld的配置文件位于 /etc/firewalld/ 目录下,主要是一些XML格式的文件,如 zones、services、richrules 等。
安装
firewalld是红帽系的linux系统的默认防火墙,是默认安装的,一般不需要手动安装的。
yum install firewalld firewall-config
firewalld管理
启动服务
systemctl start firewalld
systemctl restart firewalld
设置开机自启、禁用开机自启
systemctl enable firewalld
systemctl disabled firewalld
停止服务
systemctl stop firewalld
查看服务状态
systemctl status firewalld
# 或者
firewall-cmd --state
查看版本
firewall-cmd --version
firewalld中的区域
相比于其他防火墙工具,firewalld引入了区域(Zone)概念。
firewalld将所有的网络数据流量划分为多个区域,从而简化防火墙管理。
根据数据包的源IP地址或传入网络接口等条件,将数据流量转入相应区域的防火墙规则。
对于进入系统的数据包,首先检查的就是其源地址.
- 若源地址关联到特定的区域,则执行该区域所制定的规则.
- 若源地址未关联到特定的区域,则使用传入网络接口的区域并执行该区域所制定的规则.
- 若网络接口未关联到特定的区域,则使用默认区域并执行该区域所制定的规则.
默认区域不是单独的区域,而是指向系统上定义的某个其他区域。
默认情况下,默认区域是 Public
,但是系统管理员可以更改默认区域。
以上匹配规则,按照先后顺序,匹配到就不再匹配后面的规则。
预定义的区域
区域 | 名称 | 说明 |
---|---|---|
trusted | 信任区域 | 允许所有网络通信通过 |
public | 公共区域 | 只接受那些被选中的连接,默认只允许ssh和dhcpv6-client,这个zone是缺省zone |
work | 工作区域 | 除非与传出流量相关,或者与ssh、ipp-client、dhcpv6-client预定义服务匹配的传入流量,其他均拒绝 |
home | 家庭区域 | 除非与传出流量相关,或者与ssh、mdns、ipp-client、samba-client或dhcpv6-client预定义服务匹配的传入流量,其他均拒绝 |
internal | 内部区域 | 与home相同 |
external | 外部区域 | 除非与传出流量相关,否则除了ssh以外的流量都会被拒绝。 |
dmz | 隔离区域 | 除非与传出流量相关,否则除了ssh以外的流量都会被拒绝 |
drop | 丢弃区域 | 除非与传出流量相关,否则丢弃所有传入流量,并且不产生包含icmp的错误响应 |
block | 限制区域 | 除非与传出流量相关,否则拒绝所有流入流量 |
区域管理
获取所有可用区域
$ firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work
获取当前活动的区域
$ firewall-cmd --get-active-zones
public
interfaces: enp0s3 enp0s8
获取默认区域
$ firewall-cmd --get-default-zone
public
获取区域的规则
# 获取默认区域的规则
firewall-cmd --list-all
# 获取所有区域的规则
firewall-cmd --list-all-zones
# 获取指定区域的规则
firewall-cmd --list-all --zone=home
区域中的网卡
# 获取网卡所在的区域
firewall-cmd --get-zone-of-interface=enp0s3
# 为网卡绑定区域
firewall-cmd --zone=区域名称 --add-interface=网卡名称
# 修改绑定
firewall-cmd --zone=区域名称 --change-interface=网卡名称
# 删除绑定
firewall-cmd --zone=区域名称 --remove-interface=网卡名称
设置默认区域
firewall-cmd --set-default-zone=home
注意:
后面其他的所有操作都是基于区域的操作
只要命令中不携带区域,那么就是对默认区域的操作
特殊参数
--permanent
表示永久生效,但是当前不生效--reload
重新加载防火墙规则,使更改生效--runtime-to-permanent
将当前的运行时配置写入规则配置文件中,使之成为永久性配置。--panic-on
拒绝所有包,如果是远程连接的,会立即断开连接,谨慎使用 不过不会永久生效,重启服务就会恢复--panic-off
取消拒绝状态--query-panic
查看是否拒绝所有包
将源地址添加到区域
# 添加
firewall-cmd --add-source=源地址 --zone=区域名
# 删除
firewall-cmd --remove-source=源地址 --zone=区域名
服务管理
查看服务
# 查看默认区域的允许服务
firewall-cmd --list-services
# 查看指定区域的允许服务
firewall-cmd --zone=home --list-services
# 查看所有可被使用的服务
firewall-cmd --get-services
添加服务
# 给home区域添加http服务,并且是永久保存
firewall-cmd --zone=home --add-service=http --permanent
# 给默认区域添加服务http,当前生效
firewall-cmd --add-service=http
# 同时添加多个服务
firewall-cmd --add-service={http,https,ntp,ftp}
删除服务
# 删除默认区域中的http服务,临时生效
firewall-cmd --remove-service=http
# 删除home区域中的http服务,永久保存,但当前不生效
firewall-cmd --zone=home --remove-service=http --permanent
# 同时删除多个服务
firewall-cmd --remove-service={http,https,ntp,ftp}
查询指定服务是否开启
# 查看当前区域的http服务是否开启,其他区域可以指定--zone=来查询
firewall-cmd --query-service=http
自定义服务
可通过xml文件来创建
--new-service-from-file=<filename> [--name=<service>]
根据已有xml文件来创建
也可以通过命令行创建--new-service=<service>
注意:
一定要加上--permanent
# 创建一个名为test的服务
firewall-cmd --new-service=test --permanent
# 为这个服务添加端口
firewall-cmd --service=test --add-port=9090/tcp --permanent
firewall-cmd --service=test --add-source-port=10001-10003/tcp --permanent
firewall-cmd --service=test --add-protocol=udp --permanent
# 添加注释
firewall-cmd --service=test --set-description='This is a test service !' --permanent
firewall-cmd --service=test --set-short="this is short" --permanent
# 重载,才能通过--get-services看到
firewall-cmd --reload
# 查看服务
$ cat /etc/firewalld/services/test.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>this is short</short>
<description>This is a test service !</description>
<port port="9090" protocol="tcp"/>
<protocol value="udp"/>
<source-port port="10001-10003" protocol="tcp"/>
</service>
# 查看服务的简要信息
firewall-cmd --info-service=test
# 查看服务路径
firewall-cmd --path-service=test --permanent
# 删除服务
firewall-cmd --delete-service=test --permanent
# 都需要重新加载
firewall-cmd --reload
自定义服务的使用有预定义的服务用法相同
端口管理
查看端口
# 查看当前默认区域的开放端口
firewall-cmd --list-ports
# 查看指定区域的开放端口情况
firewall-cmd --list-ports --zone=home
# 检查端口是否开放
firewall-cmd --query-port=88/tcp
# 检查多个端口
# 检查多个连续的端口
firewall-cmd --query-port=80-84/tcp
# 检查多个非连续端口
firewall-cmd --query-port={88,90}/tcp
firewall-cmd --query-port={88/tcp,77/udp}
# 指定区域查询端口
firewall-cmd --query-port=88/tcp --zone=home
添加端口
firewall-cmd --add-port=8080/tcp
firewall-cmd --zone=home --add-port=8080/tcp --permanent
firewall-cmd --add-port=8080-8099/tcp --permanent
# 添加多个非连续端口
firewall-cmd --add-port={88,90}/tcp
firewall-cmd --add-port={88/tcp,77/udp}
删除端口
firewall-cmd --remove-port=8080/tcp
firewall-cmd --zone=home --remove-port=8080/tcp --permanent
firewall-cmd --remove-port=8080-8099/tcp --permanent
# 删除多个非连续端口
firewall-cmd --remove-port={88,90}/tcp
firewall-cmd --remove-port={88/tcp,77/udp}
拒绝日志
# 开启记录所有的拒绝日志
firewall-cmd --set-log-denied=all
# 查询拒绝日志的状态
firewall-cmd --get-log-denied
数据转发
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.0.1 # 将80端口的流量转发至192.168.0.1
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口
如果是转发到远程端口,一定要开启伪装IP,否则,无法正常回包,导致访问失败
伪装IP
firewall-cmd --query-masquerade # 检查是否允许伪装IP
firewall-cmd --add-masquerade # 允许防火墙伪装IP
firewall-cmd --remove-masquerade # 禁止防火墙伪装IP
富规则 rich-rule
查看富规则
firewall-cmd --list-rich-rules
# 指定区域
firewall-cmd --list-rich-rules --zone=home
创建富规则
# 允许10.1.0.12访问本地的tcp 80端口
firewall-cmd --add-rich-rule="rule family='ipv4' source address='10.1.0.12' port port=80 protocol=tcp accept"
# 拒绝来自10.1.0.12的ping包
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.1.0.12" protocol value="icmp" drop'
# 拒绝所有的ping包
firewall-cmd --add-rich-rule='rule protocol value=icmp drop'
# 拒绝所有的ping包,并永久生效
firewall-cmd --add-rich-rule='rule protocol value=icmp drop' --permanent
firewall-cmd --reload
# 丢弃掉来自10.1.0.12的ssh服务相关的包
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.1.0.12 service name=ssh drop'
# 拒绝所有IPv4 UDP流量的53端口访问。
firewall-cmd --add-rich-rule='rule family="ipv4" port protocol="udp" port="53" drop'
# 拒绝所有从eth0网络接口进入的IPv4流量。
firewall-cmd --add-rich-rule='rule family="ipv4" source interface="eth0" drop'
# 指定区域myzone,仅在工作时间(例如 9AM 到 6PM)允许特定源 IP 访问本地的6379端口,并永久生效
firewall-cmd --zone=myzone --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port=6379 protocol=tcp time daytime from="09:00" to="18:00" accept' --permanent
firewall-cmd --reload
# 允许源地址为10.1.0.12来访问目标地址为10.1.0.16的50000端口
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.1.0.12 port port=50000 protocol=tcp destination address=10.1.0.16 accept'
参数说明
--add-rich-rule=
值表示一条规则,规则必须以rule
关键字开头family=
指定该规则仅应用于什么协议的数据包上:可选项 IPv4和IPv6source address=
设置源地址source interface=
设置源接口destination address=
设置目标地址port port=
设置目标端口 设置端口的同时需要指定协议 所以一般格式是port port=50000 protocol=tcp
protocol value=
指的是匹配的协议,例如 ping包是icmp协议,那就是protocol value=icmp
service name=
指定匹配的服务time daytime
设置时间reject/drop/accept
指定动作,拒绝/丢弃/允许
删除规则
需要完整的写出规则
firewall-cmd --remove-rich-rule='rule family=ipv4 source address=10.1.0.12 port port=50000 protocol=tcp destination address=10.1.0.14 accept'
direct
可以直接设置iptables的规则
例如
在INPUT链的顶部(0)添加一条允许10.1.0.12访问本地的80端口的规则
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 10.1.0.12 -p tcp -m multiport --dport 80 -j ACCEPT
然后通过iptables查看
但是要注意的是 这样设置很容易与firewalld的其他配置冲突或者混淆,容易造成规则不生效的状况
这个功能已经被标记弃用了,在未来的版本中会被移除掉
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/18387095