21 10 月 2026
本文由财富云计算提供,我们提供高防服务器与 CDN 防护服务,NAT 型无独立公网 IP 价格比独立 IP 省一半以上,模板配合高防使用,源站自身也硬。

一、iptables 防护的定位:能做什么、不能做什么

先说清楚边界,别用错工具:

攻击iptables 能防吗
单 IP 高频扫描/爆破✅ 拿手
SYN Flood(小规模 <1万 PPS)✅ 限流 + Cookie 配合
慢速连接✅ 连接数限制
全端口扫描✅ 只开放必要端口
已知恶意 IP 段✅ 黑名单
大流量 DDoS(带宽已满)❌ 包到不了机器,规则是摆设
分布式 CC❌ 防不住「合法的坏请求」

铁律:iptables 是源站自保的第一层筛子,不是高防的替代品。带宽被打满时,你写在 INPUT 链的规则连一个包都看不到。

二、基础规则模板(生产级)

先看全貌,再逐段讲。以下模板适用「对外只开 80/443 的 Web 服务器」,游戏服改端口即可:

#!/bin/bash
# /etc/iptables/rules.sh —— 生产防护模板
# 用法:bash rules.sh  (规则立即生效,持久化见第五节)

### 0. 清空旧规则(初始化)
iptables -F
iptables -X
iptables -Z

### 1. 默认策略:INPUT 丢弃、FORWARD 丢弃、OUTPUT 放开
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

### 2. 环回接口全放(本地服务依赖)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

### 3. 已建立连接放行(关键!不然回程包全丢)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

### 4. 防 IP 伪造入站(反向路径过滤)
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# 源 IP 不是从哪来回哪去的,丢(防 SYN Flood 伪造源)
iptables -A INPUT ! -i eth0 -s 10.0.0.0/8 -j DROP     # 内网段不该从外网口进
iptables -A INPUT ! -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A INPUT ! -i eth0 -s 192.168.0.0/16 -j DROP
# 注意:NAT 型/内网环境按实际网卡调整

### 5. 防扫描:无效 TCP 包直接丢
iptables -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP   # 新连接必须 SYN 开头
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP                 # NULL 扫描
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP                  # Xmas 扫描
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP          # SYN+FIN
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP          # SYN+RST
iptables -A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP  # Fin/Urg/psh 组合
iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ACK,PSH,URG -j DROP

### 6. SYN Flood 防护
iptables -N SYN_FLOOD
iptables -A INPUT -p tcp --syn -j SYN_FLOOD
iptables -A SYN_FLOOD -m limit --limit 50/s --limit-burst 100 -j RETURN
iptables -A SYN_FLOOD -j DROP        # 超速的 SYN 全丢

### 7. ICMP:允许 ping(小包),禁大 ping / 广播
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type broadcast-request -j DROP
# 需要完全禁 ping(防 ICMP Flood):删上面两行,加 ↓
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

### 8. 开放业务端口
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSH --rsource
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP  # SSH 60 秒 5 次新连接 = 封
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

### 9. 单 IP 连接数限制(防慢速/连接耗尽)
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP
iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 50 -j DROP

### 10. UDP 谨慎开放(游戏服按需)
# iptables -A INPUT -p udp --dport 2456:2458 -j ACCEPT   # 示例:英灵神殿
# 其他 UDP 默认已 DROP(默认策略)

### 11. 日志(最后,被丢的包记下来给分析)
iptables -A INPUT -m limit --limit 5/m -j LOG --log-prefix "iptables-dropped: " --log-level 7

三、逐段详解:关键规则在防什么

3.1 第 3 条:ESTABLISHED,RELATED(最容易被忘)

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

没有这条,你的网站能出去回不来——TCP 是双向的,请求出去、响应回来,回来的包属于「已建立连接」。默认 DROP 策略下不加这条,用户访问全超时。新手配 iptables 第一大坑就是这个。

3.2 第 5 条:扫描防护

Nmap 扫描用各种畸形 TCP 包探你的端口状态。--tcp-flags 匹配组合:

  • ALL NONE:所有标志位都清(NULL 扫描)
  • ALL ALL:所有标志位置位(Xmas 扫描)
  • SYN,FIN SYN,FIN:FIN 不带 ACK、SYN 带 FIN——正常协议栈永远不会产生的组合

这些包有一个共同点:正常网络设备永远不会发。所以放心 DROP,零误杀。

3.3 第 6 条:SYN Flood 限流

iptables -N SYN_FLOOD
iptables -A INPUT -p tcp --syn -j SYN_FLOOD
iptables -A SYN_FLOOD -m limit --limit 50/s --limit-burst 100 -j RETURN
iptables -A SYN_FLOOD -j DROP

思路:SYN 包走自定义链,每秒 50 个以内的 RETURN(放行),超速的 DROP。阈值按业务调——正常站点新连接几十到几百每秒,攻击时几万。50/s 偏保守(适合低流量站),电商大促要调高。

3.4 第 8 条:SSH 防爆破(recent 模块)

iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP

recent 模块记录源 IP:第一次 SSH 新连接记名,60 秒内第 5 次新连接就 DROP。爆破脚本每秒试几十次密码的,直接被关在门外。

进阶:SSH 更稳的姿势是改端口 + 密钥登录 + fail2ban(SSH 加固),iptables recent 是兜底。

3.5 第 9 条:连接数限制(connlimit)

iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP

单 IP 超过 50 个并发连接就丢。防 Slowloris(几百慢速连接)和连接耗尽攻击。阈值按业务调:普通网站 50 够,下载站/长连接业务要放开。

四、游戏服专用版

游戏服 UDP 为主,模板这样改:

### 游戏服核心:只开游戏端口,UDP 严格管控
# Rust:28015 游戏 + 28016 RCON(RCON 只放管理 IP!)
iptables -A INPUT -p tcp --dport 28015 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p udp --dport 28015 -j ACCEPT
iptables -A INPUT -p tcp --dport 28016 -s 你的管理IP/32 -j ACCEPT    # RCON 只给你
# 其他 UDP 全 DROP(默认策略)

# 英灵神殿:UDP 2456-2458
iptables -A INPUT -p udp --dport 2456:2458 -j ACCEPT

# 森林之子:8766/27016/9700
iptables -A INPUT -p udp --dport 8766 -j ACCEPT
iptables -A INPUT -p udp --dport 27016 -j ACCEPT
iptables -A INPUT -p udp --dport 9700 -j ACCEPT

# UDP Flood 缓解(杯水车薪,但比没有强)
iptables -A INPUT -p udp -m limit --limit 200/s --limit-burst 500 -j ACCEPT
# 注意:这行会误杀正常游戏 UDP 洪流(游戏协议突发包多)——按游戏实测调

游戏服的 UDP 限流要极度小心:游戏协议本身就是高频小包(玩家移动同步),限流阈值设低了直接卡玩家。游戏服防 UDP Flood 主要靠高防,本机 iptables 只做端口管控。

五、持久化与运维

5.1 保存规则(重启不丢)

# Debian/Ubuntu
apt install -y iptables-persistent
netfilter-persistent save
# 规则存到 /etc/iptables/rules.v4

# CentOS(firewalld 系统)
# 直接禁用 firewalld 用 iptables:
systemctl disable --now firewalld
iptables-save > /etc/sysconfig/iptables
systemctl enable iptables

5.2 改规则的救命流程

规则写错把自己关门外的概率极高。安全流程:

# 1. 先在 screen/tmux 里操作(断线不丢会话)
screen -S ipt

# 2. 或者设置定时任务:5 分钟后自动清空规则(后悔药)
echo "iptables -F; iptables -P INPUT ACCEPT" | at now + 5 minutes

# 3. 再应用新规则
bash rules.sh

# 4. 确认 SSH 还能连(新终端登录测试)
# 5. 没问题就取消后悔药
atrm <任务号>

没有 at 命令:先 sleep 300 && iptables -F 后台跑一条,测试完 kill 掉。

5.3 规则备份与版本管理

iptables-save > /etc/iptables/rules.v4.backup-$(date +%F)
# 改规则前先备份,出问题 10 秒回滚
iptables-restore < /etc/iptables/rules.v4.backup-2026-10-21

六、监控与日志分析

# 看当前规则命中情况(找没用的规则删掉)
iptables -L -v -n --line-numbers | head -30
# pkts 列 = 命中包数,长期 0 的规则可以考虑删

# 看被丢的包去了哪(日志)
dmesg | grep "iptables-dropped" | tail -20
# 或 journalctl -k | grep iptables-dropped

# 实时看 TOP 被封 IP(配合日志聚合)
tail -f /var/log/kern.log | grep iptables-dropped

日志量控制:-m limit --limit 5/m 防止日志刷爆磁盘——被 DDoS 时全记录能几分钟写满一个 G。

七、完整部署检查清单

□ SSH 先测通再上规则(screen/at 后悔药就位)
□ lo 接口放行(本地服务:MySQL/Redis 通信)
□ ESTABLISHED,RELATED 放行(回程包)
□ 22 端口有 recent 防爆破(或已改端口+密钥)
□ 80/443 已开(业务正常)
□ 游戏 UDP 端口已开(游戏服)
□ 扫描包规则命中(nmap 自测:nmap -sS/-sF 你的IP → 全 filtered)
□ 规则已持久化(reboot 不丢)
□ 日志限流开启(不会刷爆磁盘)
□ 大流量攻击的预案明确(切高防,不是改 iptables)

自测扫描防护(拿 nmap 打自己验证):

nmap -sS -p 1-1000 你的服务器IP
# 结果:只有 22/80/443 开放,其他 filtered = 防护生效

八、小结

iptables 防护模板五件套:默认 DROP + ESTABLISHED 放行(基础)、畸形包过滤(防扫描)、SYN 限流 + 连接数限制(防小洪水)、recent 模块防爆破(SSH)、端口最小化(UDP 严格管控)。它是源站的地基,但记住边界:带宽被打满时 iptables 是摆设,大流量永远靠高防(高防选购)。运维上铁律是改规则先备好后悔药——十个站长九个被自己写的 INPUT 规则锁在门外过。


相关阅读:


本文由财富云计算整理,我们提供高防服务器、CDN 防护与 NAT 型云服务器,无独立公网 IP 机型价格比独立 IP 省一半以上,需要防火墙方案定制或高防产品的咨询。更多教程见端口速查表。
延伸阅读
  1. 高防误区与避坑清单:25 个坑+下单前必问 14 问+到货验货流程
  2. DNS 攻击防护专题:劫持、隧道、投毒、放大四类攻击与 DNSSEC
  3. 电商大促防攻击预案:T-14 到当天的分级响应与降级开关
  4. 源站真实 IP 隐藏完全指南:六大暴露面排查+NAT 型终极方案
  5. 日志分析找攻击源:Nginx 日志三维度分析法与证据固定
  6. 攻击应急响应手册:六阶段响应流程,从确认到复盘的照做清单
  7. OpenResty Lua 自研 WAF:动态限流+攻击特征检测+Redis 黑名单
  8. Nginx 进阶防护:连接层、请求层、行为层三层生产级配置
更多阅读
  1. 上一篇:OpenResty Lua 自研 WAF:动态限流+攻击特征检测+Redis 黑名单
  2. 下一篇:攻击应急响应手册:六阶段响应流程,从确认到复盘的照做清单
发表评论 2