firewalld白名单必须用rich-rule指定source address,不能仅用--add-service=ssh;需显式放行127.0.0.1及内网管理ip,拒绝规则应置于accept之后并reload前验证顺序。

rich-rule 使用,直接 --add-service=ssh 会绕过白名单逻辑,导致全网可连。
firewalld 白名单必须用 rich-rule,不能只开 service
firewalld 默认的 --add-service=ssh 是放行整个服务(即所有 IP 访问 22 端口),和“白名单”目标冲突。真要限制 IP,必须用 rich-rule 显式指定 source address。
- 错误做法:
firewall-cmd --permanent --add-service=ssh→ 全局开放,后续加的 rich-rule 可能被忽略 - 正确顺序:先移除已有 SSH service 规则(如有),再逐条添加带
source address的rich-rule - 注意空格:
source address="1.1.2.4 "这种末尾多空格会导致规则不生效,firewall-cmd --permanent --list-all查不到该条
添加允许规则时要覆盖本机回环和可信管理IP
只加远程管理 IP,可能把自己锁在外面——比如从跳板机连过去没问题,但从本机 ssh localhost 或 ssh 127.0.0.1 会失败,因为回环流量不走外部网卡,也不匹配你写的公网 IP 规则。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 必须显式放行本机地址:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1" service name="ssh" accept' - 如果服务器有内网管理口(如
192.168.10.5),也要单独加一条,不能依赖网段 - 别用
source address="localhost",firewalld 不识别这个字符串,只认 IP 或 CIDR
拒绝规则不是必须加,但没加就等于没白名单
firewalld 默认策略是 default: deny,但这是针对“未匹配任何规则”的连接。如果你只加了两条 accept 规则,没加 reject,那其他 IP 实际上是被默认 drop(无响应),不是 reject(主动拒绝)。这看似安全,但容易误判:客户端看到的是超时或 Connection refused,而不是明确的拒绝信号,排查时易混淆。
- 推荐加明确拒绝规则:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="ssh" reject' - 这条规则必须放在所有
accept规则之后(firewalld 按顺序匹配),所以加完再 reload - 加了它,客户端会立刻收到
Connection refused,而不是卡在 TCP handshake
reload 前务必验证语法和顺序
firewall-cmd --reload 是原子操作,一旦出错,SSH 连接可能立即中断且无法恢复——特别是当新规则没生效、旧规则又被清掉时。
- 检查当前永久规则:
firewall-cmd --permanent --list-all | grep -A 5 "rich rules" - 确认 accept 规则在 reject 规则之前(输出顺序即匹配顺序)
- 临时测试:先用
firewall-cmd --add-rich-rule=...(不加--permanent)试一条,成功后再批量写入永久规则 - 别在单次会话里 reload 后立刻退出;留一个备用终端保持连接,直到确认新规则生效
source address="999.999.999.999",语法也合法,但完全没意义。










