SYN Flood 攻击防范:自动化脚本的实现与分享

SYN Flood 攻击防范:自动化脚本的实现与分享

文章目录
文章目录
  1. 1. 事情是怎么开始的?
  2. 2. 设置人机验证页面
  3. 3. 服务器流量分析
  4. 4. 编写脚本实现自动 + 手动封禁
  5. 5. 自动化识别机器人 + 白名单
  6. 6. 半自动维护信任 ipset 列表

最近几天,我发布了关于本站遭遇攻击的记录。由于我并非安全领域的专业人士,且缺乏应对如此大规模攻击的经验,因此在初期判断上出现了一些偏差。从最初怀疑是内部自爆,再到认为是伪装 UA 的恶意流量攻击,经过一段时间的分析与反思,我几乎可以确认这次攻击是一次 SYN Flood 攻击,尽管仍有少许不确定。

在上一篇日志中,我提到使用了 IPSET 和脚本来动态封锁攻击 IP,整体效果是有一定成效的,但依然不足以应对如此规模的攻击。因此,我加大了防护力度,花了一整天时间进行优化,形成了几个更加高效的脚本。为了写这篇文章,我还对这些脚本进行了美化,希望未来你也能从中获益,或者用到其中的一些思路。

本篇日志将详细记录此次攻击事件的始末、遭遇以及处理措施,作为本次 Kevin's Space 小破站攻防战的最终篇章。内容较长,有兴趣的可以看个热闹,如若不幸后面也遇到了类似事件,可以参考一下。


1. 事情是怎么开始的?

端午假期的最后一天清晨,我像往常一样查看博客,却发现网站无法访问,页面报出 503 错误。很快我注意到,宝塔面板上的资源占用异常,服务器持续处于过载状态,初步判断可能是遭遇了攻击。排查一番后,我怀疑是宝塔面板中的木马扫描插件 OneAV 引起的问题。

于是我立刻停用并删除了该插件,网站也随之恢复了正常访问。但这还远没结束。

下午,我发现服务器流量依然异常,资源消耗也不正常。我尝试启用 WAF 屏蔽境外流量、在 Nginx 配置中禁止空 UA 访问、用 iptables 添加限速和封锁规则,但一一无效。更诡异的是,不管是网络流量监控,还是服务器的 access/error 日志,几乎都查不到可疑请求,后台记录一片“风平浪静”,流量却持续不断,仿佛凭空出现。

SYN Flood 攻击防范:自动化脚本的实现与应用
SYN Flood 攻击防范:自动化脚本的实现与应用

期间我还启用了 Cloudflare,开启“I'm Under Attack”模式,强制浏览器验证,调高安全级别,并限制非国内访问。不仅没有改善,反而一度影响了国内用户正常访问。

后来我进一步测试,确认攻击目标是本站 Kevin's(shephe.com) ——只要关闭站点,服务器立即恢复正常。但就像刚才说的,日志和统计工具里依然毫无踪迹,让我感到极度困惑,远远超出了我的认知范围。

2. 设置人机验证页面

Cloudflare 本身也有类似的验证机制,很多人都在用,我也试了。但可能是我配置得不太对,它在实际使用中会大量拦截国内的正常用户,访问体验很糟糕。所以没用多久我就关掉了,转而尝试自己设置人机校验页面。

2.1 服务端访问验证配置

以下这段 Nginx 配置通过 map 指令预先识别出搜索引擎蜘蛛和已通过验证的用户,为它们设置相应的标记变量。然后,结合变量 $need_verify,配置服务器强制未验证用户跳转到中间验证页,确保只有通过人机校验的访问者才能继续浏览网站内容。验证页面和必要的资源(如 JS 脚本、RSS 订阅接口)被设置为白名单,避免影响正常访问。

# ========== 访问验证 map 定义 ==========
map $http_user_agent $is_spider {
    default 0;
    "~*(googlebot|bingbot|baiduspider|360spider|sogou|yandexbot|duckduckbot)" 1;
}

map $http_cookie $is_verified {
    default 0;
    "~*verified=1" 1;
}

server {
    listen 80;
    listen 443 ssl;
    http2 on;
    server_name shephe.com www.shephe.com;
    root /www/wwwroot/shephe.com;
    index index.php index.html index.htm default.php default.htm default.html;

    # ======= 访问验证逻辑 BEGIN =======
    set $need_verify 1;

    if ($is_spider = 1) {
        set $need_verify 0;
    }

    if ($is_verified = 1) {
        set $need_verify 0;
    }

    if ($uri ~* ^/(verify\.html|verify\.js)) {
        set $need_verify 0;
    }

    if ($uri ~* ^/feed/?$) {
        set $need_verify 0;
    }

    # 验证页跳转逻辑(已注释)
    # if ($need_verify = 1) {
    #     return 302 /verify.html?next=$request_uri$is_args$args;
    # }
    # ======= 访问验证逻辑 END =======

    ...
}

2.2 前段页面实现

于是我自己动手,设置了一个中间验证页面,强制所有访问本站的 IP 都必须先经过这一页跳转,才能进入网站内容。

一开始我做的是一个需要手动输入四位验证码的页面,虽然有点麻烦,但效果还不错。后来觉得操作成本太高,就改成了一个只需要鼠标单击确认的页面。再后来,我加上了 JS 逻辑,用来侦测鼠标的运动轨迹——只要页面检测到一定程度的鼠标移动,就自动跳转到目标页面。

这个思路虽然简单粗暴,但效果非常明显。特别是在攻击高峰期,大量流量都打到了这个中间验证页上。由于页面本身只有约 2KB,服务器的负载得到了明显缓解,压力也减少了不少。

3. 服务器流量分析

既然宝塔面板提供的流量监控看不出任何异常请求,那就只能自己动手分析了。我首先使用了 iftop 工具(一个基于终端界面的实时流量监控工具),发现有些流量是直接对 IP 的访问,有些则附带了域名。

3.1 IP 访问记录

为了更清晰地了解服务器正在遭受的流量类型,我写了一个简单的监听脚本。它会自动在后台运行,使用 tcpdump 实时监听服务器的网络接口,提取外部访问的源 IP,并过滤掉内网地址及部分已知的无效 IP。最终结果按“时间戳 + IP(可选的反查域名)”的格式写入日志文件,便于后续分析和封锁处理。

2025-06-05 20:31:28 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:28 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:28 => 65.108.78.33 (linux11.r00tbase.de)
2025-06-05 20:31:28 => 65.108.78.33 (linux11.r00tbase.de)
2025-06-05 20:31:28 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:28 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:28 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:28 => 65.108.78.33 (linux11.r00tbase.de)
2025-06-05 20:31:28 => 65.108.78.33 (linux11.r00tbase.de)
2025-06-05 20:31:28 => 65.108.78.33 (linux11.r00tbase.de)
2025-06-05 20:31:28 => 65.108.78.33 (linux11.r00tbase.de)
2025-06-05 20:31:28 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:28 => 184.94.240.88
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 65.108.78.33 (linux11.r00tbase.de)
2025-06-05 20:31:29 => 184.94.240.88
2025-06-05 20:31:29 => 184.94.240.88
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 65.108.78.33 (linux11.r00tbase.de)
2025-06-05 20:31:29 => 65.108.78.33 (linux11.r00tbase.de)
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 184.94.240.88
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 65.108.78.33 (linux11.r00tbase.de)
2025-06-05 20:31:29 => 65.108.78.33 (linux11.r00tbase.de)
2025-06-05 20:31:29 => 113.88.203.89
2025-06-05 20:31:29 => 113.88.203.89
2025-06-05 20:31:29 => 113.88.203.89
2025-06-05 20:31:29 => 184.94.240.88
2025-06-05 20:31:29 => 184.94.240.88
2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com)
2025-06-05 20:31:29 => 113.88.203.89
2025-06-05 20:31:29 => 113.88.203.89
2025-06-05 20:31:29 => 113.88.203.89
2025-06-05 20:31:29 => 113.88.203.89

这个日志监听脚本逻辑其实很简单,输出结果会被保存到 /root/visitor-log.txt 文件中——这份日志也将成为我后续分析和封锁攻击 IP 的关键依据。通过前面的片段可以看到,一秒之内就有成百上千个来路不明的 IP 源源不断地访问服务器,十分夸张。下面是这个脚本的完整内容:

#!/bin/bash

# === 自我后台化(首次运行自动进入后台) ===
if [[ "$1" != "--child" ]]; then
    nohup bash "$0" --child > /dev/null 2>&1 &
    echo "[*] 日志监听脚本已转入后台运行(可关闭终端)"
    exit 0
fi

# === 日志采集逻辑 ===
LOGFILE="/root/visitor-log.txt"
INTERFACE=$(ip route get 8.8.8.8 | awk '{print $5}')
BLOCKED_IPS="123\.146\.49\.226|233\.5\.5\.5|233\.6\.6\.6|114\.114\.114\.114"

echo "[*] 开始监听接口:$INTERFACE,日志输出至 $LOGFILE"
touch "$LOGFILE"

# === 实时监听流量(过滤端口 + IP) ===
sudo stdbuf -oL tcpdump -i "$INTERFACE" not port 27149 -nn -l \
| awk '{print $3}' \
| grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' \
| grep -vE '^127\.|^10\.|^192\.168\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^100\.100\.|^('"$BLOCKED_IPS"')$' \
| while read -r ip; do
    # 可选:DNS 反查
    hostname=$(dig +short -x "$ip" | sed 's/\.$//')

    # 输出日志
    if [[ -z "$hostname" ]]; then
        echo "$(date '+%F %T') => $ip" >> "$LOGFILE"
    else
        echo "$(date '+%F %T') => $ip ($hostname)" >> "$LOGFILE"
    fi
done

3.2 利用 Tshark 进一步分析流量

通过上面的脚本,我已经记录了大量的 IP,并配合定时任务分析一段时间内的高频访问源,先是手动封禁,后来发展为自动加入 ipset 封锁(这一块后文会详述)。但即便如此,异常访问仍然像潮水一样不断涌入,封也封不完。

于是我决定进一步深入流量本身,尝试获取更底层的数据。最开始我用了一些常规工具,但效果都不理想,采集到的内容很有限。最后我转向了更强大的网络协议分析工具 —— tshark

我甚至尝试过让 tshark 加载服务器的 SSL 密钥,以便解密 HTTPS 流量获取更完整的内容,但受限于服务器资源,加上操作不太熟练,几次尝试都没成功。不过最终我还是写了一个简单的采集脚本,成功提取出了部分结构化的流量数据,访问日志片段如下:

Jun  5, 2025 20:24:56.647452000 CST => 202.120.37.39:57009 → 172.16.13.182:443 | 117 Bytes | SNI: N/A
Jun  5, 2025 20:24:57.640061891 CST => 202.120.37.39:57045 → 172.16.13.182:443 | 117 Bytes | SNI: N/A
Jun  5, 2025 20:24:57.640061891 CST => 202.120.37.39:57045 → 172.16.13.182:443 | 117 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.193737876 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 74 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.193737876 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 74 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.225838658 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 66 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.225838658 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 66 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.234412822 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 583 Bytes | SNI: chenguo.life
Jun  5, 2025 20:24:58.234412822 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 583 Bytes | SNI: chenguo.life
Jun  5, 2025 20:24:58.267474749 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 66 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.267474749 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 66 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.268228835 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 146 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.268228835 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 146 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.268588781 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 430 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.268588781 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 430 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.300461981 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 66 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.300461981 CST => 118.193.40.54:40550 → 172.16.13.182:443 | 66 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.514586281 CST => 147.135.213.9:33836 → 172.16.13.182:443 | 74 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.514586281 CST => 147.135.213.9:33836 → 172.16.13.182:443 | 74 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.599170055 CST => 112.124.26.230:42214 → 172.16.13.182:443 | 74 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.599170055 CST => 112.124.26.230:42214 → 172.16.13.182:443 | 74 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.707716201 CST => 49.74.19.38:36140 → 172.16.13.182:443 | 146 Bytes | SNI: N/A
Jun  5, 2025 20:24:58.707716201 CST => 49.74.19.38:36140 → 172.16.13.182:443 | 146 Bytes | SNI: N/A

从上面的日志可以看出,大部分流量请求都没有携带 SNI 信息(SNI 是 TLS 握手中的 Server Name Indication,用于在多站点共用一个 IP 时指明访问的目标域名),而且绝大多数连接的数据量极小,往往只有几十个字节……难怪服务器日志里查不到任何访问记录——根本就没握手成功!这时,一个古老的词汇浮现在我脑海:这难道不就是传说中的 SYN Flood 攻击么?

类型特征是否吻合
SYN Flood发送大量 TCP SYN,不完成三次握手,耗尽连接队列✅ 有很多 60 Byte 包,可能是 SYN
TLS Flood建立 TCP 连接后立即断开或发送伪造 TLS ClientHello,占用 CPU 握手资源✅ 部分为 66~78 Byte 包,像 TLS Hello
简单分析流量特征

可话说回来,那为什么宝塔面板首页显示的流量还那么高呢?我于是又翻了阿里云后台的流量账单,一笔笔去对照,结果发现两边的数据根本对不上……直到攻击爆发两天后我才意识到:宝塔面板首页统计的是所有网口的流量,连带内网、环回口也一并算上了,而实际上如果只看外网口,整体流量并没有那么夸张。这才恍然大悟——原来又是一出草台班子般的误导操作,乌龙得很!

SYN Flood 攻击防范:自动化脚本的实现与应用
这个面板一定要选对网口,不然会严重误导判断

但不管怎样,服务器上此时依旧持续涌入海量 IP,且大多数来源都显示为国内。它们发送的都是极其短小、毫无有效负载的数据包,因此 Cloudflare、默认防火墙规则等传统防护手段几乎全部失效,形同虚设。

4. 编写脚本实现自动 + 手动封禁

基于这种流量的特点,我尝试了 Cloudflare 的各种设置,包括开启 SYN Flood 防护模式,以及 iptables 的相关连接限速、防 SYN 的规则……但全都无效。这类流量实在太“轻盈”了,轻到你防不胜防,几乎打不住。

最后,还是得回归老办法——手动封禁 IP。不过在这个过程中,我顺手写了几个实用且高效的脚本,配合已有的日志和分析数据,实现了“半自动+手动”结合的封锁机制,虽然有点土法炼钢,但实际效果还真不错。

实时流量和连接数

以上视频展示的是我基于前文第 3.1 和 3.2 节实现的几个监控工具,包括实时 IP 流量、访问详情日志以及实时连接数统计脚本。从视频中可以直观地看到攻击的强度有多“离谱”。

虽然总流量数据看起来并不算夸张,但并发连接数异常之高才是关键。我用的是一台阿里云的 2C 小型 VPS,通常并发数只要达到 300 左右,服务器就几乎瘫痪。而这几天的实际情况是,并发连接始终没低于 100,大部分时间都徘徊在 200~300 之间,极度拉胯。为应对这种状态,我尝试了三个自动封禁脚本:

  1. 高频 IP 自动封禁脚本:统计一个时间段内的访问频次,超过设定阈值的 IP 自动加入封禁列表。
  2. SNI 缺失封禁脚本:筛选在一定时间段内从未提交过 SNI(Server Name Indication)信息的连接进行封禁。这个脚本初期看似有用,但后面发现大量正常访问也没有 SNI,不知道是什么原理,误伤严重,最后只好弃用。
  3. 域名连接优先封禁脚本:凡是请求中 IP 带有域名信息(通常是明显的探测或不明访问),一律封禁。该脚本与第一个配合使用,封禁速度“飞起”。

目前,封禁 IP 数已接近 6000 个,而且还在不断增长中。虽然这套方法有些“极端”,但确实是目前唯一能缓解并发压力的可行方案,以下是这两个脚本的内容。

4.1 时间段内高频 IP 自动封禁

这个脚本逻辑非常简单:它被添加到定时任务中,每隔几分钟就会扫描一次 3.1 节生成的访问日志,从中提取高频 IP 并自动加入 ipset 封禁列表。同时,我也设置了白名单机制,并让脚本保持后台运行。但后续使用中我逐渐发现,其实这些处理并非都必要,具体原因将在后文详述。

#!/bin/bash

LOG="/root/visitor-log.txt"
TMPFILE="/tmp/ip_hits.tmp"
IPSET_EXISTING="/tmp/ipset_existing.txt"
THRESHOLD=2000
WHITELIST=("123.146.49.226" "172.16.13.182" "39.144.218.219")

NOW=$(date +%s)
CUTOFF=$(date -d "-10 min" +%s)

# 提取 10 分钟内频繁访问的公网 IP
awk -v now="$NOW" -v cutoff="$CUTOFF" -v t="$THRESHOLD" '
function is_private(ip) {
  split(ip, a, ".")
  return (a[1]==10) || (a[1]==172 && a[2]>=16 && a[2]<=31) || (a[1]==192 && a[2]==168) || (a[1]==100 && a[2]==100)
}
{
  if (match($0, /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/, tstamp)) {
    gsub(/[-:]/, " ", tstamp[0])
    ts = mktime(tstamp[0])
    if (ts >= cutoff && ts <= now) {
      if (match($0, /=> ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/, m)) {
        ip = m[1]
        if (!is_private(ip)) {
          count[ip]++
        }
      }
    }
  }
}
END {
  for (ip in count)
    if (count[ip] > t)
      print ip
}' "$LOG" > "$TMPFILE"

# 获取已在 ipset 中的 IP
ipset list blocked_ips -output plain | awk '/^Members:/{flag=1; next} flag' > "$IPSET_EXISTING"

# 封锁未封过且不在白名单的 IP
grep -F -x -v -f "$IPSET_EXISTING" "$TMPFILE" | while read -r ip; do
    if [[ ! " ${WHITELIST[*]} " =~ " $ip " ]]; then
        ipset add blocked_ips "$ip" -exist
        echo "[封锁] $ip"
    fi
done

4.2 查询 IP 是否反代 + 自动封禁

个脚本更为简单,实时运行,直接根据日志中如 2025-06-05 20:31:29 => 162.155.113.54 (syn-162-155-113-054.biz.spectrum.com) 这类记录,立即封禁对应的 IP,比如示例中的 162.155.113.54。不过这种方式误伤率较高,会把所有搜索引擎的机器人也一并封掉。

#!/bin/bash

LOG="/root/visitor-log.txt"
IPSET_NAME="proxied_ips"
TMP_IPS="/tmp/seen_proxies.tmp"

# 缓存处理过的 IP,避免重复处理
touch "$TMP_IPS"

echo "[启动] 实时监听 $LOG 中的反代 IP ..."

tail -Fn0 "$LOG" | grep --line-buffered -oP '=> \K[\d\.]+(?= \()' | while read -r ip; do
    # 是否已处理过
    if grep -Fxq "$ip" "$TMP_IPS"; then
        continue
    fi

    # 添加进 IPSET(若不在)
    if ! ipset test "$IPSET_NAME" "$ip" &>/dev/null; then
        ipset add "$IPSET_NAME" "$ip"
        echo "[封锁] $ip"
    fi

    # 标记已处理
    echo "$ip" >> "$TMP_IPS"

    # 控制速率,避免系统过载(可调节)
    sleep 0.05
done

4.3 iptables 与 ipset 的应用及踩坑提醒

上文提到,我最开始是通过提取高频 IP 列表,手动添加到宝塔 WAF 的黑名单中进行封禁。这样做不仅效率低下、耗时耗力,而且由于规则数量多,通过 Web 端维护起来也比较麻烦,服务器响应变慢。

后来,我逐步摸索学习,才了解到 ipset 这个强大工具。ipset 是 Linux 下用于高效管理大量 IP 地址集合的工具,它可以与 iptables 配合使用,实现快速匹配和封禁。相比传统的 iptables 单条规则匹配,ipset 允许将成千上万个 IP 集合在一个“集合”里,大幅减少防火墙规则数,提高过滤性能。

目前我维护了三条 ipset 集合,其中两条是通过上述脚本自动收集的“黑名单”,另一条则是我手动创建和维护的白名单,包含本机设备和各类搜索引擎蜘蛛等可信 IP。

root@aliyun:~# iptables -L -n -v --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     173K   36M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set trusted_ips src
2        0     0 DROP       all  --  *      *       101.133.155.16       0.0.0.0/0
3      582 37402 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set proxied_ips src
4        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set monitor_filter src tcp dpt:443
5        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set monitor_filter src tcp dpt:80
6      35M   22G IN_BT      all  --  *      *       0.0.0.0/0            0.0.0.0/0
7      581 46577 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set bt_ip_filter src tcp dpt:443
8     3730  375K DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set bt_ip_filter src tcp dpt:80
9    83843 5057K DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set blocked_ips src
10   51769 3033K synflood   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 flags:0x17/0x02
11     178 16351 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 #conn src/32 > 20

上面列出来的是我当前的 iptables 列表,可见我的信任 ipset 在第一个,按照 iptables 的规则,命中第一条规则以后,后面的就不处理了,也就是说,如果某个 IP 同时在规则 1 的放开清单里,和规则 3 的屏蔽 ipset 里,那么该 IP 是允许访问的。

但我要提醒你的一个大坑是:不要忽略了 iptables raw 的存在。raw 表在 iptables 的处理流程中优先级最高,位于 PREROUTING 和 OUTPUT 链,处理数据包时会先于其他表(如 filter、nat)执行。如果你在 raw 表中设置了规则,比如使用 NOTRACK 或 DROP,可能会直接影响数据包的处理,导致后续 filter 表中的信任 IP 规则失效。

因此,在配置 iptables 时,务必留意各个规则的命中情况,务必检查 raw 表的规则,确保不会与你的 ipset 策略冲突。此外还要注意,默认情况下 iptables 规则和 ipset 表格是重启清零的,要注意持久化保存。

5. 自动化识别机器人 + 白名单

上文 4.2 的脚本自动分析 IP 访问记录,立即封杀带域名的 IP,毫无疑问,这会封杀大量的搜索引擎蜘蛛,所以我后来对这些 IP 进行了剥离,并手动进行了分析,然后创建了上边提到的白名单。这个过程用到了几个 bash 脚本,我用下边的视频演示一下。视频中将展示如何通过脚本从访问日志中提取可能的蜘蛛 IP、手动确认,最后加入到可信 ipset list。

搜索日志中的蜘蛛、统计和分类、加入到可信 ipset

从上边的实际运行可以看到,在过去 24 小时内,我的服务器有 86 万次 TCP/IP 访问,其中蜘蛛访问连接数接近 8 万次,对于一个个人站服务器来讲,访问量惊人(即便它只是 TCP 连接数)。所以最开始我通通封掉,因为太离谱了。

我确实很奇怪,为什么会有这么多机器人来访啊!不过我也通过域名反查以及一些资料,确认了这些个 IP 是真实的蜘蛛,所以上边视频演示中,我就没有做具体的判定了,直接执行了加白操作。

Bing 蜘蛛查询页面
Bing 蜘蛛查询页面

因为我对这个白名单(我会分类附在文末)已经做了分析,尽管各家搜索引擎没有公布自己的服务器 IP,但通过网上的资料以及 DNS 解析还是很好辨认。在这其中,微软 Bing 有自己官方的蜘蛛确认查询工具,是可以肯定 IP 地址无害的。所以,如此高的蜘蛛访问量,或许预示着网站流量即将迎来爆发?我也不知道……😵‍💫😵‍💫😵‍💫

5.1 蜘蛛统计分析脚本

上述视频中,实际上嵌套运行了两个不同的脚本(为啥不写在一起?因为出错了……😅),它们都是基于最开始的访问表实现。第一个是统计分析蜘蛛出现的数量,我只统计了几个常用的 ,可酌情进行修改。

#!/bin/bash

# 日志文件路径
LOG_FILE="/root/visitor-log.txt"

# 定义颜色代码
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 无颜色

# 检查日志文件是否存在
if [[ ! -f "$LOG_FILE" ]]; then
    echo -e "${RED}错误:日志文件 '$LOG_FILE' 不存在。${NC}"
    exit 1
fi

echo -e "${YELLOW}正在分析日志文件:$LOG_FILE${NC}"
echo -e "${YELLOW}统计过去 24 小时内各类蜘蛛的访问次数...${NC}"

# 获取当前时间戳和 24 小时前的时间戳
CURRENT_TIMESTAMP=$(date +%s)
ONE_DAY_IN_SECONDS=$((24 * 60 * 60))
TARGET_TIMESTAMP=$((CURRENT_TIMESTAMP - ONE_DAY_IN_SECONDS))

# 定义 awk 脚本用于统计(可复用)
analyze_log() {
    local time_filter=$1
    awk -v target_ts="$time_filter" '
    BEGIN {
        # 初始化计数器
        google_count = 0
        bing_count = 0
        bytedance_count = 0
        apple_count = 0
        semrush_count = 0
        baidu_count = 0
        yandex_count = 0
        ahrefs_count = 0
        mj12bot_count = 0
        qihoo_count = 0
        sogou_count = 0
        other_known_bot_count = 0
        other_unknown_ip_count = 0
    }
    {
        # 检查日志行是否符合预期格式
        if ($3 == "=>") {
            # 提取日期和时间:$1="YYYY-MM-DD", $2="HH:MM:SS"
            timestamp_str = $1 " " $2
            gsub(/-|:/, " ", timestamp_str) # 替换 - 和 : 为空格,转换为 mktime 所需格式
            log_timestamp = mktime(timestamp_str)

            # 根据是否提供时间过滤器决定是否处理
            if (target_ts == 0 || (log_timestamp >= target_ts && log_timestamp != -1)) {
                # 提取 IP 和主机名
                ip = $4
                hostname = ""
                if (match($0, /\(([^)]+)\)/)) {
                    hostname = tolower(substr($0, RSTART + 1, RLENGTH - 2))
                }

                # 根据主机名判断蜘蛛类型
                if (hostname != "") {
                    if (hostname ~ /googlebot\.com/) {
                        google_count++
                    } else if (hostname ~ /msnbot.*\.com|search\.msn\.com/) {
                        bing_count++
                    } else if (hostname ~ /bytedance\.com/) {
                        bytedance_count++
                    } else if (hostname ~ /applebot\.apple\.com/) {
                        apple_count++
                    } else if (hostname ~ /semrush\.com/) {
                        semrush_count++
                    } else if (hostname ~ /baidu\.com/) {
                        baidu_count++
                    } else if (hostname ~ /yandex\.com|yandex\.net/) {
                        yandex_count++
                    } else if (hostname ~ /ahrefs\.com/) {
                        ahrefs_count++
                    } else if (hostname ~ /mj12bot|majestic12\.com/) {
                        mj12bot_count++
                    } else if (hostname ~ /360spider|qihoo\.com/) {
                        qihoo_count++
                    } else if (hostname ~ /sogou\.com/) {
                        sogou_count++
                    } else if (hostname ~ /\.(crawl|bot)\.|spider/) {
                        other_known_bot_count++
                    } else {
                        other_unknown_ip_count++
                    }
                } else {
                    other_unknown_ip_count++
                }
            }
        }
    }
    END {
        # 输出统计结果
        printf "\n%s--- %s 蜘蛛访问统计 ---%s\n", "\033[1;33m", (target_ts == 0 ? "完整日志" : "过去 24 小时"), "\033[0m"
        printf "%-30s %4d\n", "Googlebot:", google_count
        printf "%-30s %4d\n", "Bingbot:", bing_count
        printf "%-30s %4d\n", "ByteDance Spider:", bytedance_count
        printf "%-30s %4d\n", "Applebot:", apple_count
        printf "%-30s %4d\n", "SemrushBot:", semrush_count
        printf "%-30s %4d\n", "Baidu Spider:", baidu_count
        printf "%-30s %4d\n", "YandexBot:", yandex_count
        printf "%-30s %4d\n", "AhrefsBot:", ahrefs_count
        printf "%-30s %4d\n", "MJ12Bot:", mj12bot_count
        printf "%-30s %4d\n", "360 Spider:", qihoo_count
        printf "%-30s %4d\n", "Sogou Spider:", sogou_count
        printf "%-30s %4d\n", "其他已知爬虫:", other_known_bot_count
        printf "%-30s %4d\n", "普通/未知 IP:", other_unknown_ip_count
        printf "%s--------------------------------%s\n", "\033[1;33m", "\033[0m"
    }' "$LOG_FILE"
}

# 执行过去 24 小时的统计
analyze_log "$TARGET_TIMESTAMP"
echo -e ""
# 提示是否查看完整日志统计
read -p "📄 是否分析完整日志统计?(y/N): " view_choice
if [[ "$view_choice" == "y" || "$view_choice" == "Y" ]]; then
    analyze_log 0
fi

# 提示是否运行分离 IP 脚本
read -p "👉 是否运行分离 IP 脚本?(y/N): " run_script
if [[ "$run_script" == "y" || "$run_script" == "Y" ]]; then
    if [[ -f "/root/extract_bots.sh" ]]; then
        echo -e "${YELLOW}正在运行分离 IP 脚本...${NC}"
        bash /root/extract_bots.sh
        if [[ $? -eq 0 ]]; then
            echo -e "${GREEN}分离 IP 脚本运行成功!${NC}"
        else
            echo -e "${RED}错误:分离 IP 脚本运行失败。${NC}"
        fi
    else
        echo -e "${RED}错误:脚本 '/root/extract_bots.sh' 不存在。${NC}"
    fi
fi

5.2 蜘蛛分离归类 + 白名单

这个脚本提取日志中的蜘蛛 IP,可以显示新增数量,也可以直接加入到信任 ipset,并最终归类存储在一个文件中。

#!/bin/bash
set -euo pipefail

LOGFILE="/root/visitor-log.txt"
OUTDIR="/tmp/verifybots"
ALLBOTS_FILE="/tmp/allbots.txt"
HISTORICAL_IPS="/tmp/historical_ips.txt"
mkdir -p "$OUTDIR"

declare -A BOT_DOMAINS=(
  [Googlebot]="googlebot.com"
  [Bingbot]="search.msn.com"
  [Baiduspider]="baidu.com"
  [Bytespider]="bytedance.com"
  [Yahoo]="yahoo.com"
  [Sogou]="sogou.com"
  [360Spider]="so.com"
  [YandexBot]="yandex.ru"
)

total_ips=0
new_ips=0
temp_current_ips="/tmp/current_ips.txt"

# 清空临时文件
> "$temp_current_ips"
> "$ALLBOTS_FILE"

for bot in "${!BOT_DOMAINS[@]}"; do
  domain="${BOT_DOMAINS[$bot]}"
  dom_re=${domain//./\\.}
  
  # 提取该爬虫的 IP
  outfile="$OUTDIR/${bot}_ips.txt"
  grep -E "=> ([0-9]{1,3}\.){3}[0-9]{1,3} \([^)]*${dom_re}[^)]*\)" "$LOGFILE" \
    | sed -E 's/^.*=> ([0-9.]+) .*/\1/' \
    | sort -u > "$outfile" || true

  # 输出到所有爬虫 IP 的文件并收集到临时文件
  echo "### $bot" >> "$ALLBOTS_FILE"
  cat "$outfile" >> "$ALLBOTS_FILE"
  cat "$outfile" >> "$temp_current_ips"
  
  # 统计数量
  bot_ips_count=$(wc -l < "$outfile")
  total_ips=$((total_ips + bot_ips_count))
  
  echo "✅ 提取 $bot 完成:$bot_ips_count 个 IP"
done

# 计算新增 IP 数量并获取新增 IP 列表
if [ -f "$HISTORICAL_IPS" ]; then
  new_ips=$(comm -13 <(sort "$HISTORICAL_IPS") <(sort "$temp_current_ips") | wc -l)
  new_ips_list=$(comm -13 <(sort "$HISTORICAL_IPS") <(sort "$temp_current_ips"))
else
  new_ips=$total_ips
  new_ips_list=$(cat "$temp_current_ips")
fi

# 更新历史 IP 文件
sort -u "$temp_current_ips" > "$HISTORICAL_IPS"

# 输出各自数量及汇总
echo -e "\n🔍 汇总:总共提取了 $total_ips 个 IP"
echo "➕ 增加:本次新增了 $new_ips 个 IP"
if [ $new_ips -gt 0 ]; then
  echo "$new_ips_list" | while IFS= read -r ip; do
    echo "    $ip"
  done
fi
echo ""
echo "📄 查看:cat /tmp/allbots.txt (y/N):"
read -p "" view_choice
if [[ "$view_choice" == "y" || "$view_choice" == "Y" ]]; then
  cat "$ALLBOTS_FILE"
fi

# 提示是否将新增 IP 添加到 ipset trusted_ips
if [ $new_ips -gt 0 ]; then
  echo ""
  echo "🔐 是否将新增的 $new_ips 个 IP 添加到 ipset trusted_ips?(y/N):"
  read -p "" ipset_choice
  if [[ "$ipset_choice" == "y" || "$ipset_choice" == "Y" ]]; then
    echo "$new_ips_list" | while IFS= read -r ip; do
      ipset add trusted_ips "$ip" 2>/dev/null || echo "⚠️ 添加 IP $ip 到 ipset trusted_ips 失败"
    done
    echo "✅ 已将新增 IP 添加到 ipset trusted_ips"
  fi
fi

# 清理临时文件
rm -f "$temp_current_ips"

6. 半自动维护信任 ipset 列表

有了上边自动加白机器人 IP 的脚本,我本来打算纯手动处理其他的一些 IP 地址,比如操作电脑(家宽 IP 每日一变),但后来还是觉得麻烦,且无法记录,所以干脆又做了一个脚本。

这个脚本支持批量查询 IP 是否在黑名单中、支持移除并加白,支持批量、手动加白名单等功能,以下是个实际演示:

半自动维护信任 ipset 列表演示

#!/bin/bash

TRUSTED_SET="trusted_ips"
WHITELIST_FILE="/tmp/whitelist.txt"

# 确保 trusted_ips 集合存在
ipset list "$TRUSTED_SET" &>/dev/null || ipset create "$TRUSTED_SET" hash:ip maxelem 65536

# 定义颜色代码
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 无颜色

# 检查 IP 是否为有效 IPv4 格式
validate_ip() {
  local ip=$1
  if [[ "$ip" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
    return 0
  else
    return 1
  fi
}

# 从白名单文件添加 IP
add_from_whitelist() {
  local added=0
  if [ ! -f "$WHITELIST_FILE" ]; then
    echo -e "${RED}❌ 白名单文件 $WHITELIST_FILE 不存在${NC}"
    return
  fi
  while IFS= read -r ip || [[ -n "$ip" ]]; do
    ip="${ip%%#*}"
    ip="${ip//[[:space:]]/}"
    [[ -z "$ip" ]] && continue
    if validate_ip "$ip"; then
      if ! ipset test "$TRUSTED_SET" "$ip" &>/dev/null; then
        ipset add "$TRUSTED_SET" "$ip"
        ((added++))
        echo -e "  ${GREEN}✅ 已添加 $ip 到 $TRUSTED_SET${NC}"
      fi
    else
      echo -e "  ${RED}❌ 无效的 IP 地址(来自白名单): $ip,跳过${NC}"
    fi
  done < "$WHITELIST_FILE"
  echo -e "${GREEN}✅ 从 $WHITELIST_FILE 添加了 $added 条 IP 到 $TRUSTED_SET${NC}"
}

# 查询 IP 循环
while true; do
  # 统计 proxied_ips 和 blocked_ips 的 IP 数量
  proxied_count=$(ipset list proxied_ips 2>/dev/null | grep -c '^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+') || proxied_count=0
  blocked_count=$(ipset list blocked_ips 2>/dev/null | grep -c '^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+') || blocked_count=0
  echo -e "${GREEN}当前被封控的 IP 表中,proxied_ips:$proxied_count 个,blocked_ips:$blocked_count 个${NC}"
  echo -e ""
  echo -e "${YELLOW}请输入要查询的 IP(可多个,用空格分隔,空行进入添加信任 IP 模式):${NC}"
  read -a ip_list

  # 验证所有输入的 IP
  valid=true
  for ip in "${ip_list[@]}"; do
    if [[ -n "$ip" ]] && ! validate_ip "$ip"; then
      echo -e "${RED}❌ 无效的 IP 地址: $ip,请重新输入${NC}"
      valid=false
      break
    fi
  done

  if $valid; then
    break
  fi
done

# 处理查询的 IP
if [ "${#ip_list[@]}" -gt 0 ]; then
  for ip in "${ip_list[@]}"; do
    echo -e "${YELLOW}🔍 检查 IP: $ip${NC}"
    for set in blocked_ips proxied_ips; do
      if ipset test "$set" "$ip" &>/dev/null; then
        echo -e "  ${GREEN}✅ 存在于 $set${NC}"
        read -p "  ⛔ 是否从 $set 中移除该 IP?(y/N): " choice
        if [[ "$choice" == "y" || "$choice" == "Y" ]]; then
          ipset del "$set" "$ip"
          echo -e "  ${GREEN}✅ 已从 $set 移除 $ip${NC}"
          if ! ipset test "$TRUSTED_SET" "$ip" &>/dev/null; then
            ipset add "$TRUSTED_SET" "$ip"
            echo -e "  ${GREEN}✅ 已添加 $ip 到 $TRUSTED_SET${NC}"
          else
            echo -e "  ${YELLOW}ℹ️ $ip 已存在于 $TRUSTED_SET${NC}"
          fi
        else
          echo -e "  ${YELLOW}⏩ 保留在 $set 中${NC}"
        fi
      else
        echo -e "  ${RED}❌ 不在 $set${NC}"
      fi
    done
    echo
  done
fi

# 提示是否从白名单文件添加 IP
read -p "📋 是否从 $WHITELIST_FILE 添加 IP 到 $TRUSTED_SET?(y/N): " whitelist_choice
if [[ "$whitelist_choice" == "y" || "$whitelist_choice" == "Y" ]]; then
  add_from_whitelist
fi
echo -e ""

# 手动添加 IP 到信任列表
echo -e "${YELLOW}➕ 手动添加 IP 到 $TRUSTED_SET(输入 IPv4 地址,可多个用空格分隔,空行退出):${NC}"
while true; do
  read -p "请输入 IP: " -a ip_list
  if [ "${#ip_list[@]}" -eq 0 ]; then
    break
  fi
  for ip in "${ip_list[@]}"; do
    if validate_ip "$ip"; then
      if ! ipset test "$TRUSTED_SET" "$ip" &>/dev/null; then
        ipset add "$TRUSTED_SET" "$ip"
        echo -e "  ${GREEN}✅ 已添加 $ip 到 $TRUSTED_SET${NC}"
      else
        echo -e "  ${YELLOW}ℹ️ $ip 已存在于 $TRUSTED_SET${NC}"
      fi
    else
      echo -e "  ${RED}❌ 无效的 IP 地址: $ip,请重新输入${NC}"
    fi
  done
done

# 统计 trusted_ips 列表中的总 IP 数量
total_ips=$(ipset list "$TRUSTED_SET" | grep -c '^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+')
echo -e ""
echo -e "${GREEN}📊 $TRUSTED_SET 共有 $total_ips 条 IP${NC}"
read -p "📄 是否查看列表?(ipset list $TRUSTED_SET)(y/N): " view_choice
if [[ "$view_choice" == "y" || "$view_choice" == "Y" ]]; then
  ipset list "$TRUSTED_SET"
fi


以上就是我对于本次 SYN FLOOD 攻击的处理方式和主要脚本分享,当然除此之外还有一些小脚本、小配置以及 SSH 宏工具的应用,就不写了。毕竟上面的这些手段和脚本,本就是非常基础的东西,为了应对实际问题而临时编写的。

我写出来,一则是分享经验,方便其他遇到类似问题的朋友参考;二则是记录自己的操作过程,因为本人此前并没有太多处理这类攻击的经验,算是边学边做……以后可能还用得上。最后,把 24 小时内访问我的主要蜘蛛 IP 分享出来,供需要的朋友参考和分析。这些 IP 经过 DNS 反查和工具验证,基本确认属于主流搜索引擎蜘蛛,列表将附在文末,供大家在配置白名单时参考,避免误封合法爬虫。


GooglebotByteDanceBingbotBaiduspiderSogoubot
66.249.64.225110.249.201.100157.55.39.10116.179.32.100112.86.225.125
66.249.69.165110.249.201.101157.55.39.11116.179.32.101112.86.225.126
66.249.69.166110.249.201.102157.55.39.14116.179.32.102112.86.225.156
66.249.69.172110.249.201.103157.55.39.16116.179.32.104112.86.225.157
66.249.69.173110.249.201.104157.55.39.192116.179.32.105112.86.225.168
66.249.72.100110.249.201.105157.55.39.194116.179.32.106112.86.225.175
66.249.72.101110.249.201.107157.55.39.196116.179.32.107112.86.225.179
66.249.72.103110.249.201.108157.55.39.197116.179.32.108112.86.225.18
66.249.72.104110.249.201.109157.55.39.200116.179.32.109112.86.225.181
66.249.72.106110.249.201.110157.55.39.201116.179.32.111112.86.225.183
66.249.72.107110.249.201.111157.55.39.202116.179.32.112112.86.225.185
66.249.72.162110.249.201.113157.55.39.203116.179.32.113112.86.225.196
66.249.72.166110.249.201.114157.55.39.204116.179.32.114112.86.225.202
66.249.72.167110.249.201.115157.55.39.205116.179.32.115112.86.225.207
66.249.72.168110.249.201.117157.55.39.48116.179.32.12112.86.225.208
66.249.72.201110.249.201.118157.55.39.49116.179.32.131112.86.225.209
66.249.72.97110.249.201.119157.55.39.52116.179.32.132112.86.225.21
66.249.72.98110.249.201.120157.55.39.56116.179.32.133112.86.225.219
66.249.72.99110.249.201.121157.55.39.6116.179.32.135112.86.225.244
66.249.73.230110.249.201.130157.55.39.60116.179.32.136112.86.225.57
66.249.75.192110.249.201.131157.55.39.62116.179.32.137112.86.225.71
66.249.75.193110.249.201.132157.55.39.63116.179.32.139121.229.156.106
66.249.75.194110.249.201.133157.55.39.7116.179.32.14121.229.156.17
66.249.75.198110.249.201.134157.55.39.8116.179.32.140121.229.156.22
66.249.75.199110.249.201.136157.55.39.9116.179.32.142121.229.156.34
66.249.75.200110.249.201.13820.125.163.80116.179.32.143121.229.156.35
66.249.75.201110.249.201.13920.15.133.160116.179.32.144121.229.156.46
66.249.75.33110.249.201.14020.15.133.162116.179.32.145121.229.156.49
66.249.75.34110.249.201.14120.15.133.165116.179.32.146121.229.156.60
66.249.75.35110.249.201.14220.15.133.174116.179.32.147121.229.156.87
66.249.75.37110.249.201.14320.15.133.175116.179.32.149121.229.156.92
66.249.75.39110.249.201.14420.15.133.184116.179.32.15122.192.32.35
66.249.77.139110.249.201.14520.15.133.191116.179.32.150180.102.110.145
66.249.79.131110.249.201.146207.46.13.102116.179.32.151180.102.110.148
66.249.79.132110.249.201.147207.46.13.107116.179.32.152223.109.252.145
66.249.79.133110.249.201.148207.46.13.116116.179.32.153223.109.252.147
66.249.79.224110.249.201.149207.46.13.127116.179.32.155223.109.252.169
66.249.79.229110.249.201.150207.46.13.150116.179.32.156223.109.252.171
66.249.79.231110.249.201.151207.46.13.153116.179.32.158223.109.252.177
66.249.79.238110.249.201.152207.46.13.154116.179.32.159223.109.252.178
66.249.79.3110.249.201.153207.46.13.155116.179.32.160223.109.252.192
66.249.79.34110.249.201.156207.46.13.156116.179.32.163223.109.252.197
66.249.79.35110.249.201.159207.46.13.160116.179.32.164223.109.252.213
66.249.79.36110.249.201.160207.46.13.168116.179.32.165223.109.255.149
66.249.79.4110.249.201.161207.46.13.17116.179.32.17223.109.255.156
66.249.79.64110.249.201.162207.46.13.18116.179.32.170223.109.255.172
66.249.79.65110.249.201.163207.46.13.229116.179.32.171 
66.249.79.67110.249.201.164207.46.13.31116.179.32.173 
66.249.79.68110.249.201.165207.46.13.54116.179.32.174 
66.249.79.74110.249.201.166207.46.13.63116.179.32.175 
66.249.79.75110.249.201.167207.46.13.64116.179.32.177 
66.249.79.76110.249.201.168207.46.13.7116.179.32.179 
 110.249.201.181207.46.13.87116.179.32.18 
 110.249.201.18240.77.167.0116.179.32.19 
 110.249.201.18440.77.167.11116.179.32.195 
 110.249.201.19540.77.167.116116.179.32.196 
 110.249.201.240.77.167.121116.179.32.199 
 110.249.201.2040.77.167.123116.179.32.200 
 110.249.201.20040.77.167.126116.179.32.201 
 110.249.201.21240.77.167.138116.179.32.204 
 110.249.201.22640.77.167.14116.179.32.205 
 110.249.201.23740.77.167.143116.179.32.206 
 110.249.201.23840.77.167.149116.179.32.207 
 110.249.201.24040.77.167.15116.179.32.209 
 110.249.201.24240.77.167.151116.179.32.21 
 110.249.201.24540.77.167.154116.179.32.213 
 110.249.201.2940.77.167.155116.179.32.214 
 110.249.201.4240.77.167.158116.179.32.215 
 110.249.201.4340.77.167.159116.179.32.216 
 110.249.201.4440.77.167.16116.179.32.218 
 110.249.201.4540.77.167.18116.179.32.22 
 110.249.201.4740.77.167.181116.179.32.220 
 110.249.201.4840.77.167.19116.179.32.221 
 110.249.201.4940.77.167.20116.179.32.222 
 110.249.201.5040.77.167.22116.179.32.224 
 110.249.201.5140.77.167.23116.179.32.225 
 110.249.201.5240.77.167.24116.179.32.226 
 110.249.201.5340.77.167.241116.179.32.227 
 110.249.201.5440.77.167.247116.179.32.228 
 110.249.201.5640.77.167.25116.179.32.23 
 110.249.201.5840.77.167.254116.179.32.230 
 110.249.201.5940.77.167.26116.179.32.234 
 110.249.201.6040.77.167.27116.179.32.235 
 110.249.201.6440.77.167.30116.179.32.236 
 110.249.201.6540.77.167.32116.179.32.237 
 110.249.201.6640.77.167.37116.179.32.238 
 110.249.201.6740.77.167.38116.179.32.239 
 110.249.201.6940.77.167.4116.179.32.24 
 110.249.201.7140.77.167.42116.179.32.240 
 110.249.201.7240.77.167.43116.179.32.242 
 110.249.201.7440.77.167.47116.179.32.25 
 110.249.201.7540.77.167.5116.179.32.27 
 110.249.201.7640.77.167.51116.179.32.29 
 110.249.201.7740.77.167.52116.179.32.30 
 110.249.201.7940.77.167.53116.179.32.31 
 110.249.201.8040.77.167.54116.179.32.32 
 110.249.201.8140.77.167.55116.179.32.33 
 110.249.201.8240.77.167.58116.179.32.34 
 110.249.201.8340.77.167.59116.179.32.35 
 110.249.201.8440.77.167.6116.179.32.39 
 110.249.201.8540.77.167.62116.179.32.40 
 110.249.201.8640.77.167.64116.179.32.41 
 110.249.201.8740.77.167.65116.179.32.42 
 110.249.201.8840.77.167.67116.179.32.44 
 110.249.201.8940.77.167.68116.179.32.45 
 110.249.201.940.77.167.69116.179.32.46 
 110.249.201.9040.77.167.7116.179.32.47 
 110.249.201.9240.77.167.70116.179.32.49 
 110.249.201.9440.77.167.71116.179.32.50 
 110.249.201.9640.77.167.72116.179.32.51 
 110.249.201.9740.77.167.74116.179.32.70 
 110.249.201.9840.77.167.78116.179.32.72 
 110.249.202.1040.77.167.8116.179.32.75 
 110.249.202.10040.77.167.85116.179.32.76 
 110.249.202.10140.77.167.9116.179.32.78 
 110.249.202.10240.77.188.1116.179.32.79 
 110.249.202.10440.77.188.10116.179.32.80 
 110.249.202.10540.77.188.103116.179.32.82 
 110.249.202.10640.77.188.105116.179.32.84 
 110.249.202.10740.77.188.114116.179.32.86 
 110.249.202.10940.77.188.122116.179.32.87 
 110.249.202.11040.77.188.123116.179.32.89 
 110.249.202.11140.77.188.124116.179.32.90 
 110.249.202.11240.77.188.129116.179.32.92 
 110.249.202.11340.77.188.13116.179.32.93 
 110.249.202.11440.77.188.139116.179.32.94 
 110.249.202.11540.77.188.146116.179.32.95 
 110.249.202.11740.77.188.148116.179.32.96 
 110.249.202.11940.77.188.151116.179.32.97 
 110.249.202.12040.77.188.156116.179.32.99 
 110.249.202.12140.77.188.157116.179.37.10 
 110.249.202.1340.77.188.159116.179.37.100 
 110.249.202.13040.77.188.169116.179.37.103 
 110.249.202.13140.77.188.17116.179.37.104 
 110.249.202.13240.77.188.172116.179.37.106 
 110.249.202.13340.77.188.180116.179.37.107 
 110.249.202.13440.77.188.183116.179.37.108 
 110.249.202.13640.77.188.191116.179.37.109 
 110.249.202.13740.77.188.198116.179.37.11 
 110.249.202.13840.77.188.205116.179.37.110 
 110.249.202.13940.77.188.210116.179.37.111 
 110.249.202.14040.77.188.231116.179.37.112 
 110.249.202.14140.77.188.234116.179.37.114 
 110.249.202.14240.77.188.245116.179.37.115 
 110.249.202.14440.77.188.25116.179.37.116 
 110.249.202.14540.77.188.251116.179.37.117 
 110.249.202.14640.77.188.254116.179.37.118 
 110.249.202.14740.77.188.255116.179.37.119 
 110.249.202.14840.77.188.28116.179.37.12 
 110.249.202.15040.77.188.40116.179.37.120 
 110.249.202.15240.77.188.44116.179.37.121 
 110.249.202.15440.77.188.45116.179.37.122 
 110.249.202.15540.77.188.5116.179.37.123 
 110.249.202.15740.77.188.54116.179.37.124 
 110.249.202.15940.77.188.59116.179.37.125 
 110.249.202.16040.77.188.91116.179.37.13 
 110.249.202.16140.77.189.106116.179.37.130 
 110.249.202.16240.77.189.109116.179.37.131 
 110.249.202.16340.77.189.115116.179.37.133 
 110.249.202.16540.77.189.120116.179.37.134 
 110.249.202.16640.77.189.123116.179.37.135 
 110.249.202.16740.77.189.125116.179.37.136 
 110.249.202.16840.77.189.128116.179.37.137 
 110.249.202.1940.77.189.137116.179.37.138 
 110.249.202.20240.77.189.140116.179.37.139 
 110.249.202.20340.77.189.141116.179.37.14 
 110.249.202.22240.77.189.145116.179.37.140 
 110.249.202.22840.77.189.164116.179.37.141 
 110.249.202.23340.77.189.169116.179.37.142 
 110.249.202.23440.77.189.171116.179.37.144 
 110.249.202.24740.77.189.173116.179.37.145 
 110.249.202.4140.77.189.174116.179.37.146 
 110.249.202.4240.77.189.177116.179.37.147 
 110.249.202.4340.77.189.2116.179.37.148 
 110.249.202.4440.77.189.203116.179.37.15 
 110.249.202.4540.77.189.206116.179.37.150 
 110.249.202.4640.77.189.225116.179.37.151 
 110.249.202.4740.77.189.233116.179.37.152 
 110.249.202.4840.77.189.246116.179.37.153 
 110.249.202.4940.77.189.254116.179.37.154 
 110.249.202.5040.77.189.35116.179.37.155 
 110.249.202.5140.77.189.42116.179.37.156 
 110.249.202.5240.77.189.45116.179.37.158 
 110.249.202.5340.77.189.5116.179.37.159 
 110.249.202.5440.77.189.52116.179.37.16 
 110.249.202.5540.77.189.53116.179.37.160 
 110.249.202.5640.77.189.55116.179.37.161 
 110.249.202.5740.77.189.65116.179.37.162 
 110.249.202.5940.77.189.67116.179.37.163 
 110.249.202.6040.77.189.72116.179.37.165 
 110.249.202.6140.77.189.77116.179.37.166 
 110.249.202.6240.77.189.80116.179.37.167 
 110.249.202.6440.77.189.85116.179.37.168 
 110.249.202.6540.77.189.93116.179.37.169 
 110.249.202.6640.77.189.98116.179.37.17 
 110.249.202.6740.77.190.106116.179.37.170 
 110.249.202.6940.77.190.112116.179.37.173 
 110.249.202.7140.77.190.113116.179.37.174 
 110.249.202.7340.77.190.12116.179.37.176 
 110.249.202.7440.77.190.132116.179.37.177 
 110.249.202.7540.77.190.138116.179.37.179 
 110.249.202.7640.77.190.143116.179.37.18 
 110.249.202.7740.77.190.148116.179.37.180 
 110.249.202.7840.77.190.151116.179.37.182 
 110.249.202.8040.77.190.158116.179.37.183 
 110.249.202.8240.77.190.16116.179.37.184 
 110.249.202.8340.77.190.160116.179.37.185 
 110.249.202.8440.77.190.167116.179.37.186 
 110.249.202.8540.77.190.179116.179.37.187 
 110.249.202.8640.77.190.180116.179.37.189 
 110.249.202.8740.77.190.191116.179.37.19 
 110.249.202.8840.77.190.192116.179.37.194 
 110.249.202.8940.77.190.193116.179.37.195 
 110.249.202.9140.77.190.196116.179.37.196 
 110.249.202.9240.77.190.199116.179.37.198 
 110.249.202.9440.77.190.201116.179.37.199 
 110.249.202.9540.77.190.206116.179.37.2 
 110.249.202.9640.77.190.210116.179.37.20 
 110.249.202.9740.77.190.215116.179.37.200 
 110.249.202.9840.77.190.241116.179.37.202 
 110.249.202.9940.77.190.27116.179.37.203 
 111.225.148.1040.77.190.3116.179.37.204 
 111.225.148.10040.77.190.30116.179.37.205 
 111.225.148.10240.77.190.36116.179.37.206 
 111.225.148.10340.77.190.39116.179.37.207 
 111.225.148.10540.77.190.40116.179.37.208 
 111.225.148.10740.77.190.42116.179.37.209 
 111.225.148.1140.77.190.45116.179.37.21 
 111.225.148.11140.77.190.46116.179.37.210 
 111.225.148.11240.77.190.51116.179.37.211 
 111.225.148.11340.77.190.53116.179.37.212 
 111.225.148.11640.77.190.54116.179.37.213 
 111.225.148.11740.77.190.58116.179.37.214 
 111.225.148.11940.77.190.72116.179.37.215 
 111.225.148.12040.77.190.74116.179.37.217 
 111.225.148.12140.77.190.83116.179.37.219 
 111.225.148.1340.77.190.85116.179.37.22 
 111.225.148.13040.77.190.87116.179.37.221 
 111.225.148.13140.77.190.88116.179.37.222 
 111.225.148.13240.77.190.9116.179.37.223 
 111.225.148.13340.77.190.92116.179.37.224 
 111.225.148.13540.77.190.93116.179.37.225 
 111.225.148.13840.77.190.96116.179.37.226 
 111.225.148.13940.77.190.97116.179.37.227 
 111.225.148.1440.77.191.132116.179.37.228 
 111.225.148.14052.167.144.136116.179.37.229 
 111.225.148.14752.167.144.137116.179.37.23 
 111.225.148.14852.167.144.139116.179.37.230 
 111.225.148.15152.167.144.141116.179.37.231 
 111.225.148.15552.167.144.142116.179.37.232 
 111.225.148.15652.167.144.145116.179.37.233 
 111.225.148.15852.167.144.146116.179.37.234 
 111.225.148.15952.167.144.147116.179.37.235 
 111.225.148.1652.167.144.150116.179.37.238 
 111.225.148.16252.167.144.156116.179.37.239 
 111.225.148.16452.167.144.157116.179.37.24 
 111.225.148.16552.167.144.16116.179.37.240 
 111.225.148.16652.167.144.162116.179.37.241 
 111.225.148.16752.167.144.163116.179.37.242 
 111.225.148.17052.167.144.166116.179.37.243 
 111.225.148.17152.167.144.168116.179.37.244 
 111.225.148.17252.167.144.169116.179.37.245 
 111.225.148.17352.167.144.17116.179.37.246 
 111.225.148.17552.167.144.170116.179.37.247 
 111.225.148.17752.167.144.172116.179.37.248 
 111.225.148.17952.167.144.174116.179.37.25 
 111.225.148.18052.167.144.175116.179.37.250 
 111.225.148.18152.167.144.18116.179.37.251 
 111.225.148.18252.167.144.180116.179.37.252 
 111.225.148.18452.167.144.181116.179.37.253 
 111.225.148.1952.167.144.182116.179.37.28 
 111.225.148.19052.167.144.186116.179.37.3 
 111.225.148.19252.167.144.188116.179.37.30 
 111.225.148.19552.167.144.189116.179.37.31 
 111.225.148.19652.167.144.19116.179.37.32 
 111.225.148.19852.167.144.190116.179.37.34 
 111.225.148.19952.167.144.191116.179.37.35 
 111.225.148.252.167.144.194116.179.37.36 
 111.225.148.20152.167.144.195116.179.37.37 
 111.225.148.20652.167.144.196116.179.37.38 
 111.225.148.20752.167.144.197116.179.37.39 
 111.225.148.20852.167.144.199116.179.37.4 
 111.225.148.20952.167.144.20116.179.37.40 
 111.225.148.21452.167.144.203116.179.37.41 
 111.225.148.21552.167.144.204116.179.37.42 
 111.225.148.21752.167.144.209116.179.37.43 
 111.225.148.22152.167.144.21116.179.37.44 
 111.225.148.22352.167.144.211116.179.37.45 
 111.225.148.22452.167.144.212116.179.37.46 
 111.225.148.22752.167.144.213116.179.37.47 
 111.225.148.22852.167.144.214116.179.37.48 
 111.225.148.22952.167.144.215116.179.37.49 
 111.225.148.2352.167.144.216116.179.37.5 
 111.225.148.23152.167.144.219116.179.37.50 
 111.225.148.23252.167.144.22116.179.37.51 
 111.225.148.23352.167.144.220116.179.37.53 
 111.225.148.23552.167.144.221116.179.37.54 
 111.225.148.23652.167.144.222116.179.37.55 
 111.225.148.23852.167.144.23116.179.37.56 
 111.225.148.23952.167.144.230116.179.37.57 
 111.225.148.24552.167.144.232116.179.37.58 
 111.225.148.24752.167.144.233116.179.37.59 
 111.225.148.2552.167.144.235116.179.37.6 
 111.225.148.2652.167.144.236116.179.37.60 
 111.225.148.2852.167.144.238116.179.37.61 
 111.225.148.2952.167.144.24116.179.37.66 
 111.225.148.3252.167.144.25116.179.37.67 
 111.225.148.3352.167.144.55116.179.37.68 
 111.225.148.3452.167.144.56116.179.37.69 
 111.225.148.38 116.179.37.70 
 111.225.148.43 116.179.37.71 
 111.225.148.45 116.179.37.72 
 111.225.148.46 116.179.37.73 
 111.225.148.48 116.179.37.74 
 111.225.148.51 116.179.37.75 
 111.225.148.52 116.179.37.76 
 111.225.148.55 116.179.37.77 
 111.225.148.56 116.179.37.79 
 111.225.148.58 116.179.37.80 
 111.225.148.59 116.179.37.81 
 111.225.148.61 116.179.37.82 
 111.225.148.64 116.179.37.83 
 111.225.148.67 116.179.37.84 
 111.225.148.69 116.179.37.85 
 111.225.148.7 116.179.37.86 
 111.225.148.71 116.179.37.87 
 111.225.148.74 116.179.37.88 
 111.225.148.75 116.179.37.89 
 111.225.148.77 116.179.37.9 
 111.225.148.82 116.179.37.90 
 111.225.148.84 116.179.37.91 
 111.225.148.86 116.179.37.92 
 111.225.148.87 116.179.37.93 
 111.225.148.89 116.179.37.94 
 111.225.148.9 116.179.37.95 
 111.225.148.91 116.179.37.97 
 111.225.148.92 116.179.37.98 
 111.225.148.94 116.179.37.99 
 111.225.148.97 220.181.108.101 
 111.225.149.100 220.181.108.102 
 111.225.149.101 220.181.108.103 
 111.225.149.104 220.181.108.104 
 111.225.149.105 220.181.108.105 
 111.225.149.109 220.181.108.110 
 111.225.149.11 220.181.108.111 
 111.225.149.111 220.181.108.112 
 111.225.149.112 220.181.108.113 
 111.225.149.113 220.181.108.114 
 111.225.149.114 220.181.108.144 
 111.225.149.119 220.181.108.145 
 111.225.149.130 220.181.108.146 
 111.225.149.131 220.181.108.147 
 111.225.149.132 220.181.108.149 
 111.225.149.134 220.181.108.155 
 111.225.149.135 220.181.108.156 
 111.225.149.136 220.181.108.157 
 111.225.149.137 220.181.108.158 
 111.225.149.139 220.181.108.159 
 111.225.149.140 220.181.108.165 
 111.225.149.141 220.181.108.166 
 111.225.149.142 220.181.108.167 
 111.225.149.143 220.181.108.168 
 111.225.149.145 220.181.108.169 
 111.225.149.146 220.181.108.174 
 111.225.149.147 220.181.108.175 
 111.225.149.148 220.181.108.176 
 111.225.149.149 220.181.108.177 
 111.225.149.150 220.181.108.178 
 111.225.149.152 220.181.108.80 
 111.225.149.153 220.181.108.81 
 111.225.149.154 220.181.108.82 
 111.225.149.156 220.181.108.83 
 111.225.149.157 220.181.108.84 
 111.225.149.159 220.181.108.90 
 111.225.149.16 220.181.108.91 
 111.225.149.160 220.181.108.92 
 111.225.149.162 220.181.108.93 
 111.225.149.163 220.181.108.94 
 111.225.149.166   
 111.225.149.169   
 111.225.149.17   
 111.225.149.170   
 111.225.149.171   
 111.225.149.175   
 111.225.149.176   
 111.225.149.179   
 111.225.149.18   
 111.225.149.181   
 111.225.149.183   
 111.225.149.184   
 111.225.149.185   
 111.225.149.193   
 111.225.149.20   
 111.225.149.200   
 111.225.149.203   
 111.225.149.205   
 111.225.149.213   
 111.225.149.214   
 111.225.149.217   
 111.225.149.218   
 111.225.149.219   
 111.225.149.220   
 111.225.149.222   
 111.225.149.223   
 111.225.149.226   
 111.225.149.23   
 111.225.149.230   
 111.225.149.231   
 111.225.149.233   
 111.225.149.234   
 111.225.149.236   
 111.225.149.238   
 111.225.149.239   
 111.225.149.24   
 111.225.149.241   
 111.225.149.242   
 111.225.149.243   
 111.225.149.244   
 111.225.149.245   
 111.225.149.247   
 111.225.149.248   
 111.225.149.25   
 111.225.149.26   
 111.225.149.27   
 111.225.149.3   
 111.225.149.33   
 111.225.149.34   
 111.225.149.37   
 111.225.149.4   
 111.225.149.41   
 111.225.149.42   
 111.225.149.43   
 111.225.149.44   
 111.225.149.46   
 111.225.149.47   
 111.225.149.48   
 111.225.149.49   
 111.225.149.5   
 111.225.149.52   
 111.225.149.53   
 111.225.149.55   
 111.225.149.56   
 111.225.149.57   
 111.225.149.6   
 111.225.149.60   
 111.225.149.62   
 111.225.149.63   
 111.225.149.64   
 111.225.149.66   
 111.225.149.68   
 111.225.149.69   
 111.225.149.7   
 111.225.149.70   
 111.225.149.71   
 111.225.149.72   
 111.225.149.75   
 111.225.149.77   
 111.225.149.78   
 111.225.149.79   
 111.225.149.80   
 111.225.149.81   
 111.225.149.82   
 111.225.149.84   
 111.225.149.85   
 111.225.149.87   
 111.225.149.88   
 111.225.149.90   
 111.225.149.92   
 111.225.149.93   
 111.225.149.95   
 111.225.149.96   
 111.225.149.97   
 111.225.149.99   

发表评论

请输入关键词…