Firewalld出现的目的是为了简化iptables繁琐的配置命令与过程,使用python2开发。
首先声明一点,不管是Firewalld还是iptables本身都不具备网络控制相关的功能,所有的功能都是Linux系统的netfilter模块实现的。
iptables给用户提供了一个可以直接控制netfilter的接口。而Firewalld使用更人性化的命令把用户的输入转换为iptables的命令。

Firewalld

  1. # 关闭并禁用防火墙
  2. systemctl disable --now firewalld
  3. # 启动并开机自启动防火墙
  4. systemctl enable --now firewalld
  5. # 重载防火墙配置 每次修改完都需要执行这个命令才能生效
  6. firewall-cmd --reload

区域

Fireawalld有明确的区域概念,根据不同的区域可以设置不同的规则。

  1. # 查看防火墙区域
  2. [root@localhost ~]# firewall-cmd --get-zones
  3. block dmz drop external home internal public trusted work
  4. # 查看所有区域的所有规则
  5. firewall-cmd --list-all-zones

Firewalld会将所有未配置的流量导向到当前激活的区域。

  1. # 将远端地址加入到public区域中
  2. firewall-cmd --zone=public --add-source=192.168.0.0/16 --permanent

public是常见的默认的区域,通过以下命令可以查看 当前使用的区域配置和内容。

  1. [root@localhost ~]# firewall-cmd --list-all
  2. public (active)
  3. target: default
  4. icmp-block-inversion: no
  5. interfaces: ens192
  6. sources:
  7. services: dhcpv6-client ssh
  8. ports:
  9. protocols:
  10. masquerade: no
  11. forward-ports:
  12. source-ports:
  13. icmp-blocks:
  14. rich rules:

public除了会回应icmp通信之外,还会允许已经添加的服务与端口进行通信。

如果将默认区域切换成drop,那么除了添加到其他区域的远端地址之外,会拒绝其他所有地址的连接。而且数据包会直接丢弃,相当于静默模式。
drop区域是个人电脑常用的模式之一,也是安全等级比较高的服务器常用配置。

  1. # 切换当前区域
  2. firewall-cmd --set-default-zone=drop
  3. # 重载防火墙配置
  4. firewall-cmd --reload

所有的区域都是同时生效的,可以按照实际需求将不同的来源重定向到不同的区域,再进行有针对性的配置。
防火墙 - 图1

添加放行端口

  1. # 添加常见服务
  2. firewall-cmd --zone=public --add-service=http --permanent
  3. # 添加自定义端口 9000允许TCP连接
  4. firewall-cmd --zone=public --add-prot=9000/tcp --permanent
  5. # 重载防火墙配置
  6. firewall-cmd --reload

端口转发

  1. # 需要先开启IP伪装,否则转发不生效
  2. firewall-cmd --permanent --zone=public --add-masquerade
  3. # 添加转发端口
  4. firewall-cmd --permanent --zone=public --add-forward-port=port=源端口:proto=tcp:toport=目的端口:toaddr=目的ip
  5. # 刷新防火墙配置
  6. firewall-cmd --reload

rich-rule

针对更复杂的需求,Firewalld可以使用 rich-rule 来实现更高级的配置效果。
但是rich-rule的语法在我看来是为了兼容习惯使用iptables的人,而非没有基础的新人,所以在这里不介绍rich-rule的写法。
至少我认为有能力可以使用rich-rule,至少对系统和网络有一定了解,不如直接使用iptables。