firewall防火墙--rhel8
软防火墙注意点!!!
iptables
和firewad
,ufw
等Linux防火墙都属于软防火墙
;
软防火墙只能控制内核管理的流量,有些网卡如果不受内核管理
,那么软防火墙的规则无法应用.
例如:云生态环境下,有些网卡的流量非常大,甚至可能高达千G万G
,内核处理不过来,云厂商可能会不让内核管理网卡,而使用专门的应用程序来管理,比较流行的解决方案是dpdk
.
如果想了解dpdk,可以参考 https://cloud.tencent.com/developer/article/1198333
禁用iptables
# 注销iptables服务
systemctl mask --now iptables
# # 注销ip6tables服务
systemctl mask --now ip6tables
# 注销ebtables服务
systemctl mask --now ebtables
# 开机自启firewalld服务并现在启动
systemctl enable --now firewalld
firewall-config图形化工具–没必要
RHEL8
默认不提供firewall-config
图形化工具.可以自己行安装
# 安装firewall-config图形化工具
## 生产环境下连GUI都不用,怎么会用firewall-config
yum install firewall-config -y
firewall-cmd防火墙特性
firewall
多了一个 zone
的概念,可以理解为模板.
zone
的边界取决于网卡,一个网卡只能使用一个zone
,zone
的边界就是属于该zone
的网卡.
firewalld
的zone
里面有网卡,有规则(rule)
,如果一个网卡属于firewalld
的某个zone
,那么这个zone
里面的所有规则
都会应用到该zone
的网卡.
Centos7
的firewalld
的底层是调用iptables
实现的;
rhel8
的firewalld
的底层是调用xtables-nft-multi
实现的,rhel8
的iptables
实际上是xtables-nft-multi
的软链接。
RHEL8
关掉firewalld
服务后,iptables -L
是没内容的.
firealld概念关键词
网卡. zone, 规则
zone
包含网卡
和规则
网卡在zone
里面就应用这个zone
的规则
firewalld的区域(zone)
区域
: 防火墙守护进程使用称为“区域” 的实体管理规则组。区域基本上是一组规则,根据计算机连接到的网络的信任级别,规定应允许哪些网络流量。网络接口被分配一个区域,以指示防火墙应允许的行为。从最不信任到最受信任的顺序,防火墙中的预定义区域是:
• drop(丢弃)
:最低信任级别。所有传入连接在没有回复的情况下丢弃,并且只能进行传出连接。
• block(限制)
:与上述类似,但传入请求不是简单地丢弃连接,而是使用 或 消息被拒绝。
• public(公共)
:表示公共、不受信任的网络。您不信任其他计算机,但可能会根据情况允许选定的传入连接。
• external(外部)
:使用防火墙作为网关时的外部网络。它配置为 NAT 伪装,以便你的内部网络保持私有但可访问。
• internal(内部)
:外部区域的另一侧,用于网关的内部部分。计算机是相当值得信赖的,一些额外的服务是可用的。
• dmz
: 用于位于 DMZ 中的计算机(无法访问网络其余部分的隔离计算机)。仅允许某些传入连接。
• work(工作)
:用于工作机器。信任网络中的大多数计算机。可能允许使用更多服务。
• home(家)
:家庭环境。它通常意味着你信任大多数其他计算机,并且将接受更多服务。
• trusted(受信任)
:信任网络中的所有计算机。最开放的可用选项,应谨慎使用。
firewalld防火墙服务基本操作
firewall-cmd
常用参数: https://wangchujiang.com/linux-command/c/firewall-cmd.html
# 显示当前防火墙是否运行
firewall-cmd --state
# 防火墙服务开机自启
systemctl enable --now firewalld.service
# 关闭防火墙服务
systemctl stop firewalld.service
# 关闭防火墙开机自启服务
systemctl disable --now firewalld.service
# 重载防火墙规则
firewall-cmd --reload
防火墙的几种动作
常见的4
种动作:
ACCEPT
放行REJECT
拒绝DROP
丢弃流量,不响应LOG
记录日志
zone的基本操作
一个网卡不可以配置多个zone
;
每个网卡只能绑定一个zone
查看zone
# 查看当前zone
firewall-cmd --get-default-zone
# 查看活动的zone
firewall-cmd --get-active-zones
# 查看指定网卡的当前zone
firewall-cmd --get-zone-of-interface=eth0
# 查看public zone的所有规则(rule)
firewall-cmd --zone=public --list-all
查看所有的zone
# 查看所有的zone
firewall-cmd --list-all-zones
列出缺省zone的规则
# 列出缺省zone的规则
firewall-cmd --list-all
列出zone中的网卡
# 列出缺省zone中的网卡
firewall-cmd --list-interfaces
修改zone
许多的场景
都可以直接切换zone实现
,而不需要太多的操作。
修改网卡的所属zone
# 修改网卡的所属zone
# 将ens3从public修改为external
firewall-cmd --zone=external --change-interface=ens3
从zone中移除/添加网卡
# 从zone中移除网卡
[rhel8 root ~]# firewall-cmd --remove-interface=ens224
success
# 列出zone中的网卡
[rhel8 root ~]# firewall-cmd --list-interfaces
ens160
# 添加网卡到zone中
[rhel8 root ~]# firewall-cmd --add-interface=ens224
success
# 查看zone中的网卡列表
[rhel8 root ~]# firewall-cmd --list-interfaces
ens160 ens224
设置默认zone
# 切换默认zone
## 将zone切换到白名单模式,会放行所有流量
firewall-cmd --set-default-zone=trusted
## 将默认zone修改为drop,不响应人和数据包
firewall-cmd --set-default-zone=drop
# 查看默认zone
firewall-cmd --get-default-zone
切换默认zone
为trusted
–放行所有流量
Firewall
的默认zone
是public
,只放行了ssh
,http
和https
等常用服务的端口;
切换默认zone
为trusted
,会放行所有端口
。
# 将zone切换到白名单模式,会放行所有流量
firewall-cmd --set-default-zone=trusted
# 持久化配置
firewall-cmd --set-default-zone=trusted --per
当前生效(默认模式)和永久生效
Runtime(当前生效,默认模式)
默认是当前生效:配置完后立即会生效,但是重启防火墙服务和重载防火墙规则后会丢失该规则(rule)
Premanent(永久生效)
永久生效:当前不会生效,
重启防火墙后
才一直生效
设置Premanent后,可以用–reload 使其立即生效。
# 重载防火墙规则
firewall-cmd --reload
panic(紧急模式)
紧急模式就是
立即断网
# 查看是否紧急模式
firewall-cmd --query-panic
# 启动紧急模式--立即断网
firewall-cmd --panic-on
# 停止紧急模式
firewall-cmd --panic-off
将当前生效的规则修改永久生效(慎用)
建议的操作是敲一遍临时规则,确认无误后再敲一边规则.
# 将当前运行的临时规则设置为永久规则
firewall-cmd --runtime-to-permanent
查看规则(rule)
查看zone的所有规则
# 不加zone就是查看缺省zone
firewall-cmd --list-all
# 查看home zone的所有规则
firewall-cmd --list-all --zone=home
## interfaces: ens160 ens224
# 如果一个zone中没有网卡,这个zone就是非active状态,就没有意义
# zone中有网卡才会处于active状态
查看zone中的端口号规则(rule)
# 查看public zone中有哪些端口号规则(rule)
firewall-cmd --zone=public --list-ports
## 打印8000-8888/tcp
配置配置
添加80端口到当前zone–永久生效
# 添加80端口到当前zone
firewall-cmd --add-port=80/tcp
# 添加80端口到当前zone--永久生效
firewall-cmd --add-port=80/tcp --permanent
添加一组端口号到指定zone
# 添加8000---8888 端口到 pulic zone
firewall-cmd --zone=public --add-port=8000-8888/tcp
# 添加8000---8888 端口到 pulic zone 并永久生效
firewall-cmd --zone=public --add-port=8000-8888/tcp --permanent
放行ip/网段
# 放行192.168.1.1单个源IP的访问
firewall-cmd --add-source=192.168.1.1
firewall-cmd --add-source=192.168.1.1 --per
# 移除上述规则
firewall-cmd --remove-source=192.168.1.1
firewall-cmd --remove-source=192.168.1.1 --per
放行一个网段
# 放行一个网段
firewall-cmd --add-source=192.168.1.0/24
firewall-cmd --add-source=192.168.1.0/24 --per
# 移除一个网段规则
firewall-cmd --remove-source=192.168.1.0/24
firewall-cmd --remove-source=192.168.1.0/24 --per
从zone中删除规则(rule)
从默认zone中删除service规则(rule)
# 删除service
firewall-cmd --remove-service=https
从默认zone中删除端口规则
# 查看端口规则
[rhel8 root ~]# firewall-cmd --list-ports
333/tcp 333/udp
# 删除端口规则
[rhel8 root ~]# firewall-cmd --remove-port=333/tcp
success
[rhel8 root ~]# firewall-cmd --remove-port=333/udp
success
# 查看删除后的端口规则
[rhel8 root ~]# firewall-cmd --list-ports
从指定zone中删除规则(rule)
# 从zone中删除规则(rule)
firewall-cmd --zone=public --remove-serivce=https
# 查看zone中是否有对应规则(rule)
[rhel8 root ~]# firewall-cmd --query-service=https
# 打印no
no
services规则
services
规则只能放行默认端口的服务.这取决于/usr/lib/firewalld/services
目录下的xml
文件中如何定义端口
[rhel8 root /usr/lib/firewalld/services]# cat http.xml
防火墙服务规则文件http.xml
的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>WWW (HTTP)</short>
<description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
<port protocol="tcp" port="80"/>
</service>
services
的xml
文件可以自行修改
和创建
,修改
和创建
完后需要重启firewalld
才能加载新的services
# 重启firewalld服务
systemctl restart firewalld
查看services规则
# 查看services规则
[rhel8 root ~]# firewall-cmd --list-services
cockpit dhcpv6-client mdns samba-client ssh
查看zone当中是否放行指定services
# 查看zone当中是否放行http services
firewall-cmd --zone=public --query-service=http
## 打印yes 或no
# 查看永久生效规则(rule)中是允许https services
firewall-cmd --premanent --zone=public --query-service=https
## 打印 yes/no
在指定zone中添加services
# 将http services添加到zone中 到放行列表中
firewall-cmd --zone=public --add-service=http
# 添加services后 查看zone当中是否放行http services
firewall-cmd --zone=public --query-service=http
## 打印 yes
删除servers规则
# 删除services规则ftp
[rhel8 root ~]# firewall-cmd --remove-service=ftp
success
在指定zone中添加services并永久生效
# 将ftp services添加到zone中的永久生效 允许列表中
[rhel8 root ~]# firewall-cmd --list-services
cockpit dhcpv6-client ftp mdns samba-client ssh
# 更新防火墙规则
firewall-cmd --reload
# 添加完services后,在永久生效规则(rule)中查看是否允许ftp services
firewall-cmd --premanent --zone=public --query-service=ftp
## 打印 yes
端口规则
查看端口规则
[rhel8 root ~]# firewall-cmd --list-ports
333/tcp 333/dup
添加端口规则
# 放行tcp协议的333端口
[rhel8 root ~]# firewall-cmd --add-port=333/tcp
success
# 放行udp协议的333端口
[rhel8 root ~]# firewall-cmd --add-port=333/udp
success
# 查看所有规则
[rhel8 root ~]# firewall-cmd --list-all
home (active)
target: default
icmp-block-inversion: no
interfaces: ens160 ens224
sources:
services: cockpit dhcpv6-client mdns samba-client ssh
ports: 333/tcp 333/udp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
端口转发规则
查看端口转发规则列表
# 查看端口规则列表
firewall-cmd --list-forward-ports
# 查看永久端口规则列表
firewall-cmd --list-forward-ports --per
添加DNAT端口转发规则
端口转发,在路由器里一般叫端口映射
将访问本机的指定端口转发到远端IP的指定端口
# 将本机的888端口转发到192.168.10.10:22端口
firewall-cmd --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
firewall-cmd --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10 --per
# 将来源为网段192.168.20.0/24访问的80/tcp端口转发到192.168.20.1:3128
firewall-cmd --add-forward-port=port=80:proto=tcp:source=192.168.20.0/24:toaddr=192.168.20.1:toport=3128
firewall-cmd --add-forward-port=port=80:proto=tcp:source=192.168.20.0/24:toaddr=192.168.20.1:toport=3128 –per
删除DNAT端口转发规则
# 删除转发
firewall-cmd --remove-forward-port=port=222:proto=tcp:toport=22:toaddr=192.168.32.129
firewall-cmd --remove-forward-port=port=222:proto=tcp:toport=22:toaddr=192.168.32.129 --per
# 查看端口规则列表
firewall-cmd --list-forward-ports
port=222:proto=tcp:toport=22:toaddr=192.168.32.129
# 查看永久端口规则列表
firewall-cmd --list-forward-ports
port=222:proto=tcp:toport=22:toaddr=192.168.32.129 --per
允许SNAT(源地址转换)
# 允许防火墙伪装IP
## masquerade SNAT源地址转换
firewall-cmd --add-masquerade
firewall-cmd --add-masquerade --permanent
# iptable等价命令
iptables -t nat -A POSTROUTING -j MASQUERADE
SNAT(源地址转换)富规则
# 内部访问外部,将source ip为src_net网段来的数据包伪装成external(即ens0)的地址
firewall-cmd --zone=external --add-rich-rule='rule family="ipv4" source address="<src_net/mask>" masquerade'
# 永久策略
firewall-cmd --zone=external --add-rich-rule='rule family="ipv4" source address="<src_net/mask>" masquerade' --per
Firewall创建iptables规则
# 开启直接
## --direct 直接向底层iptables防火墙添加规则
## --passthrough ipv4 指示iptables使用IPv4协议。
## -t nat 指示iptables使用nat表。
## -A POSTROUTING -A 追加,将规则添加到POSTROUTING链的末尾。
## -o eth0 将规则应用于出口网卡eth0的数据包。
## -j MASQUERADE 将source add源地址进行Masquerade(NAT)转换
firewall-cmd --direct --passthrough ipv4 -t nat -A POSTROUTING -o eth0 -j MASQUERADE
firewall-cmd --direct --passthrough ipv4 -t nat -A POSTROUTING -o eth0 -j MASQUERADE --permanent
Firewalld富规则(rich rules)
Firewalld最高级的规则。
相比于基本规则,富规则能够更准确
地匹配网络流量
,可以根据源地址
、目标地址
、端口
、协议
、服务类型
等更精细地控制网络访问。
另外,富规则还支持更复杂的逻辑操作,如AND
、OR
、NOT
、MATCH
等,可以将多个条件组合起来进行强大的网络过滤
。
富规则保存目录
Firewalld富规则
默认主目录
是/usr/lib/firewalld/
,将其中的规则应用到防火墙应用程序。而Firewalld富规则
的默认配置文件目录
为/etc/firewalld
, 用户创建的富规则
可以放置在该目录
下,再通过xml #include
方式加载。
查看富规则
[rhel8 root ~]# firewall-cmd --list-rich-rules
## 打印结果
rule family="ipv4" source address="192.168.32.0/24" port port="22" protocol="tcp" reject
添加富规则
拒绝指定网段访问某个服务
# 添加一条富规则
## --add-rich-rule 表示添加一条富规则
## rule family="ipv4" 表示协议组是IPV4
## source address="192.168.10.0/24" 表示源ip地址/源ip地址段
## service name="ssh" services名称是ssh
# 拒绝32网段访问ssh服务
firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.32.0/24' service name='ssh' reject"
放行指定网段访问某个端口
## --add-rich-rule 表示添加一条富规则
## rule family="ipv4" 表示协议组是IPV4
## source address="192.168.10.0/24" 表示源ip地址/源ip地址段
## service name="ssh" services名称是ssh
# 放行10.89.64.0/24的53/udp端口
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.89.64.0/24" port port="53" protocol="udp" accept'
允许指定IP访问本地指定端口
## --add-rich-rule 表示添加一条富规则
## rule family="ipv4" 表示协议组是IPV4
## source address="192.168.10.0/24" 表示源ip地址/源ip地址段
## service name="ssh" services名称是ssh
# 允许指定IP访问本机8080端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.1" port protocol="tcp" port="8080" accept'
# 允许指定IP段访问本机8080-8090端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="8080-8090" accept'
禁止指定IP访问本机指定端口
## --add-rich-rule 表示添加一条富规则
## rule family="ipv4" 表示协议组是IPV4
## source address="192.168.10.0/24" 表示源ip地址/源ip地址段
## service name="ssh" services名称是ssh
# 禁止指定IP访问本机8080端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.1" port protocol="tcp" port="8080" reject'
更新防火墙规则
# 更新防火墙规则
firewall-cmd --reload
删除富规则
## --add-rich-rule 表示添加一条富规则
## rule family="ipv4" 表示协议组是IPV4
## source address="192.168.10.0/24" 表示源ip地址/源ip地址段
## service name="ssh" services名称是ssh
# 先查看富规则
firewall-cmd --list-rich-rules
# 删除富规则
## 要删除的富规则格式与富规则列表中的格式一致
firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.32.0/24" port port="22" protocol="tcp" reject'