网络安全知识

中间人攻击

中间人攻击是指攻击者秘密地将自己置于通信双方(例如:你的浏览器与服务器)之间。
攻击本质:攻击者让通信双方都认为自己正在与对方直接对话,但实际上整段对话都被攻击者拦截、监听甚至篡改。打个比方就像你给朋友寄信,邮差偷偷拆开信件,读完内容,甚至改写了信里的要求,再封好寄给你的朋友。你们两人都以为信件是私密的,却不知道邮差掌握了一切。

中间人攻击的基本原理

MITM 攻击的核心在于破坏信任和身份欺骗。其过程通常分为两个阶段:

第一阶段:拦截(Interception)

攻击者首先要让原本发往目标地址的流量经过自己的设备。常见手段包括:
ARP 欺骗 (ARP Spoofing):在局域网内,伪装成网关(路由器),让其他设备的流量都发给自己。
DNS 劫持:修改你的域名解析记录,让你访问 google.com 时,实际上连到了攻击者的 IP。
公共 Wi-Fi 钓鱼:设置一个没有密码的伪造 Wi-Fi(如 “Starbucks_Free”),诱导用户连接。

第二阶段:解密与篡改(Decryption/Manipulation)

拦截流量后,攻击者需要看懂内容。如果是加密流量(HTTPS),他们会尝试:
SSL 剥离 (SSL Stripping):强制将你的 HTTPS 连接降级为明文的 HTTP 连接。
证书伪造:向你发送一个虚假的 SSL 证书。如果你点击了“继续访问”,攻击者就能解密你的数据。

常见的 MITM 变种

浏览器中间人 (Man-in-the-Browser):通过恶意插件直接攻击浏览器。
重放攻击 (Replay Attack):拦截并保存你的合法请求(如登录指令),稍后再发送一次以获得权限。

🛡️ GFW 的中间人攻击手段

GFW 实施中间人攻击的主要方式包括:
SSL/TLS 证书替换:GFW 曾多次针对 GitHub、Google、Yahoo 和微软等大型网站发起证书攻击。攻击发生时,浏览器会提示“网站证书不受信任”,这是因为 GFW 试图用伪造的证书拦截并解密你的加密流量。
深度包检测 (DPI):通过实时分析流量特征,判断当前的 SSL 流量是否可以被解密。根据 GitHub 上的实锤证据,GFW 会检查是否存在证书锁定 (Pinning)、是否使用双向 TLS 等,若满足条件则尝试进行证书替换。
DNS 劫持与污染:通过向查询请求返回虚假的 IP 地址,将用户引导至错误的服务器。这虽然不完全等同于数据解密,但也是 MITM 攻击的一种常见前置手段。

如何防范?

作为用户,你可以通过以下方式降低风险:
绝不无视浏览器警告:如果访问正规海外网站时出现“证书不受信任”,千万不要点击“继续访问”。这通常意味着流量正在被监听。
清理不可信根证书:手动检查系统证书库,删除如 CNNIC 等曾有过争议的 CA 根证书。
使用强加密隧道:使用支持 TLS 1.3 或具有 Reality 技术的协议,这些技术能有效对抗 GFW 的探测与伪装。
HSTS 保护:尽量使用支持 HSTS(强制 HTTPS)的浏览器,它可以防止连接在最初阶段被降级为明文。


防火长城

防火长城(Great Firewall,简称 GFW)是一个复杂且多层次的网络审查系统。
它主要通过干扰网络协议的正常运作,阻断用户与 Google 等境外服务器的通信。


🛑 阻止访问 Google 的主要手段

GFW 阻断 Google 的过程通常分为多个阶段,从域名解析到建立连接,再到数据传输,每一层都有相应的拦截机制:

  • DNS 污染:在访问的第一步(解析域名)就将用户导向错误的地址。
  • IP 封锁:直接将 Google 的已知 IP 地址列入黑名单,阻断所有去往这些 IP 的流量。
  • TCP 重置攻击:监控连接请求,一旦发现敏感关键词,立即强行中断连接。
  • 深度包检测 (DPI):分析数据包的特征,识别并干扰各类翻墙协议(如早期 VPN 或 Shadowsocks 流量)。

🛠️ DNS 污染 (DNS Cache Poisoning) 原理

这是 GFW 最早且最高效的手段,旨在让用户“找不到路”。

  1. UDP 的无连接特性:大部分 DNS 查询使用简单的 UDP 53 端口。它不验证发送方身份,且“先到为主”。
  2. 旁路监听:GFW 部署在主干网关上,会克隆一份经过的 DNS 请求包。
  3. 抢先响应:一旦发现请求包含 google.com 等黑名单域名,GFW 会立即伪装成 DNS 服务器,发送一个包含错误 IP 的响应包给用户。
  4. 干扰结果:由于 GFW 距离用户更近,这个虚假包会抢在真实包之前到达,用户的计算机便会采纳错误的 IP 地址,导致网页打不开或显示“链接被重置”。 [1, 4, 6]

⚡ TCP 重置攻击 (TCP Reset Attack) 原理

当 DNS 无法完全拦截(如用户修改了 Hosts 文件或使用加密 DNS)时,GFW 会动用此手段在连接层面进行打击。

  1. 关键词触发:GFW 监控 TCP 连接中的数据流。如果发现数据包内含有特定敏感词(早期包括“Google”或特定政治敏感词),就会触发防御动作。
  2. 伪造 RST 包:GFW 会向通信的双方(用户和服务器)分别发送伪造的 TCP RST (Reset) 标志位的数据包。
  3. 强制离线:根据 TCP 协议,收到 RST 包的一方必须立即中断连接且不需确认。这使得用户和 Google 服务器都以为对方主动挂断了电话,从而导致连接中断。
  4. 后续惩罚:在一段时间内,GFW 可能会对该用户 IP 和目标服务器 IP 之间的所有新连接直接进行丢弃,形成数分钟的“断网”现象。

🔒 现代演变:HTTPS 与 DPI

随着 Google 全面普及 HTTPS,GFW 无法再轻易看到加密后的关键词。

  • SNI 阻断:GFW 转而监控 HTTPS 握手阶段中明文传输的 SNI (Server Name Indication) 字段。如果该字段显示域名为 Google 相关,GFW 依然会发起 TCP 重置。
  • 安全建议:单纯依靠修改 DNS 已难以应对复杂的重置攻击,现代方案多采用全加密隧道技术来规避深度检测。

深度包检测

深度包检测 (DPI, Deep Packet Inspection) 是一种先进的网络流量分析技术,它不仅检查数据包的“外壳”(报头),还会深入解析数据包的“内容”(负载)。
如果把普通防火墙比作只看信封地址的邮差,那么 DPI 就像是安检员,会拆开信封阅读信件内容,以决定是否允许其通过。


🔍 DPI 的核心工作原理

DPI 通过在网络检查点(如路由器、防火墙或专用安全网关)捕获流量,并利用以下机制进行实时分析:

1. 从报头到负载的深入解析

  • 报头分析 (Header):检查源/目的 IP 地址和端口号(传统 SPI 静态检测 也具备此能力)。
  • 有效负载检查 (Payload):剥离网络协议层,直接分析应用层数据。例如,DPI 可以识别出这不仅仅是一个 HTTP 连接,而是一个具体的 Google 搜索请求 或 特定的文件传输。

2. 识别与匹配技术

DPI 设备主要通过以下三种方式识别流量特征:

  • 特征码匹配 (Signature Matching):Fortinet 提供的数据包检测指南 指出,系统会预设一个包含成千上万种应用或攻击特征的数据库。当流量中的比特序列(指纹)与数据库匹配时,DPI 就能识别出具体应用(如 WeChat, BitTorrent)或病毒。
  • 行为模式分析 (Behavioral Analysis):通过观察数据包的大小、频率和时序变化来识别流量。即使流量被加密,系统也可以根据其通信行为(如持续的长连接或特定的流量波动)推断其应用类型。
  • 协议异常检测 (Protocol Anomaly):检查数据流是否违反了该协议的标准规范,从而发现潜在的入侵尝试。

⚙️ 处理流程:从抓取到执行

在实际运作中,将其过程归纳为以下步骤:

  1. 数据包捕获:通过镜像端口或串联方式实时截获经过网关的所有数据。
  2. 流重组:将散落在不同 IP 包中的数据片段按 TCP 序列号重新拼凑成完整的原始消息。
  3. 深度解码:识别并解析应用层协议(如 DNS, TLS SNI, HTTP 等)。
  4. 策略执行:根据检测结果执行动作,如:
  • 放行:正常业务流量。
    • 阻断:发现敏感词或恶意代码时发送 TCP RST 或丢弃包。
    • 限速:对 P2P 下载等高带宽应用进行流量整形。

🛡️ DPI 在网络管理中的应用

  • 审查与过滤:如前所述,检测 HTTPS 握手中的 SNI 字段,拦截特定域名的访问。
  • 安全防护:识别隐藏在加密流量外的入侵行为或恶意软件指纹。
  • 流量计费与分析:电信运营商利用 ResearchGate 上关于 DPI 流量识别的研究提到的技术,统计特定应用(如免流套餐中的 App)的使用情况。

如果使用了https进行了负载加密,dpi 是如何查看行为?

当流量被 HTTPS 加密后,DPI 就像是在看一个“磨砂玻璃快递盒”:虽然看不见里面的具体书信,但通过观察快递盒的大小、形状、寄件频率以及握手时的明文信息,依然能判断出你在干什么。


🔍 加密环境下 DPI 识别行为的原理

即使 Payload(有效负载)是乱码,DPI 仍能通过以下手段识别流量:

1. 握手阶段的明文特征 (SNI)

在 TLS 建立连接初期,客户端会发送一个 Client Hello 包。为了让服务器知道该给哪个域名发证书,数据包中会包含一个明文的 SNI (Server Name Indication) 字段。

  • 例子:即使你访问的是加密的 Google,DPI 也能在第一秒看到 google.com 这几个明文。

2. 指纹特征匹配 (TLS Fingerprinting)

不同的浏览器、操作系统或翻墙工具,其 TLS 握手包的参数组合(如加密套件列表、扩展字段顺序)是唯一的,这被称为 JA3 指纹。

  • 原理:GFW 数据库记录了各种常用翻墙协议特有的 JA3 指纹。如果你的流量指纹匹配,即使内容加密,也会被精准识别并阻断。

3. 流量统计特征 (Traffic Analysis)

DPI 观察数据包的“外形”特征,而不仅是内容:

  • 包长序列:视频流、网页浏览和实时语音的数据包长度分布特征完全不同。
  • 时序特征:请求与响应的时间间隔、流量的爆发规律。
  • 熵值分析:加密数据的熵(混乱度)极高。如果一个协议号称是 HTTP 协议,但熵值异常高,DPI 会判定其为“伪装流量”。

🛡️ 如何规避 DPI(安全上网技术)

要对抗 DPI,核心逻辑是消除特征,让加密流量看起来像最普遍、最合法的 HTTPS 浏览流量。

1. 隐藏明文特征 (ECH/ESNI)

  • ECH (Encrypted Client Hello):这是 TLS 1.3 的一个扩展,旨在对 SNI 字段也进行加密。
  • 现状:目前主流浏览器(Chrome/Firefox)已支持,但 GFW 有时会采取“无法解密就直接阻断”的策略。

2. 流量混淆与伪装 (Obfuscation)

  • TLS 隧道:将翻墙协议(如 V2Ray, Trojan, Shadowsocks-libev)包装在标准的 TLS 协议中。
  • 伪装站点:在翻墙服务器上部署一个真实的 Nginx/Apache 网站(如个人博客)。当 DPI 探测时,它看到的是一个合法的网页响应。
  • CDN 转发:通过 Cloudflare 等 CDN 中转流量。DPI 只能看到你和合法的 CDN IP 在通信,无法得知你最终访问了哪个境外网站。

3. 改变流量指纹

  • UTLS/uTLS:一些现代工具支持模拟常见浏览器的 TLS 指纹(如模拟 Chrome 110 的握手包),从而躲避基于 JA3 指纹的检测。

4. 传输协议的演进

  • HTTP/3 (QUIC):基于 UDP 的加密协议,具有更复杂的加密和更少的明文暴露,增加了 DPI 的分析成本。

⚠️ 安全上网建议

  • 不要信任明文 DNS:使用 DoH (DNS over HTTPS) 或 DoT,防止第一步的 DNS 污染。
  • 避免使用老旧协议:纯粹的 Shadowsocks (早期版) 或 VPN (L2TP/PPTP) 特征极其明显,极易被 DPI 识别。
  • 保持指纹一致性:确保你的翻墙客户端指纹看起来像一个普通的 PC 浏览器。
  • 端到端加密:使用 Signal, Telegram 或 PGP 加密,即使网络连接被审计,内容本身也无法被破解。

重放攻击

重放攻击,也被称作回访攻击或重播攻击,是一种拦截并重复发送合法数据包的行为,目的是欺骗服务端误以为是一次新的有效操作。

重放攻击原理:

识别机制包含2个阶段:被动探测和主动探测(包含重放攻击)

  • 第一步:流量画像
    防火墙持续检测进出跨境网关的数据包(流量特征)。如果发现某些链接具有“完全加密特征”(高熵、无明显协议头),将其判断为伪装流量,然后将目标服务器标记为“疑似目标”。
  • 第二步:发起重放
    gfw 会记录下客户端刚刚发送给服务端以真实加密数据包。随后,伪装成一个客户端,挑选一个境内的IP地址,然后将这个数据包
    原封不动的发送给服务器。
  • 第三步:观察反应,识别特征
    1. 如果它是正常服务器:面对一个莫名其妙的重复数据包,通常会直接丢弃或报错。
    2. 如果它是代理服务器(如老旧版本的 Shadowsocks):由于缺乏有效的防重放机制,服务器可能会解密并尝试处理该请求,从而产生特定的回包特征或保持连接。
    3. 结果:一旦服务器产生了预期的“代理协议响应”,GFW 就能确信这是翻墙服务器并立即实施封锁。

常见的攻击变体

  • 精确重放:完全复制捕获的第一个握手包或数据包。
  • 修改重放:对原始包中的某几个字节进行微调(变异攻击),观察服务器在解密失败时的不同反应。
  • 延迟重放:在几分钟甚至几小时后再发起重放,测试服务器是否还在运行且对旧包敏感。

如何防御重放攻击

1. 加密协议里引入防御机制

  • AEAD 加密:Shadowsocks 官方后期的 AEAD 算法在数据中加入了认证信息,一旦数据包被篡改或重复使用,校验将直接失败。
  • Nonce / Salt 校验:服务器会记录最近接收到的“随机数”(Salt),如果 GFW 发送一个用过的 Salt,服务器会直接断开且不给出任何具有特征的回包。
  • 时间戳校验:像 VMess 或 Trojan 协议要求客户端和服务器的时间差必须在一定范围(如 30 秒)内。由于重放的数据包携带的是旧的时间戳,会被服务器直接拒绝。
  • 使用v2ray-plugin插件 伪装成普通http请求

2. 优化服务端配置

  • 开启 AEAD 加密
  • 防火墙白名单来屏蔽非用户 IP
  • 流量混淆绕过第一阶段的被动嗅探