You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用firewalld限制两服务器特定端口并放行其余所有流量

firewalld 配置方案(无现有流量中断风险)

前置准备

  • 提前确认两台互访服务器的真实IP,下文示例用192.168.1.10指代server1、192.168.1.11指代server2,执行命令时替换为实际地址
  • 所有配置默认在默认zone下操作,先执行命令确认当前默认zone:
firewall-cmd --get-default-zone

如果输出不是public,后续命令里的public全部替换为输出的实际zone名即可

  • 先配置临时规则测试,临时规则在防火墙重启后自动失效,配置出错可快速回滚,不会造成长时间断流

配置步骤

1. 配置临时规则测试

依次执行以下命令,注意顺序不能调换:必须先加授权IP允许规则,再加全量拒绝规则:

# 放行server1对3个TCP端口的访问
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10/32" port port="10000" protocol="tcp" accept'
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10/32" port port="10010" protocol="tcp" accept'
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10/32" port port="10020" protocol="tcp" accept'

# 放行server2对3个TCP端口的访问
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.11/32" port port="10000" protocol="tcp" accept'
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.11/32" port port="10010" protocol="tcp" accept'
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.11/32" port port="10020" protocol="tcp" accept'

# 拒绝所有其他来源对3个TCP端口的访问
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" port port="10000" protocol="tcp" reject'
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" port port="10010" protocol="tcp" reject'
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" port port="10020" protocol="tcp" reject'

如果希望非授权访问的流量直接被丢弃、不返回拒绝响应,可以把规则里的reject替换为drop

2. 规则验证

临时规则配置完成后立刻做三项校验,确认符合预期:

  • 从server1、server2分别访问本地10000、10010、10020端口,确认连通正常
  • 从第三台非授权服务器访问上述3个端口,确认被拦截
  • 测试所有原有业务的端口、来源访问,确认全部正常通行,无阻断
  • 如果验证时发现异常,直接执行firewall-cmd --reload即可清空所有临时规则,快速回滚到配置前状态

3. 写入永久配置

验证全部通过后,执行以下命令将规则写入永久配置,保证重启后规则不丢失:

# 永久放行server1对3个TCP端口的访问
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10/32" port port="10000" protocol="tcp" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10/32" port port="10010" protocol="tcp" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10/32" port port="10020" protocol="tcp" accept'

# 永久放行server2对3个TCP端口的访问
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.11/32" port port="10000" protocol="tcp" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.11/32" port port="10010" protocol="tcp" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.11/32" port port="10020" protocol="tcp" accept'

# 永久拒绝所有其他来源对3个TCP端口的访问
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" port port="10000" protocol="tcp" reject'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" port port="10010" protocol="tcp" reject'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" port port="10020" protocol="tcp" reject'

# 重载永久配置生效
firewall-cmd --reload

规则逻辑说明

之前配置失败的核心原因是未正确利用firewalld的规则匹配逻辑:

  • 同一zone内富规则优先级高于通用端口规则,按配置顺序从上到下匹配,匹配到对应规则后直接执行动作,不再向下遍历
  • 这套规则没有修改原有默认全放行的配置,所有不命中3个端口拦截规则的流量,都会直接走默认允许逻辑,完全不会影响现有正常业务
  • 两台服务器需要分别在本地配置相同规则,才能实现双向互访的管控要求

常用运维命令

  • 查看当前已生效的所有富规则:firewall-cmd --list-rich-rules
  • 删除某条错误规则:将添加命令中的add-rich-rule替换为remove-rich-rule执行即可
  • 如果需要支持IPv6,将规则里的family="ipv4"改为family="ipv6",对应源地址替换为IPv6地址即可

内容的提问来源于stack exchange,提问作者Dan Carrington

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:27:18