发新话题
打印

iptables实战:5条规则挡住80%攻击(改进)

iptables实战:5条规则挡住80%攻击(改进)

iptables实战:5条规则挡住80%攻击
https://mp.weixin.qq.com/s/V1ONeC03boO9F4veB_NOIw

AI改进:


这两条命令是一组常见的防端口扫描(Port Scan)规则。
这两条命令的作用
第一条(检测并丢弃):

iptables -A INPUT -m recent --name portscan --rcheck --seconds 60 --hitcount 5 -j DROP
如果同一个 IP 在 60 秒内 出现了 5 次以上 记录,就直接 DROP(丢弃)该数据包。
第二条(记录每次访问):
iptables -A INPUT -m recent --name portscan --set
每次有数据包进来,就把这个 IP 的访问时间记录(或更新)到 portscan 这个列表里。
组合效果:60秒内同一个IP访问超过5次,就会被拉黑丢弃。
⚠️ 重要提醒:这样直接使用有问题
你现在的写法顺序是正确的,但范围太宽。如果直接把第二条放到最后,它会统计所有进来的数据包(包括 SSH、Web、Ping 等正常流量),很容易误伤自己或正常用户。
推荐的更实用写法

# 1. 允许已建立的连接(必须放在最前面)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 2. 防端口扫描(推荐写法)
iptables -A INPUT -m recent --name portscan --rcheck --seconds 60 --hitcount 5 -j DROP
iptables -A INPUT -m recent --name portscan --set

# 3. 允许正常服务(示例)
iptables -A INPUT -p tcp --dport 22  -j ACCEPT     # SSH
iptables -A INPUT -p tcp --dport 80  -j ACCEPT     # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT     # HTTPS
# ... 其他端口

# 4. 默认丢弃
iptables -A INPUT -j DROP
更精确的防扫描规则(推荐)
如果你只想保护常见被扫端口,可以这样写:

# 只对新连接进行扫描检测
iptables -A INPUT -m conntrack --ctstate NEW -m recent --name portscan --rcheck --seconds 60 --hitcount 5 -j DROP

iptables -A INPUT -m conntrack --ctstate NEW -m recent --name portscan --set
或者进一步限制只对特定端口生效:

    iptables -A INPUT -p tcp -m multiport --dports 22,80,443,3389 -m conntrack --ctstate NEW \
-m recent --name portscan --rcheck --seconds 60 --hitcount 4 -j DROP

iptables -A INPUT -p tcp -m multiport --dports 22,80,443,3389 -m conntrack --ctstate NEW \
-m recent --name portscan --set
实用命令

# 查看当前 recent 列表(可以看到被记录的IP)
cat /proc/net/xt_recent/portscan

# 清空某个列表
iptables -A INPUT -m recent --name portscan --remove

# 保存规则(不同系统方法不同)
# Debian/Ubuntu / Proxmox
iptables-save > /etc/iptables.rules
# CentOS / 统信 / 银河麒麟
service iptables save

==================

这两条命令是经典的 SYN Flood 防护规则。
这两条命令的作用
第一条:

iptables -A INPUT -p tcp --syn -m limit --limit 20/s --limit-burst 40 -j ACCEPT
只匹配新连接请求(带 SYN 标志的 TCP 数据包)。
全局速率限制:每秒最多接受 20 个新连接,允许瞬间突发(burst)40 个。
在限制范围内则允许通过。
第二条:

iptables -A INPUT -p tcp --syn -j DROP
超过上面限制的所有 SYN 包直接丢弃。
整体效果:对整个服务器进行全局 SYN 速率限制,防止 SYN Flood 攻击耗尽服务器连接资源。
⚠️ 存在的问题和注意事项
全局限制:这个规则对所有端口生效(包括 SSH、Web、数据库等)。如果你的服务器有 Web 服务(80/443),20/s 可能太低,正常高峰流量就容易被误伤。
不是 per-IP 限制:它是整个服务器的总速率,不是单个 IP 的限制。
顺序非常重要:这两条规则必须放在允许 ESTABLISHED 连接之后,否则已建立的连接也可能受影响。
推荐的改进写法

# 1. 必须放在最前面:允许已建立的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 2. 允许 ICMP(可选,但推荐)
iptables -A INPUT -p icmp -j ACCEPT

# 3. SYN Flood 防护(建议按端口分别设置)
# 示例:对 SSH 较严格,对 Web 放宽
iptables -A INPUT -p tcp --dport 22  --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 80  --syn -m limit --limit 50/s --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 --syn -m limit --limit 50/s --limit-burst 100 -j ACCEPT

# 其他端口按需添加...

# 4. 超过限制的 SYN 全部丢弃
iptables -A INPUT -p tcp --syn -j DROP
更现代/更强的防护建议(推荐)
结合 recent 模块(防端口扫描 + SYN Flood):

# 每 IP 60秒内最多 15 个新连接
iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -m recent --name synflood --rcheck --seconds 60 --hitcount 15 -j DROP
iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -m recent --name synflood --set
使用 connlimit(限制单个 IP 最大并发连接):

iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 30 -j DROP
============
这是一组限制 Ping 的规则,整体思路正确,但写法可以优化。当前规则分析

# 只允许必要的ICMP(ping)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp -j DROP

作用:允许别人 Ping 你,但每秒最多 1 个 echo-request。
其他所有 ICMP 类型(包括 destination-unreachable、time-exceeded 等)全部 DROP。

存在的问题过于严格:直接 DROP 其他 ICMP 类型会导致网络诊断变差(如 traceroute 失效、PMTU 发现问题、某些路由反馈丢失)。
全局速率限制:1/s 是整个服务器的限制,不是单 IP 限制,容易被少量请求就影响自己。
顺序问题:如果没有先允许 ESTABLISHED,RELATED,可能出问题。
echo-reply 未明确处理(虽然通常被 conntrack 放行,但最好明确)。

推荐的改进版本

# === ICMP 防护(建议放在 ESTABLISHED 规则之后)===

# 1. 允许已建立的和相关的 ICMP(推荐)
iptables -A INPUT -p icmp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 2. 限制 Ping(echo-request),推荐按 IP 限制 + 更合理速率
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/s --limit-burst 4 -j ACCEPT

# 可选:更强的单 IP 防 Ping Flood(推荐)
# iptables -A INPUT -p icmp --icmp-type echo-request -m recent --name ping_flood --rcheck --seconds 60 --hitcount 10 -j DROP
# iptables -A INPUT -p icmp --icmp-type echo-request -m recent --name ping_flood --set

# 3. 允许常用且必要的 ICMP 类型(强烈建议)
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT

# 4. 最后丢弃其他 ICMP
iptables -A INPUT -p icmp -j DROP

完整建议顺序(INPUT 链推荐顺序)ESTABLISHED,RELATED 允许
ICMP 规则(使用上面改进版)
防端口扫描(你之前那组 recent 规则)
SYN Flood 防护
允许具体服务端口(22、80、443 等)
默认 DROP

[ 本帖最后由 linda 于 2026-6-2 17:06 编辑 ]

TOP

发新话题