Linux 防火墙规则优化实战:firewalld 与 iptables 端口管理、防扫描与回源白名单

很多站长把防火墙当成”装好了就不管”的摆设:装完系统后放行 80、443、22 三个端口,从此再也没碰过。直到某天发现 SSH 被爆破了几万次、服务器被扫出奇怪的高危端口、或者套了 CDN 的源站被找到后直接裸奔,才想起来防火墙规则从来没优化过。防火墙不是”开了就行”,规则写得好不好,直接决定服务器在网络层是”铁桶”还是”筛子”。本文不扯理论,直接基于 CentOS 7/8 与 Ubuntu 22.04 两套主流环境,把防火墙规则优化做成三步实战:端口管理、防扫描限速、CDN 回源白名单。

一、先理清底层:firewalld 与 iptables 到底什么关系

很多新手被 firewalld、iptables、nftables 三个名词绕晕。简单说:iptables 和 firewalld 都是 netfilter 的前端管理工具,真正干活的是 Linux 内核的 netfilter 框架。iptables 是经典命令行工具,直接操作规则表;firewalld 是 CentOS 7 之后默认的服务型管理工具,它把规则按 zone(区域)组织,最终仍然翻译成 iptables/nftables 规则下发到内核。

用 firewalld 管理的好处是:规则按场景分组、支持”运行时规则”与”永久规则”分离、改完不用手动重启服务。但遇到复杂场景(限速、白名单、端口转发),firewalld 的富规则(rich rule)写法繁琐,直接落到 iptables 反而更直观。所以实际生产环境里,推荐”firewalld 管端口 + iptables 管高级规则”的混用模式,下面两节分别演示。

二、实战一:端口管理与规则收敛(firewalld)

规则优化的第一步不是”加规则”,而是”减规则”。先看看当前放行了哪些服务,把用不到的统统关掉:

# 查看当前所有放行的服务与端口
firewall-cmd --list-all
firewall-cmd --list-ports --zone=public

# 移除危险端口(示例:redis 6379、mysql 3306 默认不对外)
firewall-cmd --permanent --zone=public --remove-port=6379/tcp
firewall-cmd --permanent --zone=public --remove-port=3306/tcp

# 只放行必要端口:SSH、HTTP、HTTPS
firewall-cmd --permanent --zone=public --add-port=22/tcp
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https

# 重新加载使永久规则生效
firewall-cmd --reload

要点提醒:数据库、Redis、Memcached 这类服务永远不要直接暴露公网,要么只监听 127.0.0.1,要么用防火墙把端口限定到办公网段。对于只有指定 IP 才能访问的端口(比如宝塔面板 8888、phpMyAdmin),用富规则只放行来源:

# 只允许办公网出口 IP 访问宝塔面板端口
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="1.2.3.4/32" port protocol="tcp" port="8888" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" port protocol="tcp" port="8888" reject'
firewall-cmd --reload

# 查看富规则,确认放行在前、拒绝在后
firewall-cmd --list-rich-rules

注意规则顺序:firewalld 富规则按添加顺序匹配,放行特定 IP 的规则必须写在拒绝规则之前,否则先被 reject 拦掉,白名单就失效了。

端口到底留哪些?给一张最小化参考清单:Web 站点留 80/443;SSH 留 22(建议改高位端口并限制来源 IP);数据库 3306、Redis 6379、Memcached 11211 一律只监听内网或干脆不开;FTP 21、宝塔面板 8888、phpMyAdmin 这类管理入口,要么只对办公网段开放,要么配合面板安全入口使用。判断标准只有一条:业务不需要的端口,一个都不留。建议每季度对照 ss -lnt 的实际监听列表和防火墙放行列表做一次差异比对,多出来的立即删掉,别让”曾经临时放过”的端口变成常驻风险。

三、实战二:iptables 防端口扫描与限速(网络层加固)

端口放行收紧了,接下来处理”扫描与探测”。用 iptables 的 limit 模块对入站连接限速,能显著提高端口扫描和暴力破解的成本。下面这套规则直接追加到 INPUT 链:

# 丢弃非法状态连接
iptables -A INPUT -m state --state INVALID -j DROP

# 对新建 TCP 连接限速:每秒 20 个,超出即丢
iptables -A INPUT -p tcp --syn -m limit --limit 20/s --limit-burst 40 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

# 防止 ping 洪水
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

# 记录被丢弃的包到系统日志,用于事后分析
iptables -A INPUT -j LOG --log-prefix "FW-DROP: " --log-level 4

需要说明的是:限速规则要放在放行规则之后、默认策略之前,并且小心误伤正常业务。如果站点高峰期并发高,把 –limit 适当调大,再观察 /var/log/messages 里 FW-DROP 的日志量微调。规则写好后立即验证:

# 保存规则(CentOS 用 iptables-save,Ubuntu 用 netfilter-persistent)
iptables-save > /etc/sysconfig/iptables

# 本机验证:扫描自己确认规则生效
nmap -sS -p 1-10000 127.0.0.1 | tail -5

# 查看规则命中次数,确认在拦截
iptables -L INPUT -v -n | head -20

四、实战三:CDN/WAF 回源白名单(防绕过的关键)

很多站长给网站套了 CDN 或云 WAF,但源站防火墙仍然对全网开放 80/443——攻击者只要绕过 CDN 找到源站 IP,防护就形同虚设。正确做法是:源站只允许 CDN/WAF 节点 IP 回源,其余来源一律拒绝。以 Cloudflare 部分回源网段为例:

# 放行 CDN 回源网段(换成你实际使用的 CDN/WAF 节点网段)
for ip in 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22; do
  iptables -A INPUT -p tcp --dport 443 -s "$ip" -j ACCEPT
done
# 放行回环与已建立连接(务必先放行,否则会掐断现有连接)
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 其余访问 443 的来源统统记录并丢弃
iptables -A INPUT -p tcp --dport 443 -j LOG --log-prefix "NO-CDN: "
iptables -A INPUT -p tcp --dport 443 -j DROP

执行白名单前确认三件事:一是ESTABLISHED 放行必须在前;二是先把自己当前出口 IP 临时加进放行列表,别把自己关在门外;三是接入云防护后,源站 80 端口同样要收口,只放行回源网段。另外建议把回源网段写进脚本统一管理,节点 IP 更新时批量替换,避免手改遗漏。

五、总结

防火墙规则优化不是一次性工作,而是持续收敛的过程:定期用 ss -lnt 检查监听端口,对照防火墙放行清单删除无用规则;系统大版本升级时重新梳理一遍,别把老配置原样搬走。对于规则多、自己维护不过来的站点,也可以把网络层防护整体交给专业团队:速度网络提供的高防 CDN 与云 WAF 服务,自带回源 IP 收口、DDoS/CC 清洗和规则库持续更新,源站只需放行其节点网段即可,把”每月必做的规则优化”变成”接入即生效”。先把本文这三步做扎实,你的服务器在网络层就已经比 90% 的站点硬了。

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
在线客服
在线客服
热线电话
QQ客服
电子邮箱
suduwangluo