华子目录
- `firewalld服务`与`iptables服务`区别
- `9`种`firewalld域`
- `firewalld`相关文件
- 常用配置
- `域文件`中的`过滤规则`
- `firewalld`可视化工具`firewall-config`
- 安装
- 使用
- `firewall-cmd`命令行工具
- `firewalld命令生效模式`
- `firewall-cmd参数`
- 参数使用示例
- `--add-service=<服务名>`
- `--remove-service=<服务名>`
- `--add-port=端口号/协议`
- `--remove-port=端口号/协议`
- `--add-source=`
- `--remove-source=`
- `--change-interface=网卡名`
- `编辑域文件`添加`nginx服务`
- `firewalld富规则`
- `firewalld的高级规则`
- `firewalld`做`Linux路由器`
- `内网`主机访问`外网`
- `外网`访问`内网`
firewalld服务与iptables服务区别
iptables是基于Linux内核的netfilter子系统构建的,直接操作netfilter;而firewalld则通过libnftables库与netfilter交互,提供了一个更高的抽象层iptables使用基于表的规则集,包括filter,nat,mangle,raw,security五个表;firewalld采用基于区域的规则集,包括default,public,internal,external,dmz等9个区域iptables的配置较为复杂,需要用户掌握特定的命令行语法;firewalld提供了更直观和灵活的配置方式,支持命令行和图形界面firewalld默认动作是拒绝,则每个服务需要设置允许才能放行,而iptables里默认是每个服务是允许,需要拒绝的才能限制- 由于
firewalld通过libnftables库与netfilter交互,其性能相对于直接操作netfilter的iptables来说较低
9种firewalld域
- 当
开启firewalld后,数据包必须要经过某个域才能入站或出站每个域都有一个处理行为(default、accept、reject、drop)
firewalld域根据信任级别分成9个域
firewalld使用的域是public域
| 区域 | 默认策略规则 |
|---|---|
阻塞区域(block) | 拒绝流入的流量,返回icmp-host-prohibited消息,除非与流出的流量相关(允许ssh) |
工作区域(work) | 拒绝流入的流量,除非与流出的流量相关(允许ssh) |
家庭区域(home) | 拒绝流入的流量,除非与流出的流量相关(允许ssh) |
公共区域(public) | 不相信网络上的任何计算机,只有选择接受传入的网络连接(允许ssh) |
隔离区域(dmz) | 也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用,允许ssh,其余拒绝 |
信任区域(trusted) | 允许所有的数据包 |
丢弃区域(drop) | 拒绝流入的流量,没有任何回复,除非与流出的流量相关 |
内部区域(internal) | 等同于home区域 |
外部区域(external) | 拒绝流入的流量,除非与流出的流量相关(允许ssh) |
firewalld相关文件
firewalld主配置文件/etc/firewalld/firewalld.conffirewalld的配置文件有两个主要的目录/usr/lib/firewalld/zones(系统配置文件,尽量不要修改)和/etc/firewalld/zones(用户配置文件,可以自行修改)- 每个
域单独对应一个xml配置文件,文件名为<zone名称>.xml
[root@server1 ~]# cd /etc/firewalld/
[root@server1 firewalld]# ls
firewalld.conf icmptypes lockdown-whitelist.xml services
helpers ipsets policies zones[root@server1 firewalld]# vim firewalld.conf
DefaultZone=public #设置了默认的防火墙区域
FirewallBackend=nftables #指定了firewalld使用的防火墙后端是nftables
[root@server ~]# cd /usr/lib/firewalld/zones
[root@server zones]# ls
block.xml drop.xml home.xml nm-shared.xml trusted.xml
dmz.xml external.xml internal.xml public.xml work.xml[root@server zones]# cd /etc/firewalld/zones
[root@server zones]# ls
public.xml public.xml.old
常用配置
用法是:
- 把
可信任的IP地址添加到trusted域, - 把
不可信任的IP地址添加到block域, - 把要
公开的网络服务添加到public域,
常用域为:trusted、block、public
域文件中的过滤规则
过滤规则优先级:
source(最高)(IP地址)interface(次之)(接口)默认域(最低)

| 规则 | 作用 |
|---|---|
scources | 源IP地址过滤(常用) |
interfaces | 网卡过滤 |
services | 服务名(实际是关联端口)过滤 |
ports | 端口过滤 |
icmp-block | ICMP报文过滤 |
masquerade | IP地址伪装(nat) |
forward-ports | 端口转发过滤 |
rule | 自定义规则 |
firewalld可视化工具firewall-config
安装
#在firewalld启动的情况下,下载firewall-config包
[root@server ~]# yum install firewall-config -y # 安装图形化界面
使用
# 虚拟机中执行,不要在xshell执行
[root@server ~]# firewall-config

firewall-cmd命令行工具
firewalld命令生效模式
runtime模式:运行时模式,立即生效,重启失效--permanent模式:永久模式,重启生效
firewall-cmd参数
| 参数 | 作用 |
|---|---|
--version | 查看firewalld版本 |
--state | 查看firewalld的状态 |
--zone=<区域名> | 指定区域 |
--get-default-zone | 查询默认的区域名称 |
--set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
--get-zones | 显示可用的区域 |
--get-services | 显示预先定义的服务 |
--get-active-zones | 显示当前正在使用的区域与网卡名称 |
--add-source= | 将来自此IP或网段的流量导向指定的区域 |
--remove-source= | 不再将来自此IP或网段的流量导向某个指定区域 |
--add-interface=<网卡名称> | 将来自该网卡的所有流量都导向某个指定区域(只有没被关联的网卡,才能被添加) |
--change-interface=<网卡名称> | 将某个网卡与区域进行关联 |
--list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
--list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
--add-service=<服务名> | 设置默认区域允许该服务的流量 |
--add-port=<端口号/协议> | 设置默认区域允许该端口的流量 |
--remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
--remove-port=<端口号/协议> | 设置默认区域不再允许该端口的流量 |
--reload | 让永久生效的配置规则立即生效,并覆盖当前的配置规则,和--permanent搭配使用 |
- 如果使用了
--permanent,则一定要使用--reload再加载,否则规则不生效--add-interface中只有没被关联的网卡,才能被添加
参数使用示例
#查看默认区域
[root@server1 ~]# firewall-cmd --get-default-zone
public
#设置默认区域
[root@server1 ~]# firewall-cmd --set-default-zone=trusted
success
[root@server1 ~]# firewall-cmd --get-default-zone
trusted[root@server1 ~]# firewall-cmd --set-default-zone=public
#列出可用的区域
[root@server1 ~]# firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work
# 查看firewalld支持的服务
#(不支持nginx服务,需要手动添加)
[root@server ~]# firewall-cmd --get-services

#正在使用的区域与网卡名称
[root@server1 ~]# firewall-cmd --get-active-zones
publicinterfaces: eth1 eth0
#当前区域的网卡配置参数、资源、端口以及服务等信息
[root@server1 ~]# firewall-cmd --list-all
public (active)target: default #如果流量不匹配任何允许的规则,它将根据默认策略处理icmp-block-inversion: no #ICMP阻塞反转设置为“否”,意味着不会反转ICMP阻塞规则,即按照正常规则处理ICMP流量 interfaces: eth0 eth1 #影响的网络接口eth0和eth1sources: #此处为空,表示没有指定特定的源地址或网络services: cockpit dhcpv6-client ssh #允许的服务ports: #为空,表示没有指定特定的端口或协议protocols: #为空,表示没有指定特定的端口或协议forward: yes #允许转发,意味着此区域允许IP转发masquerade: no #(伪装/NAT),此处设置为“否”,表示不使用伪装(NAT)功能forward-ports: #为空,表示没有指定特定的端口转发规则或源端口source-ports: #为空,表示没有指定特定的端口转发规则或源端口icmp-blocks: #为空,表示没有指定要阻塞的ICMP类型rich rules: #为空,表示没有定义富规则。富规则允许创建更复杂的防火墙规则,可以基于源/目标地址、端口、协议、接口等多种条件

#查看指定区域的网卡配置参数、资源、端口以及服务等信息
[root@server1 ~]# firewall-cmd --zone=trusted --list-all

#所有区域的网卡配置参数、资源、端口以及服务等信息
[root@server1 ~]# firewall-cmd --list-all-zones

--add-service=<服务名>

#添加http服务
[root@server1 ~]# firewall-cmd --add-service=http
success


--remove-service=<服务名>
#移除服务
[root@server1 ~]# firewall-cmd --remove-service=http
success

--add-port=端口号/协议
- 修改
nginx的端口为8080
[root@server1 ~]# firewall-cmd --add-port=8080/tcp
success


--remove-port=端口号/协议
[root@server1 ~]# firewall-cmd --remove-port=8080/tcp
success


--add-source=
[root@server1 ~]# firewall-cmd --permanent --add-source=172.25.254.1/24 --zone=trusted[root@server1 ~]# firewall-cmd --reload


--remove-source=
[root@server1 ~]# firewall-cmd --permanent --remove-source=172.25.254.1/24 --zone=trusted[root@server1 ~]# firewall-cmd --reload


--change-interface=网卡名
[root@server1 ~]# firewall-cmd --get-active-zones
publicinterfaces: eth1 eth0
trustedsources: 172.25.254.0/24
#将网卡与区域进行关联
[root@server1 ~]# firewall-cmd --change-interface=eth1 --zone=trusted
[root@server1 ~]# firewall-cmd --get-active-zones
publicinterfaces: eth0
trustedinterfaces: eth1sources: 172.25.254.0/24
编辑域文件添加nginx服务
- 在
/etc/firewalld/services/下添加nginx.xml文件,编辑完就会生效
# 查看支持的服务列表
[root@server ~]# firewall-cmd --get-services [root@server ~]# yum install nginx -y# 此时添加nginx服务会报错
[root@server ~]# firewall-cmd --permanent --add-service=nginx
Error: INVALID_SERVICE: Zone 'public': 'nginx' not among existing services# 编辑服务配置文件,编辑完就生效
[root@server ~]# vim /etc/firewalld/services/nginx.xml
# 添加如下内容:
<service><short>Nginx</short><description>nginx</description><port protocol="tcp" port="80"/><port protocol="tcp" port="443"/>
</service>[root@server ~]# firewall-cmd --permanent --add-service=nginx [root@server ~]# firewall-cmd --reload #就会发现有nginx的服务
[root@server ~]# firewall-cmd --get-services
firewalld富规则
firewalld富规则:用于更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有正对性的策略配置firewalld富规则优先级最高


# 如:
[root@server ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="源IP" service name="http" reject'
[root@server ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.80.130" protocol value="icmp" reject'[root@server ~]# firewall-cmd --reload [root@server ~]# firewall-cmd --list-all# 测试:定位node1中进行ping 192.168.80.129 发现目标不可达
firewalld的高级规则
- 通过
firewall-cmd工具,可以使用--direct选项在运行时间里增加或者移除链。如果不熟悉iptables,直接使用接口非常危险,因为可能导致防火墙被入侵 直接端口模式适用于服务或程序,以便在运行时间内增加特定的防火墙规则直接端口模式添加的规则优先应用
例子:仅允许172.25.254.1访问主机的8080端口
#查看高级规则
[root@server1 ~]# firewall-cmd --direct --get-all-rules#使用iptables查看链名
[root@server1 ~]# iptables -nL
#添加高级规则
[root@server1 ~]# firewall-cmd --direct --add-rule ipv4 filter IN_public_allow 1 -s 172.25.254.1 -p tcp --dport 8080 -j ACCEPT
#查看
[root@server1 ~]# firewall-cmd --direct --get-all-rules
ipv4 filter IN_public_allow 1 -s 172.25.254.1 -p tcp --dport 8080 -j ACCEPT
#移除高级规则
[root@server1 ~]# firewall-cmd --direct --remove-rule ipv4 filter IN_public_allow 1 -s 172.25.254.1 -p tcp --dport 8080 -j ACCEPT
firewalld做Linux路由器
准备2台主机
- 一台
server1,一个nat网卡,一个仅主机网卡 - 一台
server2,一个仅主机网卡
内网主机访问外网


[root@server2 ~]# route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[root@server1 ~]# firewall-cmd --permanent --add-masquerade[root@server1 ~]# firewall-cmd --reload
- 测试
[root@server2 ~]# ping www.baidu.com
PING www.a.shifen.com (183.2.172.42) 56(84) 比特的数据。
64 比特,来自 183.2.172.42 (183.2.172.42): icmp_seq=1 ttl=127 时间=32.9 毫秒
64 比特,来自 183.2.172.42 (183.2.172.42): icmp_seq=2 ttl=127 时间=33.2 毫秒
64 比特,来自 183.2.172.42 (183.2.172.42): icmp_seq=3 ttl=127 时间=32.5 毫秒
外网访问内网
- 当访问
server1的22端口时,实际登录的是server2
[root@server1 ~]# firewall-cmd --add-forward-port=port=22:proto=tcp:toport=22:toaddr=192.168.0.200

- 测试

