
核心要点(TL;DR)
- 云安全组在云平台外层过滤,iptables/firewalld在主机内过滤,请求需两层都放行。
- firewalld是iptables的前端管理工具,规则最终仍落到netfilter。
- 规则默认拒绝入站、按需放行端口,是最小化暴露的基本做法。
- 排障顺序:先查云安全组,再查firewalld/iptables,最后查服务监听。
半夜被告警叫醒:服务明明在跑,外部却连不上端口。多数人第一反应是改代码、查Nginx,最后才发现是服务器防火墙或云安全组把请求挡在了门外。这类问题排查成本高,是因为防火墙不止一层。本文按「请求经过的顺序」讲清iptables、firewalld与云安全组的区别,给出可直接复制的配置命令和一份排障检查清单,帮你在十分钟内定位并解决端口不通。
一、先搞清分层:请求到底经过几道防火墙
一个外部请求到达你的服务,通常要穿过三层过滤:
- 云安全组:云平台在网络层为实例网卡配置的虚拟防火墙,位于操作系统之外,实例内部看不到它的规则。
- 主机防火墙:Linux内核的netfilter框架,由iptables或firewalld管理,规则作用在本机协议栈。
- 服务监听:应用绑定的地址与端口,若只监听127.0.0.1,外部永远进不来。
三层是串联关系,任何一层拒绝,外部表现都是「连接超时」或「连接被拒绝」。所以排障不能只盯一处,顺序应为:云安全组 → 主机防火墙 → 服务监听。
二、三者区别:iptables、firewalld与云安全组对比
| 维度 | iptables | firewalld | 云安全组 |
|---|---|---|---|
| 作用位置 | 主机内核netfilter | 主机内核netfilter(前端) | 云平台网络层,实例外 |
| 管理方式 | 命令行直接写规则 | zone + 服务/端口抽象 | 控制台或API |
| 生效特点 | 立即生效,需自行持久化 | 区分runtime与permanent | 保存即生效,作用于实例 |
| 典型场景 | 精细控制、脚本化 | CentOS/RHEL系默认 | 所有云主机必备 |
关键认知:firewalld不是替代iptables的新内核机制,它只是iptables的前端,规则最终仍落到netfilter。同一台机器不要同时手工维护两套规则,否则会互相覆盖。
三、实战配置:三层分别怎么放行端口
1. 云安全组
在控制台入方向添加规则:协议TCP、端口按需(如443)、来源限制为业务所需网段而非0.0.0.0/0。原则是最小开放,管理端口(22、3389)务必限制来源IP。
2. firewalld(CentOS/RHEL/Rocky)
# 查看当前区域与已放行规则
firewall-cmd --list-all
# 永久放行443端口
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
# 确认生效
firewall-cmd --query-port=443/tcp注意--permanent与--reload必须成对使用,否则重启后规则丢失。也可用firewall-cmd --runtime-to-permanent把当前运行规则一次性固化。
3. iptables
# 查看INPUT链规则及行号
iptables -L INPUT -n --line-numbers
# 放行443端口
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
# 持久化(Debian/Ubuntu)
apt install iptables-persistent
netfilter-persistent saveiptables规则重启即失效,必须做持久化,否则一次重启就回到解放前。
4. 确认服务监听
ss -lntp | grep 443若显示127.0.0.1:443,说明服务只监听回环地址,需修改应用配置为0.0.0.0。
四、排障检查清单:端口不通按这个顺序查
- 云控制台确认安全组入方向已放行目标端口与来源IP。
- 执行
firewall-cmd --list-all或iptables -L INPUT -n,确认主机规则放行。 - 执行
ss -lntp,确认服务监听0.0.0.0且进程存活。 - 从外部用
telnet IP 端口或nc -zv IP 端口测试连通性。 - 若仍不通,抓包确认请求是否到达网卡:
tcpdump -i eth0 port 443 -nn。
抓包有请求无响应,多为主机防火墙丢弃;连请求都看不到,问题在云安全组或路由。
五、加固建议与行动清单
默认策略设为拒绝入站、按需放行,是成本最低的加固手段。建议每季度复核一次规则,清理过期端口;管理端口限制来源IP并配合密钥登录。在主机侧做规则收敛与异常入站拦截时,可结合AegisX的主机防护能力统一管理策略,减少人工逐台维护的遗漏。今天就可以动手:先跑一遍上面的检查清单,把「安全组放行但主机未放行」这类隐性冲突清理掉,再固化规则持久化配置,避免下次重启后重蹈覆辙。
常见问题(FAQ)
服务器防火墙是什么,和云安全组是一回事吗?
不是一回事。服务器防火墙通常指主机内的netfilter规则集,由iptables或firewalld管理,只作用于本机;云安全组是云平台在网络层提供的虚拟防火墙,作用于实例网卡外层。两者是串联关系,请求必须同时通过安全组和主机防火墙才能到达服务,任何一层拒绝都会表现为端口不通。
iptables和firewalld应该用哪个?
看发行版和习惯。firewalld是iptables的前端,规则最终仍由netfilter执行,CentOS/RHEL/Rocky默认用它,支持zone和运行时/永久配置;iptables更底层直接,适合精细控制和脚本化。同一台机器不要同时手工维护两套规则,否则容易互相覆盖,建议统一用一种管理方式。
为什么云安全组放行了端口,服务还是访问不了?
最常见原因是主机防火墙未放行或服务只监听127.0.0.1。先确认安全组入方向规则已放行目标端口和来源IP,再执行firewall-cmd --list-all或iptables -L -n检查主机规则,最后用ss -lntp确认服务监听地址是0.0.0.0而非回环地址,三层都通过才可访问。
firewalld重启后规则丢失怎么办?
因为规则只加到了运行时配置。firewall-cmd默认修改的是runtime,重启即失效,需要加--permanent参数写入永久配置,再执行firewall-cmd --reload使其生效。建议放行端口时同时执行两条命令,或用firewall-cmd --runtime-to-permanent一次性把当前运行规则固化为永久规则。
如何快速检查服务器防火墙是否拦截了某个端口?
按顺序排查:先用云控制台确认安全组入方向放行该端口;再执行firewall-cmd --query-port=端口/tcp或iptables -L INPUT -n --line-numbers查看主机规则;然后用ss -lntp确认服务监听;最后从外部用telnet或nc测试连通性。哪一层返回拒绝或超时,问题就定位在该层。