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 中,SNATDNAT 配置需要通过 rich rules 或直接修改 firewalld 配置文件来实现,通常它们与 iptables 配合使用。

配置 SNAT 与 DNAT(通过 rich rules)

虽然 firewalld 默认不直接暴露 SNATDNAT 的配置接口,但你可以使用 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

总结

  • SNATDNATiptablesfirewalld 中常用的 NAT 操作,分别用于修改数据包的源地址和目标地址。
  • SNAT 适用于将内部网络的流量源地址转换为公网地址,通常用于多个内网主机共享一个公网 IP。
  • DNAT 适用于将外部请求转发到内部网络的主机,通常用于端口转发或映射。
  • firewalld 中,SNATDNAT 通过 rich rules 或端口转发规则来实现。