firewalld配置复杂源地址白名单关键在于结构清晰与逻辑闭环:按ip数量选方式(单ip/网段用rich rule,上百零散ip必用ipset+zone绑定),必须限定端口而非仅放行ip,需先清理全局开放端口并显式设置zone的--set-target=drop或reject,默认拒绝是白名单生效前提。

在 firewalld 中配置“复杂的源地址白名单”,关键不在命令多难,而在于结构是否清晰、逻辑是否闭环。所谓“复杂”,通常指:多个零散 IP、跨网段组合、需区分端口粒度、或要长期维护增删。下面直接说实用做法。
按场景选方式:单IP、网段、还是上百个地址?
别一上来就写 rich rule 堆命令。先看白名单构成:
- 只有 2–5 个固定 IP(如跳板机、监控探针)→ 用 rich rule 单条添加,最轻量
- 有 1–3 个 CIDR 网段(如运维网段 10.10.20.0/24、K8s 节点网段 172.20.0.0/16)→ 同样用 rich rule,但每条写一个
source address="X.X.X.X/Y" - 几十到上百个零散地址(比如不同部门出口、云厂商弹性 IP 列表)→ 必须上 ipset + zone 绑定,否则每次加 IP 都要 reload,规则列表爆炸且易出错
精准控制:只放行 IP + 端口,不是放行整个 IP
很多人加了 source address="192.168.1.100" accept,结果发现这台机器所有端口都对它开放了——因为没限定端口,firewalld 默认继承 zone 的服务放行策略。真正安全的白名单必须锁定“谁、能连哪个端口”:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 只允许 192.168.1.100 连 SSH:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept' - 只允许 10.100.47.0/24 访问 Redis(6379)和 MySQL(3306):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.100.47.0/24" port port="6379" protocol="tcp" accept'firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.100.47.0/24" port port="3306" protocol="tcp" accept' - 务必先清理全局开放:如果之前执行过
--add-port=6379/tcp,得先--remove-port=6379/tcp,否则 rich rule 会被绕过
防误锁:默认拒绝必须显式设置
firewalld 的 public zone 默认是“只开 SSH 和少量服务”,不是“默认拒绝”。白名单生效的前提,是把整个入站流量的兜底策略设为 DROP 或 REJECT:
- 设为丢弃(推荐公网暴露面):
firewall-cmd --permanent --zone=public --set-target=DROP - 设为拒绝(带响应,适合内网调试):
firewall-cmd --permanent --zone=public --set-target=REJECT - 这个
--set-target是关键一步,不执行,你加再多 rich rule,其他 IP 仍可能通过 zone 默认放行的服务连进来
长期可维护:用 ipset 管理动态白名单
当 IP 列表频繁变动(例如 CI/CD 发布机 IP 每天轮换),硬编码 rich rule 就不可持续。这时用系统级 ipset 配合 firewalld:
- 创建 ipset(需 root):
ipset create my-whitelist hash:ip - 批量导入 IP:
ipset add my-whitelist 192.168.1.100ipset add my-whitelist 10.10.20.15 - 在 firewalld 中引用:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source ipset="my-whitelist" accept' - 后续只需更新 ipset 内容,无需 reload firewalld;重启后 ipset 会清空,所以建议写个 systemd service 在启动时自动重建










