linux防火墙可通过iptables基于端口、协议、ip、tcp标志等网络层特征有效防御cc攻击,如限制单ip并发连接数和每秒新建连接数,并结合recent模块或fail2ban实现动态黑名单。

Linux 防火墙本身不直接“分析”流量内容(如HTTP请求体、URL路径或用户身份),而是基于网络层和传输层的可识别特征做匹配与决策。真正有效的拦截,依赖对这些特征的准确认知和规则的合理编排。
HTTP/HTTPS 流量的关键识别特征
虽然加密后的 HTTPS 内容无法被 iptables 或 firewalld 解密,但以下字段仍清晰可见,足以支撑多数拦截策略:
- 端口号:HTTP 默认走 TCP 80,HTTPS 走 TCP 443 —— 这是最常用、最可靠的匹配依据;
-
协议类型:必须指定
-p tcp,因为 HTTP/HTTPS 均基于 TCP; -
数据流向:对外提供 Web 服务时,规则应加在
INPUT链(进站);若需控制本机访问外部网站,则用OUTPUT链; -
TCP 标志位:例如用
--syn匹配新建连接请求,可用于限速或防扫描(如每秒只允1个新连接); -
源/目标 IP 和子网:可精确放行内网段(如
-s 10.0.2.0/24),或封禁恶意 IP 段(如-s 203.0.113.0/24)。
按场景定制拦截规则的实用方法
规则不是越多越好,关键是贴合业务逻辑。常见需求及对应写法如下:
-
只允许特定IP访问Web服务:先放行白名单,再默认拒绝
sudo iptables -A INPUT -s 192.168.5.10 -p tcp --dport 80 -j ACCEPTsudo iptables -A INPUT -p tcp --dport 80 -j DROP(这条必须放在白名单之后); -
阻止高频连接尝试(防CC攻击):限制单IP每分钟新建连接数
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 --connlimit-mask 32 -j DROP; -
区分HTTP与HTTPS并分别管控:可设置不同限速或日志前缀
sudo iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "[HTTP] "sudo iptables -A INPUT -p tcp --dport 443 -j LOG --log-prefix "[HTTPS] "; -
临时封禁某IP所有通信(含非Web):
sudo iptables -I INPUT -s 203.0.113.45 -j DROP(-I插入开头,立即生效)。
验证规则是否真正生效
光看规则列表(iptables -L -n -v)不够,需确认三点:
-
计数器是否增长:执行
curl -I http://本机IP后,检查对应规则的pkts列是否+1; -
请求是否到达主机:用
tcpdump -i any port 80抓包,确认SYN包能抵达本机(排除云平台安全组或前置NAT拦截); -
规则顺序是否合理:iptables 自上而下匹配,一旦命中即停止;把
DROP放太前面会导致后续ACCEPT失效。
别忘了规则持久化和配套工具
重启后规则丢失是常见疏漏。不同系统保存方式不同:
- Debian/Ubuntu:安装
iptables-persistent,运行sudo netfilter-persistent save; - RHEL/CentOS 7+:用
firewalld更稳妥,规则自动持久化,命令如firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.45" reject'; - 无论用哪种工具,操作前建议备份:
iptables-save > /root/iptables-backup-$(date +%F)。











