Linux防火墙是服务器安全的第一道防线,所有暴露到公网的Linux服务器都必须配置防火墙,对于大多数云服务器用户,推荐使用firewalld(CentOS/RHEL系)或UFW(Ubuntu/Debian系)作为日常管理工具,底层规则由iptables或nftables执行,配置防火墙的核心原则只有一条:默认拒绝,按需放行,这一原则能最大程度降低攻击面,同时保证业务端口正常对外服务。
先厘清概念:iptables、firewalld与nftables的关系
很多用户在配置时会混淆这三者,真实的关系是:
iptables是Linux内核Netfilter框架的传统用户态管理工具,规则直接作用于内核网络栈,功能强大但语法较底层。firewalld是CentOS 7及以上版本默认的防火墙服务,它动态管理的底层仍然是iptables(或nftables),但提供了区域(Zone)、服务(Service)等更易用的抽象。nftables是新一代内核包过滤框架,旨在取代iptables,语法更简洁,性能更优,在RHEL 8+/CentOS 8+中,firewalld底层已默认切换为nftables。
独立见解:如果你在维护老旧的CentOS 6/7系统,掌握iptables语法是必须的;但新环境部署,建议直接以firewalld操作为主,避免直接编辑iptables规则文件导致与firewalld冲突。
firewalld 实战配置指南
这是日常使用频率最高的防火墙管理方式,以下操作均在CentOS 7/8/9及Rocky Linux等系统上验证。
基础状态检查
启动服务并设为开机自启,这是首要步骤:
systemctl start firewalld systemctl enable firewalld
查看当前默认区域及所有规则:
firewall-cmd --get-default-zone firewall-cmd --list-all
默认区域一般是public,该区域规则适用于所有外部流量。
放行业务端口

原则:只开放业务必需端口,其他一律不放行。
放行Web服务的80和443端口:
firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp
放行SSH端口(请务必确认修改后的端口号,并始终保持至少一个活跃会话防止失联):
firewall-cmd --permanent --add-port=2222/tcp
重载配置使规则生效:
firewall-cmd --reload
移除不再需要的端口
业务下线或迁移后,及时清理端口是防止漏洞被利用的关键动作:
firewall-cmd --permanent --remove-port=8080/tcp firewall-cmd --reload
使用服务名而非端口号
firewalld内置了大量服务的预定义规则,直接引用服务名更直观、更不容易出错:
firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https
查看所有已定义的服务:
firewall-cmd --get-services
进阶优化与常见生产场景方案
限制来源IP
对于数据库端口(如MySQL的3306),绝不应该对所有IP开放,仅允许特定办公网络或应用服务器访问:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" port protocol="tcp" port="3306" accept' firewall-cmd --reload
这样配置后,其他IP访问3306端口会被直接丢弃,攻击者甚至探测不到该端口存在。
防止端口扫描与暴力破解
仅靠防火墙无法完全抵御暴力破解,推荐组合方案:
- 修改SSH默认端口(编辑
/etc/ssh/sshd_config)。 - 使用
fail2ban自动封禁连续登录失败的IP。 - 在防火墙层面限制SSH来源IP,只允许公司出口IP访问。

独立见解:防火墙是”大门门锁”,fail2ban是”智能监控摄像头”,门锁必须坚固,但监控能主动识别并驱逐嫌疑人,两者配合才是云服务器抵御暴力破解的完整方案。
云安全组与系统防火墙的双层配合
这是云服务器场景下最容易忽略的问题,以酷番云为例,用户购买云服务器后,控制台提供安全组功能用于控制进出云服务器的流量,很多用户只在安全组放行端口,却忽略系统内部firewalld,导致业务不通;或者反过来,只配置系统防火墙,而安全组仍拦截流量。
酷番云经验案例:一位使用酷番云香港CN2云服务器的用户反馈,网站部署后外部始终无法访问80端口,排查发现:安全组规则只放行了22和443端口,忘放80端口;同时系统firewalld也拦截了80,处理方式:先在酷番云控制台的安全组中添加80端口入方向规则,再在系统内执行firewall-cmd --permanent --add-port=80/tcp并重载,问题立刻解决。正确顺序是:安全组放行 -> 系统防火墙放行 -> 程序监听端口确认,三层缺一不可。
紧急场景下的临时防火墙关闭
仅在排查网络问题时临时使用,生产环境禁止长期关闭:
systemctl stop firewalld
排查完成后必须立即恢复:
systemctl start firewalld
iptables 核心命令速查
某些场景(如Docker端口映射、内核级转发)仍需直接操作iptables:
查看当前规则:
iptables -L -n -v
放行指定IP访问指定端口:
iptables -A INPUT -s 198.51.100.7 -p tcp --dport 22 -j ACCEPT
拒绝所有其他流量访问22端口:
iptables -A INPUT -p tcp --dport 22 -j DROP
保存规则:
service iptables save # 或 iptables-save > /etc/sysconfig/iptables

强力建议:在没有完全掌握iptables规则链与匹配顺序之前,尽量使用firewalld进行管理,避免因为规则顺序错误导致全盘网络瘫痪。
配置后的验证与审计
配置防火墙后,验证环节不能省略:
- 本机验证:
firewall-cmd --list-all确认规则加载。 - 外部验证:使用另一台机器或在线端口检测工具访问测试端口。
- 日志审计:
journalctl -u firewalld查看防火墙服务日志,dmesg | grep DROP可查看被丢弃的包记录。
常见问题解答
Q1:firewalld和iptables到底选哪个?
如果你的系统是CentOS 7及以上,优先使用firewalld,它与系统NetworkManager集成更紧密,动态更新规则不会中断现有连接,且语法对初学者友好,只有当你在调试Docker端口映射、复杂NAT转发或需要精确控制每一条内核规则时,才直接使用iptables,两者可以共存,但不要在同一时刻对同一规则重复操作,以免产生冲突。
Q2:配置了防火墙规则后网站仍然无法访问,可能是什么原因?
按以下顺序逐一排查:
- 安全组:检查云服务商控制台是否放行了对应入方向端口,这是最容易被遗漏的一层。
- 系统防火墙:执行
firewall-cmd --list-all确认端口已放行,并且运行了firewall-cmd --reload。 - 服务监听:执行
netstat -tlnp | grep 端口,确认服务进程实际监听了该端口而不是只监听了127.0.0.1。 - SELinux:执行
getenforce,若为Enforcing,用ausearch -m avc查看是否有SELinux拦截记录。
冷门但常见的坑:如果使用了Docker,Docker的-p端口映射会绕过firewalld,直接在iptables的DOCKER链中添加规则,此时修改firewalld不会影响Docker容器端口的映射。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/774434.html

