红帽系的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和IPv6
  • source 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的其他配置冲突或者混淆,容易造成规则不生效的状况

这个功能已经被标记弃用了,在未来的版本中会被移除掉

posted @ 2024-08-29 17:14  厚礼蝎  阅读(73)  评论(0编辑  收藏  举报