服务器防火墙是什么?iptables、firewalld与云安全组区别与配置实战 核心要点图解,云安全组在云平台外层过滤,iptables/firewalld在主机内过滤,请求需两层都放行。;firewalld是iptables的前端管理工具,规则最终仍落到netfilter。;规则默认拒绝入站、按需放行端口,是最小化暴露的基本做法。;排障顺序:先查云安全组,再查firewalld/iptables,最后查服务监听。
服务器防火墙是什么?iptables、firewalld与云安全组区别与配置实战 · 核心要点一图读懂(AegisX)

核心要点(TL;DR)

  • 云安全组在云平台外层过滤,iptables/firewalld在主机内过滤,请求需两层都放行。
  • firewalld是iptables的前端管理工具,规则最终仍落到netfilter。
  • 规则默认拒绝入站、按需放行端口,是最小化暴露的基本做法。
  • 排障顺序:先查云安全组,再查firewalld/iptables,最后查服务监听。

半夜被告警叫醒:服务明明在跑,外部却连不上端口。多数人第一反应是改代码、查Nginx,最后才发现是服务器防火墙或云安全组把请求挡在了门外。这类问题排查成本高,是因为防火墙不止一层。本文按「请求经过的顺序」讲清iptables、firewalld与云安全组的区别,给出可直接复制的配置命令和一份排障检查清单,帮你在十分钟内定位并解决端口不通。

一、先搞清分层:请求到底经过几道防火墙

一个外部请求到达你的服务,通常要穿过三层过滤:

  • 云安全组:云平台在网络层为实例网卡配置的虚拟防火墙,位于操作系统之外,实例内部看不到它的规则。
  • 主机防火墙:Linux内核的netfilter框架,由iptables或firewalld管理,规则作用在本机协议栈。
  • 服务监听:应用绑定的地址与端口,若只监听127.0.0.1,外部永远进不来。

三层是串联关系,任何一层拒绝,外部表现都是「连接超时」或「连接被拒绝」。所以排障不能只盯一处,顺序应为:云安全组 → 主机防火墙 → 服务监听。

二、三者区别:iptables、firewalld与云安全组对比

维度iptablesfirewalld云安全组
作用位置主机内核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 save

iptables规则重启即失效,必须做持久化,否则一次重启就回到解放前。

4. 确认服务监听

ss -lntp | grep 443

若显示127.0.0.1:443,说明服务只监听回环地址,需修改应用配置为0.0.0.0。

四、排障检查清单:端口不通按这个顺序查

  1. 云控制台确认安全组入方向已放行目标端口与来源IP。
  2. 执行firewall-cmd --list-all或iptables -L INPUT -n,确认主机规则放行。
  3. 执行ss -lntp,确认服务监听0.0.0.0且进程存活。
  4. 从外部用telnet IP 端口或nc -zv IP 端口测试连通性。
  5. 若仍不通,抓包确认请求是否到达网卡: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测试连通性。哪一层返回拒绝或超时,问题就定位在该层。