Linux firewall 防火墙 常用命令
Linux firewall 防火墙 常用命令
一、firewall 命令目录
# ===== firewall 启动与停止 =====
systemctl status firewalld # 查看防火墙状态
systemctl stop firewalld # 关闭防火墙
systemctl start firewalld # 启动防火墙
systemctl disable firewalld # 关闭防火墙自动启动
systemctl enable firewalld # 开启防火墙自动启动
firewall-cmd --version # 查看防火墙版本 (防火墙处于启动状态)
firewall-cmd --reload # 重启防火墙
firewall-cmd --complete-reload # 完全重启防火墙(一般不使用)
firewall-cmd --state # 查看防火墙状态
# ===== firewall 开放关闭端口 =====
firewall-cmd --zone=public --list-ports # 查看指定区域所有打开的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent # 在指定区域永久打开端口(记得重启防火墙)
firewall-cmd --zone=public --remove-port=3306/tcp --permanent # 在指定区域永久关闭端口(记得重启防火墙)
# ===== firewall 流量拦截 =====
firewall-cmd --query-panic # 检查恐慌模式状态
firewall-cmd --panic-on # 开启恐慌模式(谨慎使用)
firewall-cmd --panic-off # 恢复正常模式
# =========== firewall 防火墙规则 ===========
# ===== firewall zone 区域 =====
firewall-cmd --list-all # 查看默认区域的详细信息
firewall-cmd --zone=work --list-all # 查看 work 区域的详细信息
firewall-cmd --get-zones # 获取所有区域列表
firewall-cmd --list-all-zones # 查看所有区域的详细信息
firewall-cmd --get-default-zone # 查看当前默认区域
firewall-cmd --set-default-zone=public # 将 public 设置为默认区域
# ===== firewall zone target =====
firewall-cmd --zone=public --get-target --permanent # 查看 public 区域下的 target 属性
firewall-cmd --zone=block --set-target=%%REJECT%% # 设置 block 区域的目标为 %%REJECT%%
# ===== firewall zone icmp-block-inversion ICMP 阻止反转 =====
firewall-cmd --zone=public --query-icmp-block-inversion # 查看 public 区域下的 icmp-block-inversion 属性
firewall-cmd --zone=public --add-icmp-block-inversion # 启用 icmp-block-inversion
firewall-cmd --zone=public --remove-icmp-block-inversion # 禁用 icmp-block-inversion
# ===== firewall zone interfaces 网络接口 =====
ip link show # 查看所有网路接口
firewall-cmd --zone=public --list-interfaces # 查看 public 区域下的所有网络接口
firewall-cmd --zone=public --add-interface=eth0 # 将 eth0 接口分配到 public 区域
firewall-cmd --zone=work --change-interface=eth0 # 将 eth0 接口移动到 work 区域
firewall-cmd --zone=public --query-interface=eth0 # 查询 eth0 是否在 public 区域
firewall-cmd --get-zone-of-interface=eth0 # 查询 etho 所属 区域
firewall-cmd --zone=work --remove-interface=eth0 # 将 eth0 移除 work 区域
# ===== firewall zone sources 源地址 =====
firewall-cmd --zone=public --list-sources # 查看 public 区域下的所有源地址
firewall-cmd --zone=public --add-source=192.168.1.100 # 将源地址 192.168.1.100 添加到 public 区域
firewall-cmd --zone=public --change-source=192.168.1.0/24 # 将子网 192.168.1.0/24 移动到 public 区域 (修改/新增)
firewall-cmd --zone=public --query-source=192.168.1.100 # 查询 192.168.1.100 是否在 public 区域
firewall-cmd --zone=public --remove-source=192.168.1.100 # 将源地址 192.168.1.100 移除 public 区域
# ===== firewall zone service 服务 =====
firewall-cmd --get-services # 查看所有服务列表
firewall-cmd --zone=public --list-services # 查看 home 区域下的所有服务
firewall-cmd --zone=public --add-service=http # 将 http 服务 添加到 public 区域
firewall-cmd --zone=public --query-service=ssh # 查询 ssh 是否存在 public 区域
firewall-cmd --zone=public --remove-service=http # 将 http 服务 移除 public 区域
# ===== firewall zone protocols 协议 =====
firewall-cmd --zone=public --list-protocols # 查看 public 区域下的所有协议
firewall-cmd --zone=public --add-protocol=tcp # 将 tcp 协议 添加到 public 区域
firewall-cmd --zone=public --query-protocol=tcp # 查询 tcp 协议是否存在 public 区域
firewall-cmd --zone=public --remove-protocol=tcp # 将 tcp 协议 移除 public 区域
# ===== firewall zone masquerade IP 地址伪装 =====
firewall-cmd --zone=public --query-masquerade # 查看 public 区域下的 masquerade 属性
firewall-cmd --zone=public --add-masquerade # 启用 masquerade
firewall-cmd --zone=public --remove-masquerade # 禁用 masquerade
# ===== firewall zone forward-ports 端口转发 =====
# 查看 public 区域下的所有端口转发规则
firewall-cmd --zone=public --list-forward-ports
# 将外部端口 80 上的流量转发到内部 IP 192.168.1.100 的端口 8080
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
# 查询 端口转发规则 是否存在 public 区域
firewall-cmd --zone=public --query-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
# 从 public 区域移除将外部端口 80 上的流量转发到内部 IP 192.168.1.100 的端口 8080 的规则
firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
# ===== firewall zone source-ports 源端口 =====
firewall-cmd --zone=public --list-source-ports # 查看 public 区域下的所有源端口
firewall-cmd --zone=public --add-source-port=8080/tcp # 将源端口 8080 上的流量添加到 public 区域
firewall-cmd --zone=public --query-source-port=8080/tcp # 查询源端口8080是否存在 public 区域
firewall-cmd --zone=public --remove-source-port=8080/tcp # 从public区域移除源端口8080 上的流量
# ===== firewall zone icmp-blocks ICMP 类型 =====
firewall-cmd --zone=public --list-icmp-blocks # 查看 public 区域下的所有ICMP类型
firewall-cmd --zone=public --add-icmp-block=echo-request # 将 echo-request 添加到 public 区域
firewall-cmd --zone=public --query-icmp-block=echo-request # 查询 echo-request 是否存在 public 区域
firewall-cmd --zone=public --remove-icmp-block=echo-request # 从 public 区域移除 echo-request
# ===== firewall zone rich rules 高级规则 =====
firewall-cmd --zone=public --list-rich-rules # 查看 public 区域下的所有 rich-rules
# 允许来自 192.168.1.0/24 子网的 HTTP 流量
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="80" protocol="tcp" accept'
# 查询 指定规则 是否存在 public 区域
firewall-cmd --zone=public --query-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'
# 从 public 区域移除 指定规则
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'
二、firewall 启动与停止
2.1 查看防火墙状态
- 命令:
systemctl status firewalld
|firewall-cmd --state
- 作用:这个命令会显示 firewalld 服务的当前状态,包括是否正在运行、最近的日志信息以及其他相关细节。
- 影响:这是一个只读操作,不会对 firewalld 服务的状态进行任何更改。它帮助你了解 firewalld 服务的当前运行情况,包括服务是否已启动、最后一次启动或停止的时间、以及任何可能的错误信息。
# 查看防火墙状态方式1
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-11-27 16:38:46 CST; 3s ago
Docs: man:firewalld(1)
Main PID: 807 (firewalld)
CGroup: /system.slice/firewalld.service
└─807 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
# 查看防火墙状态方式2
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --state
running
2.2 关闭防火墙
-
命令:
systemctl stop firewalld
-
作用:这个命令会立即停止正在运行的 firewalld 服务。一旦执行了这个命令,防火墙将不再对网络流量进行过滤或控制,直到它被重新启动。
-
影响:这个操作是暂时性的。如果系统重启,firewalld 服务会根据它的启用状态自动启动(如果它被设置为开机启动的话)。也就是说,如果你只是使用 systemctl stop firewalld 停止了服务,那么在下一次系统启动时,firewalld 仍然会被加载并运行,除非你采取了额外的措施来禁用它。
# 关闭防火墙
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# systemctl stop firewalld
# 查看防火墙状态
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Wed 2024-11-27 16:41:33 CST; 19s ago
Docs: man:firewalld(1)
Process: 807 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
Main PID: 807 (code=exited, status=0/SUCCESS)
2.3 启动防火墙
-
命令:
systemctl start firewalld
-
作用:这个命令会立即启动 firewalld 服务。如果 firewalld 服务当前没有运行,这个命令会将其启动。
-
影响:这是一个临时性的设置。如果系统重启,firewalld 是否会自动启动取决于它的启用状态。如果 firewalld 被设置为开机启动(使用 systemctl enable firewalld),那么它会在下次系统启动时自动启动;否则,它不会自动启动。
# 启动防火墙
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# systemctl start firewalld
# 查看防火墙状态
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-11-27 16:43:44 CST; 3s ago
Docs: man:firewalld(1)
Main PID: 1291 (firewalld)
CGroup: /system.slice/firewalld.service
└─1291 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
2.4 关闭防火墙自动启动
-
命令:
systemctl disable firewalld
-
作用:这个命令会禁用 firewalld 服务,防止它在系统启动时自动启动。它不会立即停止一个已经运行的服务,而是修改系统的配置,使得 firewalld 不会在未来的系统启动中自动启动。
-
影响:这是一个持久性的设置。即使系统重启,firewalld 也不会自动启动,除非你手动启用了它(使用 systemctl enable firewalld)或者直接启动了它(使用 systemctl start firewalld)。
# 关闭防火墙自动启动
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# systemctl disable firewalld
2.5 开启防火墙自动启动
- 命令:
systemctl enable firewalld
- 作用:这个命令会启用 firewalld 服务,使其在系统启动时自动启动。它会修改系统的配置,创建必要的符号链接,确保 firewalld 在系统启动时被加载。
- 影响:这是一个持久性的设置。即使系统重启,firewalld 也会自动启动,除非你手动禁用了它(使用 systemctl disable firewalld)或者停止了它(使用 systemctl stop firewalld)。
# 开启防火墙自动启动
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# systemctl enable firewalld
2.6 查看防火墙版本
- 命令:
firewall-cmd --version
# 查看防火墙版本 (防火墙处于启动状态)
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --version
0.6.3
2.7 重启防火墙
- 命令:
firewall-cmd --reload
- 作用:重新加载防火墙规则,而不中断现有的连接。这个命令会应用新的配置文件中的规则,同时保持当前活动连接的状态不变。
- 影响:这是一个平滑的重新加载过程,适用于在不中断现有网络连接的情况下更新防火墙规则。它不会断开现有的连接或会话,因此适合在生产环境中使用。
使用场景:当你需要更新防火墙规则但不想中断当前的网络连接时,可以使用这个命令。
# 重启防火墙
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --reload
success
2.8 完全重启防火墙(一般不使用)
- 命令:
firewall-cmd --complete-reload
- 作用:完全重新加载防火墙规则,包括中断现有的连接。这个命令会彻底重新启动 firewalld 服务,导致所有当前的连接和会话被断开。
- 影响:这是一个更激进的重新加载过程,适用于需要完全重新初始化防火墙的情况。由于它会中断现有的连接,因此在生产环境中使用时需要特别小心。
使用场景:当你需要彻底重新初始化防火墙,例如在配置文件发生重大变更或怀疑防火墙状态不一致时,可以使用这个命令。
# 完全重启防火墙
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --complete-reload
success
二、firewall 开放关闭端口
2.1 查看指定区域所有打开的端口
- 命令:
firewall-cmd --zone=public --list-ports
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --list-ports
3306/tcp 27017/tcp
2.2 在指定区域打开端口(记得重启防火墙)
- 命令:
firewall-cmd --zone=public --add-port={port}/tcp --permanent
# 开放端口 3306
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重启防火墙
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --reload
2.3 在指定区域关闭端口(记得重启防火墙)
- 命令:
firewall-cmd --zone=public --remove-port={port}/tcp --permanent
# 关闭端口 3306
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --remove-port=3306/tcp --permanent
# 重启防火墙
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --reload
三、firewall 流量拦截 (恐慌模式)
3.1 检查恐慌模式状态
- 命令:
firewall-cmd --query-panic
- 作用:查询当前是否处于恐慌模式。
# 检查恐慌模式状态
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --query-panic
no
3.2 开启恐慌模式(谨慎使用)
- 命令:
firewall-cmd --panic-on
- 作用:启用恐慌模式,阻止所有网络流量。
- 影响:一旦启用恐慌模式,所有网络连接都会被阻断,包括现有的连接和新的连接请求。系统将完全与外部网络隔离,也会断开本地客户端连接服务器,需要服务器进行重启才会恢复。
- 使用场景:当你怀疑系统受到攻击或存在严重安全问题,需要立即停止所有网络通信时,可以使用这个命令。
# 开启恐慌模式
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --panic-on
3.3 恢复正常模式
- 命令:
firewall-cmd --panic-off
- 作用:禁用恐慌模式,恢复正常网络流量。
- 影响:一旦禁用恐慌模式,所有网络连接将恢复正常,系统将重新允许入站和出站的网络流量。
# 恢复正常模式
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --panic-off
success
四、firewall 防火墙规则
4.1 zone 区域
zone
是 firewalld
中的一个基本概念,用于将网络接口和服务分组,以便应用不同的安全策略。
-
定义:
zone
是一个逻辑分组,用于将网络接口和服务归类,以便应用不同的安全策略。 -
作用: 不同的
zone
可以有不同的默认策略和规则,从而实现更细粒度的流量控制。 -
参数说明:
- target: default — 使用系统的默认行为。
- icmp-block-inversion: no — 不启用 ICMP 阻止反转。
- interfaces: 没有指定网络接口。
- sources: 没有指定源地址。
- services: 允许
dhcpv6-client
和ssh
服务。 - ports: 允许多个 TCP 端口:3306, 27017
- protocols: 没有允许的协议。
- masquerade: no — 不启用 IP 地址伪装。
- forward-ports: 没有端口转发规则。
- source-ports: 没有允许的源端口。
- icmp-blocks: 没有阻止的 ICMP 类型。
- rich rules: 没有高级规则。
案例如下:
# 查看默认区域的详细信息
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports: 3306/tcp 27017/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
# 查看指定区域的详细信息
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=work --list-all
...
# 获取所有区域列表
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 查看所有区域的详细信息
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --list-all-zones
...
# 查看当前默认区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --get-default-zone
public
# 设置默认区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public
success
4.2 target 流量处理
target
属性定义了进入某个区域的流量的默认处理方式:
-
%%REJECT%%
- 解释: 拒绝所有未明确允许的流量,并发送一个拒绝消息(通常是一个 ICMP 消息)。
- 用途: 适用于需要高度安全性的场景,确保所有未授权的流量都被明确拒绝。
-
DROP
- 解释: 丢弃所有未明确允许的流量,不发送任何响应。
- 用途: 适用于需要最高安全性的场景,确保攻击者无法获取任何反馈信息。
-
ACCEPT
- 解释: 接受所有流量。
- 用途: 适用于完全信任的网络环境,如内部网络或测试环境。
-
default
- 解释: 使用系统的默认行为。默认情况下,这通常等同于 %%REJECT%% 或 DROP,具体取决于系统的配置。
- 用途: 适用于不想更改默认行为的场景。
案例如下:
# 查看 public 区域下的 target 属性
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --get-target --permanent
default
# 设置 block 区域的目标为 %%REJECT%%
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=block --set-target=%%REJECT%%
4.3 icmp-block-inversion ICMP 阻止反转
icmp-block-inversion
是 firewalld 中的一个配置选项,用于控制 ICMP(Internet Control Message Protocol)流量的处理方式。它决定了是否启用 ICMP 阻止反转功能。
- 启用 (yes): 当
icmp-block-inversion
设置为 yes 时,所有未明确允许的 ICMP 类型都将被阻止。这意味着只有在 icmp-blocks 中明确列出的 ICMP 类型才会被允许。 - 禁用 (no): 当
icmp-block-inversion
设置为 no 时,所有未明确阻止的 ICMP 类型都将被允许。这意味着只有在 icmp-blocks 中明确列出的 ICMP 类型才会被阻止。
默认情况下,icmp-block-inversion 通常设置为 no,即只有明确列出的 ICMP 类型会被阻止,其他 ICMP 类型会被允许。
案例如下:
# 查看 public 区域下的 icmp-block-inversion 属性
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --query-icmp-block-inversion
no
# 启用 icmp-block-inversion
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-icmp-block-inversion
success
# 禁用 icmp-block-inversion
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --remove-icmp-block-inversion
success
4.4 interfaces 网络接口
interfaces 是 firewalld 中的一个重要配置项,用于指定哪些网络接口属于某个特定的防火墙区域。通过管理这些接口,你可以更精细地控制不同网络接口的流量处理方式。
- 定义:
interfaces
列表指定了哪些网络接口(如 eth0, enp0s3 等)属于某个特定的防火墙区域。 - 作用: 通过将网络接口分配到不同的区域,可以为不同的网络接口应用不同的安全策略。
案例如下:
# 查看所有网路接口
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:16:3e:16:f2:9c brd ff:ff:ff:ff:ff:ff
# 查看 public 区域下的所有网络接口
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --list-interfaces
# 将 eth0 接口分配到 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-interface=eth0
success
# 将 eth0 接口移动到 work 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=work --change-interface=eth0
success
# 查询 eth0 是否在 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --query-interface=eth0
no
# 查询 etho 所属 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --get-zone-of-interface=eth0
public
# 将 eth0 移除 work 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=work --remove-interface=eth0
success
4.5 sources 源地址
sources
是 firewalld
中的一个重要配置项,用于指定哪些源地址或网络子网属于某个特定的防火墙区域。通过管理 sources
,你可以更精细地控制来自特定 IP 地址或网络的流量处理方式。
- 定义:
sources
列表指定了哪些源地址或网络子网属于某个特定的防火墙区域。 - 作用: 通过将特定的源地址或网络子网分配到不同的区域,可以为不同的来源应用不同的安全策略。
案例如下:
# 查看 public 区域下的所有源地址
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --list-sources
192.168.1.0/24
# 将源地址 192.168.1.100 添加到 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-source=192.168.1.100
success
# 将子网 192.168.1.0/24 移动到 public 区域 (修改/新增)
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --change-source=192.168.1.0/24
success
# 查询 192.168.1.100 是否在 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --query-source=192.168.1.100
yes
# 将源地址 192.168.1.100 移除 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --remove-source=192.168.1.100
success
4.6 service 服务
services
是 firewalld
中的一个重要配置项,用于指定哪些服务可以在某个特定的防火墙区域中运行。通过管理 services
,你可以更精细地控制哪些网络服务可以接收流量。
- 定义:
services
列表指定了哪些服务可以在某个特定的防火墙区域中运行。 - 作用: 通过将特定的服务添加到不同的区域,可以为不同的服务应用不同的安全策略。
案例如下:
# 查看所有服务列表
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --get-services
amqp amqps apcupsd audit bacula http https ftp ...
# 查看 home 区域下的所有服务
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --list-services
dhcpv6-client mdns samba-client ssh
# 将 http 服务 添加到 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-service=http
# 查询 ssh 是否存在 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --query-service=ssh
yes
# 将 http 服务 移除 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --remove-service=http
4.7 protocols 协议
protocols
是 firewalld
中的一个配置项,用于指定哪些网络协议可以在某个特定的防火墙区域中运行。通过管理 protocols
,你可以更精细地控制哪些协议可以接收流量。
- 定义:
protocols
列表指定了哪些网络协议可以在某个特定的防火墙区域中运行。 - 作用: 通过将特定的协议添加到不同的区域,可以为不同的协议应用不同的安全策略。
案例如下:
# 查看 public 区域下的所有协议
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --list-protocols
tcp udp ...
# 将 tcp 协议 添加到 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-protocol=tcp
success
# 查询 tcp 协议是否存在 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --query-protocol=tcp
yes
# 将 tcp 协议 移除 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --remove-protocol=tcp
success
4.8 masquerade IP 地址伪装
masquerade
是 firewalld
中的一个重要配置项,用于实现网络地址转换(NAT)。通过启用 masquerade
,你可以让内部网络的设备通过一个公共 IP 地址访问外部网络。这对于路由器和 NAT 设备非常有用。
- 定义:
masquerade
功能允许内部网络的设备通过一个公共 IP 地址访问外部网络。这通常用于 NAT(网络地址转换)。 - 作用: 通过启用
masquerade
,可以隐藏内部网络的真实 IP 地址,增强安全性。
案例如下:
# 查看 public 区域下的 masquerade 属性
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --query-masquerade
no
# 启用 masquerade
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-masquerade
success
# 禁用 masquerade
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --remove-masquerade
success
4.9 forward-ports 端口转发规则
forward-ports
是 firewalld
中的一个配置项,用于实现端口转发。通过配置 forward-ports
,你可以将一个端口上的流量转发到另一个端口或另一台主机。这对于需要将外部流量转发到内部网络中的特定服务非常有用。
-
定义:
forward-ports
用于将一个端口上的流量转发到另一个端口或另一台主机。 -
作用: 通过配置端口转发,可以实现外部网络对内部网络中特定服务的访问。
-
参数说明
- port: 外部端口号。
- proto: 协议类型,通常是 tcp 或 udp。
- toport: 内部端口号。
- toaddr: 内部 IP 地址。
案例如下:
# 查看 public 区域下的所有端口转发规则
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --list-forward-ports
port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
# 将外部端口 80 上的流量转发到内部 IP 192.168.1.100 的端口 8080
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
success
# 查询 端口转发规则 是否存在 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --query-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
yes
# 从 public 区域移除将外部端口 80 上的流量转发到内部 IP 192.168.1.100 的端口 8080 的规则
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
success
4.10 source-ports 源端口
source-ports
是 firewalld
中的一个配置项,用于指定哪些源端口的流量可以被允许或处理。通过管理 source-ports
,你可以更精细地控制来自特定源端口的流量。
- 定义:
source-ports
列表指定了哪些源端口的流量可以在某个特定的防火墙区域中被允许或处理。 - 作用: 通过将特定的源端口添加到不同的区域,可以为不同的源端口应用不同的安全策略。
案例如下:
# 查看 public 区域下的所有源端口
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --list-source-ports
8080/tcp
# 将源端口 8080 上的流量添加到 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-source-port=8080/tcp
success
# 查询 源端口 8080 是否存在 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --query-source-port=8080/tcp
yes
# 从 public 区域移除源端口 8080 上的流量
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --remove-source-port=8080/tcp
success
4.11 icmp-blocks ICMP 类型
icmp-blocks
是 firewalld
中的一个配置项,用于指定哪些 ICMP(Internet Control Message Protocol)类型应该被阻止。通过管理 icmp-blocks
,你可以更精细地控制 ICMP 流量,从而提高系统的安全性。
-
定义:
icmp-blocks
列表指定了哪些 ICMP 类型的流量应该被阻止。 -
作用: 通过将特定的 ICMP 类型添加到不同的区域,可以防止潜在的攻击和不必要的 ICMP 流量。
-
ICMP 类型
- echo-request: Ping 请求
- echo-reply: Ping 应答
- destination-unreachable: 目标不可达
- time-exceeded: 超时
- parameter-problem: 参数问题
- source-quench: 源抑制
- redirect: 重定向
- router-advertisement: 路由器通告
- router-solicitation: 路由器请求
- timestamp-request: 时间戳请求
- timestamp-reply: 时间戳应答
- address-mask-request: 地址掩码请求
- address-mask-reply: 地址掩码应答
案例如下:
# 查看 public 区域下的所有ICMP类型
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --list-icmp-blocks
echo-request
# 将 echo-request 添加到 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-icmp-block=echo-request
success
# 查询 echo-request 是否存在 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --query-icmp-block=echo-request
yes
# 从 public 区域移除 echo-request
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --remove-icmp-block=echo-request
success
4.12 rich rules 高级规则
rich rules
是 firewalld
中的一个强大功能,允许你创建复杂的防火墙规则。通过rich rules
,你可以定义更精细的流量控制策略,包括基于源地址、目标地址、端口、协议、服务等多种条件的规则。
- 定义:
rich rules
是一种高级规则,允许你定义复杂的防火墙策略,包括条件、动作和日志记录。 - 作用: 通过
rich rules
,可以实现更细粒度的流量控制,满足复杂的网络安全需求。
rich rules
的语法如下:
rule [family="ipv4|ipv6"] [source [address="address[/mask]"]] [destination [address="address[/mask]"]] [not] [service name="name"] [port port="port" protocol="protocol"] [not] [log [prefix="prefix"] [level="level"] [limit value="rate/time unit"]] [audit] [accept | reject | drop]
参数说明
- family: 指定 IP 版本,可以是 ipv4 或 ipv6。
- source: 指定源地址或子网。
- destination: 指定目标地址或子网。
- service: 指定服务名称。
- port: 指定端口号和协议。
- log: 记录日志,可以指定前缀、日志级别和速率限制。
- audit: 记录审计日志。
- action: 指定动作,可以是 accept、reject 或 drop。
- accept: 允许流量通过。
- reject: 拒绝流量,并发送拒绝消息给发送方。
- drop: 拒绝流量,但不发送任何消息给发送方。
案例如下:
# 查看 public 区域下的所有 rich-rules
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --list-rich-rules
rule family="ipv4" source address="192.168.1.0/24" port port="80" protocol="tcp" accept
rule family="ipv4" source address="192.168.1.100" reject
# 允许来自 192.168.1.0/24 子网的 HTTP 流量
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="80" protocol="tcp" accept'
success
# 拒绝来自 192.168.1.100 的所有流量
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'
# 查询 指定规则 是否存在 public 区域
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --query-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'
yes
# 从 public 区域移除 指定规则
[root@iZbp1dfulgjy4kd3ev4y7bZ ~]# firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'
yes