此文记录笔者捣腾linux的firewalld的一些复杂使用技巧,欢迎参阅与收藏👏若有疑问,欢迎来函或评论区进行讨论✌️

本文参考的文献链接:centos7 firewalld ip与端口白名单配置等,开放端口与ip白名单


注意⚠️:本文所有操作请确保您拥有root权限。

安装与开启

以Centos7为例,使用如下指令进行防火墙软件的安装(其实大多数linux发行版是自带的):

yum install firewalld -y

启动防火墙,并设置开机自启:

systemctl start firewalld
systemctl enable firewalld

基础配置

若想开放某一端口,比如ssh的端口,应该如何做呢?
以ssh的默认端口22为例,输入一下指令即可添加规则:

# 新建永久规则,开放22端口(TCP协议),任何ip都可以访问
firewall-cmd --permanent --add-port=22/tcp
#添加或者移除规则后重新加载firewall后配置才会生效
firewall-cmd --reload

若想删除刚刚设置的规则呢,应该如何做?

firewall-cmd --permanent --remove-port=22/tcp

进阶配置(rich-rule)

还是举个例子,如何设置仅特定ip可以连接某端口呢?
在开始之前,可以使用一下指令查询firewall现阶段所有的配置:

firewall-cmd --list-all

你可能会发现,在输出的结果中,interface里面只有你默认的网络出口eth0
但是,比如你想让在名为网卡tun0的网关上的ip地址172.17.22.1可以访问你本机端口6666,那么应该如何设置呢?
请参考如下指令进行操作即可:

# 将区域public再添加一接口,其名称为tun0
firewall-cmd --zone=public --permanent --add-interface=tun0
# 重启使其生效
firewall-cmd --reload
# 添加位于网卡tun0上的ip 172.17.22.1拥有访问本机6666端口的tcp/udp权限
firewall-cmd --zone=public --permanent --add-rich-rule='rule family="ipv4" source address="172.17.22.1" port port="6666" protocol="tcp" accept'
firewall-cmd --zone=public --permanent --add-rich-rule='rule family="ipv4" source address="172.17.22.1" port port="6666" protocol="udp" accept'
# 再次重启,使all the thing生效
firewall-cmd --reload

至此,大功告成😄

Going Further

与gpt聊了会天,记录一下以下回答,可供参考~

问:

firewalld处理不同zone的优先级是怎样的?

答:

Firewalld处理不同区域(zone)的优先级是根据防火墙规则匹配的顺序来确定的。当数据包到达防火墙时,它会按照预定义的规则和区域配置进行匹配,直到找到与数据包匹配的规则为止。

以下是Firewalld处理不同区域的大致流程:

  1. 首先,Firewalld会检查数据包的源地址和目标地址,以确定数据包所属的区域。
  2. 一旦确定了数据包所属的区域,Firewalld会按照以下顺序处理区域中的规则:
    • 先处理区域中的特定源地址的规则(如果有)。
    • 接下来处理区域中的服务(service)规则。
    • 最后处理区域中的端口(port)规则。
  3. 当找到与数据包匹配的规则后,Firewalld会根据该规则的操作(如接受、拒绝、转发等)来处理数据包。
  4. 如果没有找到与数据包匹配的规则,则根据区域的默认操作来处理数据包。

需要注意的是,Firewalld会按照上述顺序依次匹配规则,一旦找到匹配的规则,后续的规则将不再被考虑。因此,在配置防火墙规则时,规则的顺序非常重要。

如果你在多个区域中定义了相同端口或服务的规则,Firewalld将根据规则定义的先后顺序进行匹配。如果你希望某个区域的规则具有更高的优先级,可以确保其在规则列表中的位置靠前。

总而言之,Firewalld根据规则匹配的顺序来处理不同区域的优先级,并根据匹配到的规则来决定如何处理数据包。在配置防火墙规则时,要注意规则的顺序和区域的默认操作,以确保期望的行为和优先级。


注意⚠️:下面的回答笔者并未亲自尝试,请注意甄别

问:

firewalld如何设置黑名单模式?就比如说,我想让默认所有端口都打开,但唯独4601和4602端口禁止访问?

答:

要将 public 区域设置为默认情况下允许所有端口访问,同时禁止访问端口 4601 和 4602,您可以按照以下步骤进行设置:

  1. 确保默认区域是 public 区域:
sudo firewall-cmd --set-default-zone=public
  1. 允许所有端口的访问:
sudo firewall-cmd --permanent --zone=public --add-port=1-65535/tcp
  1. 禁止访问端口 4601 和 4602:
sudo firewall-cmd --permanent --zone=public --remove-port=4601-4602/tcp
  1. 重新加载防火墙配置使更改生效:
sudo firewall-cmd --reload

执行上述命令后,public 区域将默认允许访问所有端口,而端口 4601 和 4602 将被禁止访问。请确保在执行 --reload 命令之前已经对规则进行了正确的设置。