firewalld 是 CentOS 系统中的默认防火墙管理工具,基于 iptables,但是提供了更为灵活和简便的管理方式。firewalld 使用 zones 和 services 来管理网络流量,可以更加细致地控制防火墙规则。
1. 查看防火墙状态
查看 firewalld 服务的状态:
[root@localhost ~]# systemctl status firewalld
2. 启动与停止防火墙
启动防火墙:
[root@localhost ~]# systemctl start firewalld
停止防火墙:
[root@localhost ~]# systemctl stop firewalld
设置防火墙开机启动:
[root@localhost ~]# systemctl enable firewalld
禁止防火墙开机启动:
[root@localhost ~]# systemctl disable firewalld
3. 查看当前的防火墙规则
查看所有已启用的规则和当前活动的 zones:
[root@localhost ~]# firewall-cmd --list-all
查看当前活动的 zone:
[root@localhost ~]# firewall-cmd --get-active-zones
4. 基本的 Zone 配置
CentOS 使用 zone 来定义不同的网络接口及其允许的流量。常见的 zone 包括:
public: 默认 zone,表示公共网络。trusted: 信任的网络。dmz: 用于隔离的区,通常用于 DMZ 网络。work: 适合工作环境的 zone。home: 用于家庭网络。
查看所有可用的 zones:
[root@localhost ~]# firewall-cmd --list-all-zones
查看当前默认 zone:
[root@localhost ~]# firewall-cmd --get-default-zone
设置默认 zone(例如设置为 public):
[root@localhost ~]# firewall-cmd --set-default-zone=public
5. 开放与关闭端口
开放指定端口(例如开放 8080 端口):
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
关闭指定端口:
[root@localhost ~]# firewall-cmd --zone=public --remove-port=8080/tcp --permanent
重载防火墙以使永久规则生效:
[root@localhost ~]# firewall-cmd --reload
6. 开放与关闭服务
你可以通过服务名称来开放预定义的服务。比如,开放 HTTP 服务(80 端口):
[root@localhost ~]# firewall-cmd --zone=public --add-service=http --permanent
关闭服务:
[root@localhost ~]# firewall-cmd --zone=public --remove-service=http --permanent
7. 查看已开放的端口与服务
查看已开放的端口:
[root@localhost ~]# firewall-cmd --list-ports
查看已开放的服务:
[root@localhost ~]# firewall-cmd --list-services
8. 临时规则与永久规则
- 临时规则:只在当前防火墙会话中有效,防火墙重启后失效。
- 永久规则:使用
--permanent标志添加的规则,在防火墙重启后仍然有效。
添加永久规则:
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
临时规则(不加 --permanent):
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080/tcp
9. 清除所有规则
如果需要清空防火墙规则,可以使用:
[root@localhost ~]# firewall-cmd --zone=public --remove-port=8080/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
10. Firewall-cmd 常用选项
--zone=<zone>: 指定 zone。--add-port=<port>/<protocol>: 开放端口。--remove-port=<port>/<protocol>: 关闭端口。--add-service=<service>: 开放服务。--remove-service=<service>: 关闭服务。--list-all: 列出当前 zone 的所有规则。
11. firewalld 与 NetworkManager 配合
firewalld 可以与 NetworkManager 配合使用,在 NetworkManager 设置的网络接口上自动应用防火墙规则。
如果 NetworkManager 与 firewalld 配合,可以使用以下命令来验证:
[root@localhost ~]# firewall-cmd --get-active-zones
12. 常见问题排查
- 防火墙规则未生效:请确认规则是否使用了
--permanent标志,且防火墙是否已经重载。 - 防火墙阻塞了预期的流量:检查
firewalld是否使用了正确的 zone 和服务。
1. 拒绝 ICMP 流量
ICMP(互联网控制消息协议)常用于网络诊断工具,如 ping。要拒绝 ICMP 流量,可以按以下步骤配置:
拒绝所有 ICMP 流量
- 拒绝 ICMP 请求(例如
ping请求):
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" protocol value="icmp" reject'
这条规则会拒绝所有来自公网(public 区域)的 ICMP 流量。
- 重载
firewalld配置使其生效:
[root@localhost ~]# firewall-cmd --reload
仅拒绝 ICMP 回显请求(ping)
如果你只想拒绝 ICMP 回显请求(即 ping),可以这样设置:
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" protocol value="icmp" icmp-type echo-request reject'
查看 ICMP 拒绝配置
要查看当前已配置的 ICMP 拒绝规则,可以使用以下命令:
[root@localhost ~]# firewall-cmd --list-all
删除拒绝所有 ICMP 流量的规则
[root@localhost ~]# firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" protocol value="icmp" reject'
删除拒绝 ICMP 回显请求的规则
[root@localhost ~]# firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="0.0.0.0/0" protocol value="icmp" icmp-type echo-request reject'
- 重载
firewalld配置使其生效:
[root@localhost ~]# firewall-cmd --reload
2. 拒绝 SSH 流量
如果你想拒绝来自特定 IP 或者某个区域的 SSH 流量(通常是 TCP 端口 22),可以按以下步骤配置。
拒绝所有 SSH 流量
- 拒绝 SSH 访问(端口 22):
[root@localhost ~]# firewall-cmd --permanent --zone=public --remove-service=ssh
这条规则会从 public 区域的防火墙中移除 SSH 服务,禁止通过 SSH 连接到服务器。
拒绝特定 IP 的 SSH 访问
如果你希望拒绝来自特定 IP 地址(例如 192.168.1.100)的 SSH 连接,可以使用以下命令:
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" reject'
重载 firewalld 配置
每次修改规则后,记得使用以下命令重新加载防火墙配置:
[root@localhost ~]# firewall-cmd --reload
查看 SSH 拒绝配置
要查看当前的规则,可以执行以下命令:
[root@localhost ~]# firewall-cmd --list-all
恢复 SSH 服务规则
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=ssh
- 重载
firewalld配置使其生效:
[root@localhost ~]# firewall-cmd --reload
总结:如何拒绝 ICMP 和 SSH 流量
- 拒绝 ICMP 流量:使用
--add-rich-rule='rule family="ipv4" protocol value="icmp" reject'来拒绝 ICMP 请求,或使用更具体的规则来拒绝 ICMP 回显请求(ping)。 - 拒绝 SSH 流量:通过
--remove-service=ssh来禁止 SSH 服务,或者通过--add-rich-rule来拒绝特定 IP 地址的 SSH 访问。
firewalld 中的 SNAT 和 DNAT
在 firewalld 中,SNAT 和 DNAT 配置需要通过 rich rules 或直接修改 firewalld 配置文件来实现,通常它们与 iptables 配合使用。
配置 SNAT 与 DNAT(通过 rich rules)
虽然 firewalld 默认不直接暴露 SNAT 和 DNAT 的配置接口,但你可以使用 rich rules 来实现。
- 配置 SNAT(源地址转换):
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" masquerade'
- 配置 DNAT(目标地址转换):
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.100
重载配置
应用完规则后,重载 firewalld 配置使之生效:
[root@localhost ~]# firewall-cmd --reload
总结
- SNAT 和 DNAT 是
iptables和firewalld中常用的 NAT 操作,分别用于修改数据包的源地址和目标地址。 SNAT适用于将内部网络的流量源地址转换为公网地址,通常用于多个内网主机共享一个公网 IP。DNAT适用于将外部请求转发到内部网络的主机,通常用于端口转发或映射。- 在
firewalld中,SNAT和DNAT通过 rich rules 或端口转发规则来实现。

Comments NOTHING