firewalld本身不支持“只进不出”,需结合rich-rule白名单与public zone target设为DROP或iptables OUTPUT链默认策略为DROP实现:先用rich-rule精确放行指定源IP的入站服务(含127.0.0.1),再通过--set-target=DROP限制出站新建连接,仅允许ESTABLISHED/RELATED响应流量返回。

firewalld 本身不支持“只进不出”这种单向连接控制——它管理的是网络层的入站(input)和出站(output)流量,但默认策略是双向独立的。所谓“只进不出”,实际是指:允许外部 IP 主动连接本机服务(如 SSH、HTTP),但禁止本机主动向外发起新连接(比如 curl、wget、yum update 等)。这并非白名单的常规用途,而是对 出站策略 的严格限制,需配合白名单共同实现最小权限访问模型。
明确目标与前提
真正可行的做法是:保留白名单放行特定源 IP 的入站请求,同时将 OUTPUT 链默认策略设为 DROP。这样,只有本机已建立的响应流量(RELATED/ESTABLISHED)能出去,新发起的连接全部被阻断。注意:该配置会影响所有出站行为,包括系统更新、DNS 查询、日志上报等,生产环境需谨慎评估。
配置白名单(仅放行指定 IP 入站)
使用 rich rule 精确控制,避免误开全端口:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 放行单个 IP 访问 SSH(22 端口):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.5" port port="22" protocol="tcp" accept' - 放行子网访问 HTTP(80 端口):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="80" protocol="tcp" accept' - 务必显式放行本地回环(否则本机服务自检失败):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1" accept'
关闭默认出站通路(实现“只进不出”核心)
firewalld 不直接管理 OUTPUT 链,需通过底层 iptables 规则或 zone 策略间接控制。推荐方式是修改 public zone 的默认行为:
- 将 public zone 的 target 设为 DROP(而非 ACCEPT):
firewall-cmd --permanent --zone=public --set-target=DROP - 该设置会阻止所有新建的出站连接,但保留 ESTABLISHED/RELATED 流量(即响应包可返回)
- 若需更细粒度控制,可手动添加 iptables OUTPUT 规则(firewalld 重启后可能被覆盖,慎用):
iptables -P OUTPUT DROP
再放行必要出口(如 DNS):
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
验证与收尾
完成配置后必须 reload 并检查:
- 重载规则:
firewall-cmd --reload - 确认白名单已加载:
firewall-cmd --list-all | grep "rich rules" - 检查 OUTPUT 是否受限:
iptables -L OUTPUT -n 应显示 policy DROP,且无宽泛 ACCEPT 规则 - 从白名单 IP 测试 SSH 或 HTTP 可连;从本机执行 curl -v http://example.com 应超时或拒绝

















