网络安全知识
中间人攻击
中间人攻击是指攻击者秘密地将自己置于通信双方(例如:你的浏览器与服务器)之间。
攻击本质:攻击者让通信双方都认为自己正在与对方直接对话,但实际上整段对话都被攻击者拦截、监听甚至篡改。打个比方就像你给朋友寄信,邮差偷偷拆开信件,读完内容,甚至改写了信里的要求,再封好寄给你的朋友。你们两人都以为信件是私密的,却不知道邮差掌握了一切。
中间人攻击的基本原理
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 最早且最高效的手段,旨在让用户“找不到路”。
- UDP 的无连接特性:大部分 DNS 查询使用简单的 UDP 53 端口。它不验证发送方身份,且“先到为主”。
- 旁路监听:GFW 部署在主干网关上,会克隆一份经过的 DNS 请求包。
- 抢先响应:一旦发现请求包含 google.com 等黑名单域名,GFW 会立即伪装成 DNS 服务器,发送一个包含错误 IP 的响应包给用户。
- 干扰结果:由于 GFW 距离用户更近,这个虚假包会抢在真实包之前到达,用户的计算机便会采纳错误的 IP 地址,导致网页打不开或显示“链接被重置”。 [1, 4, 6]
⚡ TCP 重置攻击 (TCP Reset Attack) 原理
当 DNS 无法完全拦截(如用户修改了 Hosts 文件或使用加密 DNS)时,GFW 会动用此手段在连接层面进行打击。
- 关键词触发:GFW 监控 TCP 连接中的数据流。如果发现数据包内含有特定敏感词(早期包括“Google”或特定政治敏感词),就会触发防御动作。
- 伪造 RST 包:GFW 会向通信的双方(用户和服务器)分别发送伪造的 TCP RST (Reset) 标志位的数据包。
- 强制离线:根据 TCP 协议,收到 RST 包的一方必须立即中断连接且不需确认。这使得用户和 Google 服务器都以为对方主动挂断了电话,从而导致连接中断。
- 后续惩罚:在一段时间内,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):检查数据流是否违反了该协议的标准规范,从而发现潜在的入侵尝试。
⚙️ 处理流程:从抓取到执行
在实际运作中,将其过程归纳为以下步骤:
- 数据包捕获:通过镜像端口或串联方式实时截获经过网关的所有数据。
- 流重组:将散落在不同 IP 包中的数据片段按 TCP 序列号重新拼凑成完整的原始消息。
- 深度解码:识别并解析应用层协议(如 DNS, TLS SNI, HTTP 等)。
- 策略执行:根据检测结果执行动作,如:
- 放行:正常业务流量。
- 阻断:发现敏感词或恶意代码时发送 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地址,然后将这个数据包
原封不动的发送给服务器。 - 第三步:观察反应,识别特征
- 如果它是正常服务器:面对一个莫名其妙的重复数据包,通常会直接丢弃或报错。
- 如果它是代理服务器(如老旧版本的 Shadowsocks):由于缺乏有效的防重放机制,服务器可能会解密并尝试处理该请求,从而产生特定的回包特征或保持连接。
- 结果:一旦服务器产生了预期的“代理协议响应”,GFW 就能确信这是翻墙服务器并立即实施封锁。
常见的攻击变体
- 精确重放:完全复制捕获的第一个握手包或数据包。
- 修改重放:对原始包中的某几个字节进行微调(变异攻击),观察服务器在解密失败时的不同反应。
- 延迟重放:在几分钟甚至几小时后再发起重放,测试服务器是否还在运行且对旧包敏感。
如何防御重放攻击
1. 加密协议里引入防御机制
- AEAD 加密:Shadowsocks 官方后期的 AEAD 算法在数据中加入了认证信息,一旦数据包被篡改或重复使用,校验将直接失败。
- Nonce / Salt 校验:服务器会记录最近接收到的“随机数”(Salt),如果 GFW 发送一个用过的 Salt,服务器会直接断开且不给出任何具有特征的回包。
- 时间戳校验:像 VMess 或 Trojan 协议要求客户端和服务器的时间差必须在一定范围(如 30 秒)内。由于重放的数据包携带的是旧的时间戳,会被服务器直接拒绝。
- 使用v2ray-plugin插件 伪装成普通http请求
2. 优化服务端配置
- 开启 AEAD 加密
- 防火墙白名单来屏蔽非用户 IP
- 流量混淆绕过第一阶段的被动嗅探