Linux 防火墙配置的核心在于“默认拒绝 + 最小授权 + 分层防御”
无论是 CentOS/RHEL 系的 firewalld,还是 Debian/Ubuntu 系的 UFW,亦或是底层通用的 iptables/nftables,没有绝对“最好”的防火墙,只有最贴合业务场景的策略组合,生产环境中最常见的配置错误不是规则写错,而是放行了本不该放行的端口,正确的做法是:先拒绝所有入站流量,再按需放行特定 IP、端口和协议,同时结合云平台安全组形成双重过滤,这才是企业级 Linux 服务器的安全基线。
先理解 Linux 防火墙的“三驾马车”
- iptables:传统内核 netfilter 管理工具,规则链式匹配,灵活但门槛高,性能优秀,适合复杂 NAT 和企业级流量控制。
- firewalld:RHEL 7+ 默认方案,基于区域(zone)概念,动态管理,支持运行时与永久配置分离,适合需要频繁变更规则的场景。
- UFW(Uncomplicated Firewall):Ubuntu 默认前端,封装 iptables,语法简洁,适合新手和轻量级服务器,但高级功能受限。
我的核心建议:云服务器上优先使用系统自带防火墙 + 云安全组的双层策略,不要只依赖云平台安全组,因为一旦安全组误操作或端口映射异常,本机防火墙是最后一道防线。
生产级配置流程:从零到一的标准步骤
设定默认策略一切入站流量默认丢弃
# iptables 示例 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT
对绝大多数 Web 服务器而言,出站流量应放行(便于更新和回包),入站只放行必要端口,此策略能最大化降低被扫描的风险。
放行回环与已建立连接
iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

这两条规则必不可少:回环接口用于本地进程通信,而 conntrack 状态跟踪保证已建立的 SSH、HTTP 连接不中断,这是避免生产事故的关键细节。
按业务放行端口
- 管理端口:
iptables -A INPUT -p tcp --dport 22 -s 你的办公网IP -j ACCEPT(强烈不建议对全开放) - 服务端口:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT - 数据库端口:
iptables -A INPUT -p tcp --dport 3306 -s 应用服务器内网IP -j ACCEPT
持久化配置
- firewalld 使用
firewall-cmd --permanent后--reload - iptables 使用
iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)或service iptables save(RHEL 系)
切记:每次修改后先测试新会话能否正常连接,再决定是否持久化,建议用 screen 或 tmux 保持一个已有会话,防止规则错误导致自己“被关在门外”。
firewalld 实战:基于区域的动态管理
firewalld 的亮点是区域化不同网络接口应用不同信任级别。
firewall-cmd --zone=public --add-port=443/tcp --permanent firewall-cmd --zone=internal --add-source=192.168.1.0/24 --permanent firewall-cmd --reload
安全建议:
- 公网网卡绑定
public区域:仅放行 HTTP/HTTPS - 内网网卡绑定
trusted或自定义internal:允许内网访问 SSH、数据库 - 对云服务器,不要直接修改默认区域为 trusted,否则会绕过安全组策略。
经验案例(酷番云):我们曾处理过一个客户案例,其酷番云 ECS 实例在安全组中已放行 80 端口,但网站仍无法访问,排查发现系统自带的 firewalld 默认区域为

public,且未添加 http 服务规则,由于安全组只过滤外部流量,而本机 firewalld 再次拦截了入站请求。解决方案:在 firewalld 中执行 firewall-cmd --permanent --add-service=http,并设置默认区域为 drop,仅放行 ssh、http、https,这样即便安全组配置过宽泛,本机依然会拒绝对外暴露的非必要端口,形成纵深防御。
UFW 的快速配置技巧
Ubuntu 用户可使用 UFW 快速落地:
ufw default deny incoming ufw default allow outgoing ufw allow 22/tcp ufw allow 80/tcp ufw enable
注意:ufw allow 22/tcp 会向所有来源开放 SSH,如需限制来源 IP,必须写明:
ufw allow from 203.0.113.10 to any port 22 proto tcp
进阶优化:防暴力破解与动态封禁
防火墙不仅要“放行/拒绝”,还应具备主动防御能力:
- 限制 SSH 连接频率:使用
iptables的recent模块,同一 IP 每分钟超过 3 次连接则封禁 10 分钟。 - 集成 Fail2Ban:监控日志并动态调用 iptables/firewalld 封禁 IP,效率比人工运维高数倍。
- 禁用 ICMP 重定向:作为防劫持加固项,云服务器建议默认丢弃
ICMP redirect。
iptables -A INPUT -p icmp --icmp-type redirect -j DROP
常见故障排查清单
- 如果端口不通,先用
iptables -L -n或firewall-cmd --list-all查看实际规则 - 不要忽略云安全组:本机防火墙放行后,还需确认安全组入站规则是否同步
- 检查
conntrack满载问题:高并发场景下连接跟踪表溢出会导致丢包,需调整net.netfilter.nf_conntrack_max
- 大量 DROP 日志出现时,使用
iptables -I INPUT 1 -s 攻击IP -j DROP快速临时封禁
相关问答模块
Q1:firewalld 和 iptables 到底选哪个?可以同时启用吗?
答案:生产环境不要同时启用,两者管理同一套内核 netfilter 框架,同时运行会导致规则混乱、策略冲突,甚至出现“你以为放行了,实际被另一层规则拦截”的诡异故障,建议:RHEL/CentOS 8+ 默认用 firewalld,Ubuntu/Debian 默认用 UFW(底层是 iptables);如果服务器只跑单一简单业务,直接用 iptables 更高效,对于云服务器,更倾向于 firewalld + 云安全组 的组合,因为 firewalld 的 zone 机制与云环境的多网卡场景天然契合。
Q2:为什么我按教程开放了 8080 端口,外部依然访问不了?
答案:按以下顺序逐一排查:
- 确认进程正在监听:
ss -lntp | grep 8080 - 确认本机防火墙规则已生效:
iptables -L -n查看 INPUT 链是否有对应 ACCEPT - 确认云平台安全组已放行 8080(这是最常见的遗漏点)
- 检查 SELinux 是否拦截:
getenforce为 Enforcing 时,需执行semanage port -a -t http_port_t -p tcp 8080 - 最后测试回环访问:
curl 127.0.0.1:8080,若通而外网不通,基本可断定问题出在云安全组或上层防火墙。
结语与互动
防火墙配置没有一次性的“万能模板”,最佳实践是“最小授权 + 可审计 + 可回滚”,建议每次变更规则前先备份当前规则文件,变更后记录变更原因,并在测试环境验证,如果你在实践中遇到规则不生效、策略冲突或性能问题,欢迎在评论区分享你的场景,我会逐一给出针对性建议,也欢迎关注我的专栏,持续输出 Linux 运维与云安全实战干货。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/774378.html

