FreeRouter V2 完全手册

Similar documents
ARP ICMP

IP505SM_manual_cn.doc

飞鱼星多WAN防火墙路由器用户手册

R3105+ ADSL

C3_ppt.PDF

Microsoft PowerPoint - 03.IPv6_Linux.ppt [相容模式]

Simulator By SunLingxi 2003

PowerPoint Presentation

一、选择题

UDP 8.2 TCP/IP OSI OSI 3 OSI TCP/IP IP TCP/IP TCP/IP Transport Control Protocol TCP User Datagram Protocol UDP TCP TCP/IP IP TCP TCP/IP TC

untitled

11N 无线宽带路由器

ebook140-11

A9RBC8B.tmp

TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP

NetST 2300系列防火墙产品白皮书

ebook67-9

SEC-220

Дорогие коллеги, вот что у меня получилось

本文由筱驀釹贡献

untitled

<B1B1BEA9B9E2BBB7D0C2CDF8BFC6BCBCB9C9B7DDD3D0CFDEB9ABCBBEB4B43F3F12FB6CB293>

GPRS IP MODEM快速安装说明

目 彔 1. 准 备 工 作 登 彔 设 置 功 能 说 明 实 时 监 控 基 本 控 制 功 能 设 置 画 质 调 节 彔 像 与 抓 拍

DOS下常用的网络命令.PDF

(UTM???U_935_938_955_958_959 V )

untitled

ebook140-8

1. 二 進 制 數 值 ( ) 2 轉 換 為 十 六 進 制 時, 其 值 為 何? (A) ( 69 ) 16 (B) ( 39 ) 16 (C) ( 7 A ) 16 (D) ( 8 A ) 在 電 腦 術 語 中 常 用 的 UPS, 其 主 要 功 能

ebook140-9

A API Application Programming Interface 见 应 用 程 序 编 程 接 口 ARP Address Resolution Protocol 地 址 解 析 协 议 为 IP 地 址 到 对 应 的 硬 件 地 址 之 间 提 供 动 态 映 射 阿 里 云 内

My Net N900 Central Router User Manual

<4D F736F F F696E74202D20A1B6CFEEC4BFD2BB20B3F5CAB6BCC6CBE3BBFACDF8C2E7A1B7C8CECEF1C8FD20CAECCFA A1A24950D0ADD2E9BACD4950B5D8D6B72E707074>

中国计算机软件专业技术资格和水平考试

財金資訊-80期.indd

PPP Intranet Chapter 3 Chapter IaaS PaaS SaaS

C6_ppt.PDF

第 11 章 互聯網技術 11.1 互聯 網 和 萬 維 網 的 發 展 歷 史 A. 互聯網的發展 互聯網是由 ARPANET 開 始發展的 1969 年 美國國防部高級研究計劃署 (ARPA) 把部分軍事研究所和大 的電腦連接起來 建造了㆒個實驗性的電腦網絡 稱為 ARPANET 並 列 的功能

¶C¶L§§¬_™¨ A.PDF

北 美 医 学 基 金 会 和 教 育 基 金 会 首 席 执 行 官 丁 文 京 来 我 院 访 问 交 流 韩 国 仁 丨 丨 医 疗 集 团 代 表 团 来 我 院 参 观 交 流 我 院 与 天 津 市 眼 科 医 院 签 署 友 好 合 作 医 院 协 议 书 " 首 届 甘 肃 省 萃

常 见 问 题 SLB 产 品 和 业 务 限 制 SLB 产 品 限 制 SLB 产 品 和 业 务 限 制 限 制 项 普 通 用 户 限 制 描 述 例 外 申 请 方 式 ( 例 外 上 限 ) 创 建 SLB 实 例 的 财 务 限 制 账 户 余 额 大 于 等 于 100 元 现 金

9 Internet 10 Internet

<4D F736F F D D352DBED6D3F2CDF8D7E9BDA8D3EBB9DCC0EDCFEEC4BFBDCCB3CCD5FDCEC42E646F63>

Тимофеев. Вост. _кит._ язык _ПК_ рефер. и перевода

D-link用户手册.doc

翻 墙 问 答 享 受 互 联 网 所 带 来 的 便 利, 以 及 私 隐 保 障, 本 来 就 如 其 他 许 多 天 赋 权 利, 这 已 是 一 个 人 应 该 享 有, 无 分 国 界 和 种 族 很 不 幸, 在 中 国 引 入 互 联 网 不 久, 中 国 就 滥 用 很 多 本 来

标题

84

《计算机网络》实验指导书

SL2511 SR Plus 操作手冊_單面.doc

目 錄 頁 次 政 風 法 令 宣 導 一 行 政 中 立 實 務 探 討 二 收 到 支 付 命 令 不 可 置 之 不 理 3 9 公 務 機 密 維 護 宣 導 一 淺 談 駭 客 攻 擊 14 二 何 不 自 行 設 計 入 侵 防 禦 系 統? 17 安 全 維 護 宣 導 認 識 爆 竹

1 产 品 简 介 特 性 包 装 产 品 外 观 电 脑 系 统 要 求 硬 件 安 装 软 件 安 装 软 件 操 作 IP


<4D F736F F D20A662A4ACC170BAF4A457B56FA747ADD3A448B8EAAEC6AABAAA60B74EA8C6B6B52D636E2D D312D3137>

第3章 计算机网络体系结构

温州市政府分散采购

第 1 章 概 述 1.1 计 算 机 网 络 在 信 息 时 代 中 的 作 用 1.2 计 算 机 网 络 的 发 展 过 程 *1.2.1 分 组 交 换 的 产 生 *1.2.2 因 特 网 时 代 *1.2.3 关 于 因 特 网 的 标 准 化 工 作 计 算 机 网 络 在

1

Microsoft Word - YDB Vehicle Telematics Service Requirement and General Framework

<4D F736F F D20CDF8B9A42DC9CFCEE7CCE22D3038CFC2>

经华名家讲堂

ch09.PDF

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

计算机网络

100/120EX A-61588_zh-tw 9E8696

HKCERT

ebook71-13

杭 州 顺 网 科 技 股 份 有 限 公 司 拟 实 施 股 权 收 购 涉 及 江 苏 国 瑞 信 安 科 技 有 限 公 司 股 权 评 估 项 目 资 产 评 估 报 告 目 录 杭 州 顺 网 科 技 股 份 有 限 公 司 拟 实 施 股 权 收 购 涉 及 的 江 苏 国 瑞 信 安

湖北省政府采购中心

Microsoft Word - DIR-615_B2_Manual_1.00_T_.doc

1

计算机网络概论

06 C H A P T E R 6-1 WWW 6-2 WWW WWW WWW

Microsoft PowerPoint - 数据通信-ch1.ppt

專業式報告

NSC-161

网康科技•互联网控制网关

專業式報告

QL1880new2.PDF

1. ( B ) IT (A) (B) (C) (D) 2. ( A ) (A) (B) (C) (D) 3. ( B ) (A) GPS (B) GIS (C) ETC (D) CAI 4. ( D ) (A) (B) (C) (D) 5. ( B ) (Stored Program) (A) H

三人在线斗地主?唐人游游戏大厅三人斗地主游戏介绍

南京师范大学(下)

FEELING COMFORTABLE ABOUT SEX

Microsoft Word - 報告.doc

1. 血 液 對 身 體 細 胞 的 重 要 性 身 體 得 以 健 康 運 作, 最 主 要 靠 的 是 血 管 內 的 血 液 ; 它 帶 著 養 分 與 氧 給 細 胞, 並 帶 回 廢 雜 物 及 二 氧 化 碳 排 出 體 外, 若 此 血 管 阻 塞 導 致 運 作 不 順 時, 各 部

bingdian001.com

(i) (ii) (iii) (iv) 380,000 [ ] , , % % % 5.5% 6.5%

Trend Micro

联想天工800R路由器用户手册 V2.0

Microsoft Word - Enriched TEKLA Curriculum Guide (chi ver)

end to end 7.2 OSI 7 OSI 3 A B 7.2 Packet Routing LAN WAN

untitled

新婚夫妇必读(九).doc

工程师培训

專業式報告

电信行业网上营业厅

SIP/ENUM Trial

.. 3 N

Chapter #

Microsoft Word - PS2_linux_guide_cn.doc

Transcription:

FreeRouter V2 完 全 手 册 www.lifetyper.com

ii 关 于 一 切 这 本 手 册 的 基 本 定 性 是 FreeRouterV2 项 目 的 完 全 手 册, 包 含 项 目 的 背 景 介 绍, 涉 及 的 原 理, 使 用 到 的 技 术, 以 及 具 体 的 实 现 方 法 但 也 可 以 作 为 普 通 网 民 了 解 GFW 1 工 作 原 理, 以 及 与 之 对 抗 的 入 门 手 册 我 希 望 的 结 果 是 这 本 手 册 写 完 之 后 可 以 解 释 项 目 中 的 所 有 问 题, 让 所 有 人 都 有 能 力 自 己 去 做 翻 墙 路 由 器, 并 且 解 决 碰 到 的 问 题, 所 以 我 可 能 不 得 不 去 解 释 一 些 在 专 业 人 士 看 来 很 简 单 的 基 本 概 念, 借 着 latex 的 优 势, 我 会 把 文 章 的 章 节 分 的 很 细, 你 可 以 很 轻 松 的 跳 过 你 觉 得 自 己 很 清 楚 的 概 念, 不 过, 你 最 好 确 定 你 真 的 清 楚 但 是 考 虑 到 文 科 生 的 电 脑 知 识, 基 本 来 自 大 一 的 «计 算 机 基 础»; 而 大 部 分 非 计 算 机 专 业 的 理 工 科 学 生 的 电 脑 知 识, 来 自 他 们 从 来 没 看 懂 的 讲 了 一 堆 他 们 这 辈 子 都 没 用 上 的 X86 汇 编 的 «计 算 机 原 理» 这 个 残 酷 的 事 实 ( 这 是 个 长 句 ), 如 果 你 们 在 阅 读 全 书 后 觉 得 有 什 么 内 容 依 然 是 不 可 理 解, 完 全 没 有 概 念 的, 欢 迎 反 馈 和 老 罗 不 同 的 是, 我 不 怎 么 爱 这 个 世 界, 所 以, 本 手 册 不 推 荐 以 下 人 类 阅 读 : 1. 绝 对 不 肯 在 翻 墙 上 花 一 分 钱, 同 时 还 没 朋 友 肯 帮 你 的 人,FreeRouter 里 的 Free= 自 由 免 费 2. 过 去 三 年 内 都 没 有 完 整 看 完 过 一 本 书 的 人, 因 为 你 可 能 也 看 不 完 本 书 3. 觉 得 我 欠 你 很 多 钱 或 者 觉 得 我 爱 你, 但 实 际 上 我 根 本 不 认 识 你 的 人 因 为 翻 墙 路 由 本 身 拥 有 对 你 网 络 的 绝 对 控 制 能 力, 而 我 并 没 有 借 此 项 目 进 行 任 何 盈 利 的 目 的, 更 不 想 把 她 变 成 另 一 套 私 人 GFW, 所 以 一 切 可 能 涉 及 到 商 业 利 益 和 主 观 判 定 的 数 据 / 选 择 / 方 法, 我 最 多 可 能 会 作 为 选 项 给 你 们 介 绍, 但 不 会 导 入 FreeRouter V2 项 目 本 身 基 于 同 样 的 原 因, 我 不 会 向 我 不 认 识 的 任 何 人, 发 布 任 何 现 成 的 路 由 器 固 件, 我 只 会 教 你 们 方 法 本 手 册 的 版 权 归 毕 勤 所 有, 任 何 人 都 可 以 自 由 分 发 和 传 播, 但 不 得 做 任 何 修 改, 亦 不 可 用 于 任 何 商 业 目 的 我 知 道 在 中 国 谈 版 权 没 什 么 现 实 意 义, 但 对 于 尊 重 版 权 的 人 来 说, 给 他 们 一 个 明 确 的 说 明 是 一 种 基 本 的 尊 重 如 果 你 还 不 知 道 FreeRouter V2 的 地 址, 同 时 还 不 小 心 没 注 意 本 文 开 始 时 的 链 接, 那 么 FreeRouter V2 当 前 的 项 目 地 址 是 : https://github.com/lifetyper/freerouter_v2 我 说 了 这 是 当 前 地 址, 如 果 我 觉 得 这 个 项 目 不 再 适 合 公 开 发 布, 或 者 有 其 他 计 划 都 可 能 导 致 地 址 变 更, 但 是 作 者 的 Blog 在 10 年 内 都 不 会 变 更 地 址, http://www.lifetyper.com 在 Blog 上 你 们 可 以 找 到 我 的 联 系 方 式 1 China s Great FireWall, 中 国 国 家 防 火 墙 简 称

目 录 第 一 章 网 络 基 础 知 识 1 1.1 你 的 上 网 过 程............................................. 1 1.2 什 么 是 IP?............................................... 2 1.3 什 么 是 端 口?.............................................. 4 1.4 什 么 是 DHCP?............................................. 5 1.5 什 么 是 域 名?.............................................. 7 1.6 什 么 是 DNS?.............................................. 8 1.7 什 么 是 TCP 和 UDP?......................................... 10 1.8 什 么 是 VPN?.............................................. 11 1.9 网 卡 / 接 口 / 适 配 器?........................................... 12 1.10 什 么 是 网 关?.............................................. 13 第 二 章 GFW 的 工 作 方 式 14 2.1 DNS 劫 持 和 污 染............................................ 14 2.1.1 虚 假 IP 劫 持.......................................... 17 2.1.2 空 包 劫 持............................................ 18 2.1.3 轻 松 的 扩 散 污 染........................................ 19 2.2 敏 感 词 过 滤............................................... 20 2.3 IP 阻 断................................................. 22 第 三 章 常 用 的 辅 助 工 具 24 3.1 Ping 和 TCPing 命 令.......................................... 24 3.2 traceroute 命 令............................................. 25 3.3 route 命 令................................................ 26 3.4 Dig 命 令................................................ 28 3.5 正 则,SED,AWK........................................... 29 iii

目 录 iv 第 四 章 FreeRouter V2 的 技 术 原 理 32 4.1 IP 命 令................................................. 32 4.1.1 table 概 念............................................ 32 4.1.2 把 数 据 添 加 到 table...................................... 33 4.1.3 让 table 数 据 走 VPN 接 口................................... 34 4.2 IPTables 防 火 墙............................................ 35 4.2.1 IPSET 概 念........................................... 36 4.2.2 iptables 的 mark 功 能..................................... 37 4.2.3 iptables 的 m32 模 块...................................... 39 4.2.4 iptables 的 string 模 块..................................... 44 4.3 Dnsmasq 解 析 器............................................ 48 4.3.1 IPSET 功 能........................................... 48 4.3.2 为 Dnsmasq 指 定 DNS..................................... 50 4.3.3 添 加 多 个 DNS......................................... 51 4.3.4 屏 蔽 运 营 商 的 DNS 广 告................................... 53 4.3.5 限 定 范 围 的 解 析........................................ 55 4.4 DNSSEC 的 原 理 和 实 用 性....................................... 56 4.4.1 简 介.............................................. 56 4.4.2 传 统 DNS 系 统 的 弱 点.................................... 56 4.4.3 公 钥 / 私 钥 加 密 的 基 本 原 理.................................. 57 4.4.4 DNSSEC 中 公 钥 私 钥 的 应 用................................. 58 4.4.5 DNSSEC 的 最 大 问 题, 是 域 名 签 名 部 署 的 缺 失...................... 60 4.4.6 对 未 签 名 的 域 名,DNSSEC 几 乎 不 能 提 供 任 何 保 护.................... 60 4.4.7 对 签 名 的 域 名, 中 间 人 攻 击 依 然 有 可 能 进 行........................ 61 4.4.8 国 内 支 持 DNSSEC 的 DNS 服 务 器 极 度 缺 乏........................ 61 4.5 给 Dnsmasq 启 用 DNSSEC...................................... 62 4.5.1 域 名.............................................. 62 4.5.2 客 户 端............................................. 62 4.5.3 服 务 器............................................. 62 4.5.4 Dnsmsq 的 配 置 :........................................ 62 4.5.5 DNSSEC 的 效 果 :....................................... 64 4.6 2015 年 后 的 DNS 污 染 对 应 策 略................................... 65 4.6.1 背 景 和 策 略.......................................... 65 4.6.2 实 际 操 作............................................ 65 4.6.3 一 个 小 脚 本.......................................... 66

目 录 v 第 章 FreeRouter 实 战 68 5.1 FreeRouter V2 的 工 作 流 程...................................... 68 5.2 OpenWRT 基 础............................................. 70 5.2.1 OpenWRT 是 什 么?...................................... 70 5.2.2 我 的 路 由 能 刷 OpenWRT 吗?................................. 70 5.2.3 我 的 路 由 需 要 多 大 ROM?................................... 71 5.2.4 我 应 该 下 载 选 哪 个 版 本 的 固 件?............................... 71 5.2.5 如 何 刷 固 件?.......................................... 71 5.2.6 为 什 么 刷 了 固 件 后 打 不 开 路 由 管 理 界 面?.......................... 71 5.2.7 如 何 安 装 各 种 package?.................................... 72 5.3 FreeRouter V2 需 要 的 组 件...................................... 73 5.4 部 署 FreeRouterV2........................................... 74 5.4.1 系 统 的 基 本 设 置........................................ 74 5.4.2 PPTP VPN 接 口 设 定..................................... 76 5.4.3 Open VPN 接 口 设 定...................................... 78 5.4.4 部 署 文 件 通 用 部 分..................................... 83 5.4.5 部 署 文 件 PPTP VPN 部 分.................................. 84 5.4.6 部 署 文 件 Open VPN 部 分.................................. 85 5.4.7 调 试 和 检 查.......................................... 86 5.5 自 己 打 包 固 件............................................. 86

第 一 章 网 络 基 础 知 识 最 强 大 的 防 火 墙, 是 十 三 亿 中 国 人 的 自 我 审 查 与 自 我 阉 割 1.1 你 的 上 网 过 程 我 需 要 在 这 里 把 你 的 上 网 过 程 先 描 述 一 遍, 以 打 开 一 个 网 页 ( 例 如 twitter.com) 为 例 子, 这 中 间 可 能 涉 及 到 很 多 你 不 了 解 的 专 业 术 语, 但 没 关 系, 这 些 我 们 都 会 在 后 面 慢 慢 解 释 图 1.1: 浏 览 器 如 何 访 问 网 站 1. 在 你 打 开 浏 览 器 之 后, 在 地 址 栏 输 入 https://twitter.com/star1000song 这 个 地 址 1 2. 浏 览 器 会 自 动 先 识 别 出 这 是 位 于 域 名 twitter.com 下 的 一 个 页 面, 需 要 访 问 twitter.com 这 个 域 名 对 应 的 服 务 器 1 你 们 早 晚 会 知 道 这 是 什 么 地 址 1

第 一 章 网 络 基 础 知 识 2 3. 接 着, 浏 览 器 会 调 用 相 应 的 的 操 作 系 统 的 API 去 解 析 这 个 域 名, 然 后 你 的 Windows 系 统 会 向 电 脑 连 着 的 路 由 发 送 解 析 请 求 4. 路 由 器 上 如 果 之 前 有 个 域 名 的 解 析 结 果, 并 保 留 在 了 缓 存 里, 就 可 以 直 接 返 回 解 析 结 果 了 5. 如 果 路 由 器 没 有 关 于 这 个 域 名 的 缓 存, 那 路 由 就 会 向 之 前 在 路 由 器 里 设 置 好 的 DNS 服 务 器 请 求 解 析 这 个 域 名 6. 一 般 的 DNS 服 务 器 会 经 过 一 个 递 归 解 析 过 程, 把 解 析 到 的 twitter.com 的 IP 返 回 给 路 由, 路 由 再 返 回 给 你 的 电 脑 7. 最 后, 你 的 电 脑 就 可 以 通 过 IP 地 址, 直 接 访 问 twitter.com 的 服 务 器 了, 然 后 向 服 务 器 的 443 端 口 请 求 https://twitter.com/star1000song 这 个 地 址 的 内 容 8. 如 果 网 络 通 畅 的 话,twitter.com 的 服 务 器 在 收 到 请 求 后 就 会 把 结 果 返 回 给 你 的 电 脑, 网 页 就 打 开 了 专 业 词 汇 太 多 看 不 懂?OK, 一 个 个 解 释 1.2 什 么 是 IP? 我 想 这 是 困 住 很 多 人 的 第 一 个 问 题, 我 觉 得 你 们 知 道 twitter 是 什 么 的 可 能 性 都 比 这 个 高 IP, 准 确 的 说 是 IP 地 址, 解 释 过 来 就 是 Internet Protocol Address,Internet 协 议 地 址 你 可 以 把 它 假 想 成 各 家 各 户 的 门 牌 号, 你 要 找 一 个 地 址, 最 靠 谱 的 方 法 就 是 知 道 准 确 的 门 牌 号 IP 地 址 又 分 为 公 网 地 址 和 内 网 地 址 两 种, 这 个 怎 么 理 解 呢? 你 可 以 认 为 长 安 街 1 号 这 种 地 址 是 公 网 地 址, 因 为 通 过 所 有 人 都 可 以 走 2 的 公 共 道 路, 人 人 都 可 以 到 达 这 里 而 长 安 街 1 号 里 面, 2 号 楼 3F302 这 个 地 址 就 是 内 网 地 址 了, 因 为 那 是 别 人 的 私 有 领 地, 你 可 以 通 过 长 安 街 到 他 家 门 口, 但 未 必 可 以 进 入 这 个 私 有 领 地 但 私 有 领 地 的 人 却 完 全 可 以 走 出 来 访 问 公 共 道 路 上 的 任 何 其 他 地 址, 就 像 你 可 以 从 你 家 的 路 由 后 面 访 问 微 博 一 样, 但 他 们 也 同 样 不 能 直 接 进 入 别 人 的 私 有 领 地 实 用 点 说 的 话, 你 通 过 ADSL 拨 号, 光 纤 猫 接 入, 这 些 方 法 分 配 到 的 IP 一 般 都 是 公 网 IP, 直 接 接 在 电 脑 上, 别 人 通 过 这 个 IP 可 以 访 问 到 你 的 电 脑 了 但 是 一 般 你 都 会 在 猫 后 面 接 个 路 由, 然 后 分 配 出 一 些 类 似 192.168.1.XXX 的 地 址, 你 的 电 脑 上 往 往 是 通 过 这 些 地 址 接 入 互 联 网 的, 这 些 都 是 内 网 IP, 隔 着 路 由 别 人 是 无 法 直 接 访 问 到 你 的 电 脑 的, 因 为 这 个 内 网 地 址 对 外 面 的 人 来 说 根 本 不 可 见 内 网 地 址 的 范 围 是 有 规 范 的, 而 公 网 地 址 绝 对 不 能 使 用 这 些 地 址, 范 围 如 下 : 1. 10.0.0.0/8 10.0.0.0 10.255.255.255 2 好 吧, 到 后 面 你 会 知 道 公 共 道 路 也 未 必 人 人 都 能 走

第 一 章 网 络 基 础 知 识 3 2. 172.16.0.0/12 172.16.0.0 172.31.255.255 3. 192.168.0.0/16 192.168.0.0 192.168.255.255 4. 100.64.0.0/10 100.64.0.0 100.127.255.255 上 面 的 表 格 中, 右 边 的 表 示 也 许 比 较 直 观, 而 左 边 用 的 掩 码 表 示 方 法 看 起 来 有 点 费 解, 但 这 却 是 实 际 网 络 应 用 中 最 常 用 的 格 式 首 先 我 们 要 知 道, 一 个 IP 地 址 是 计 算 机 中 的 一 个 32 位 的 2 进 制 数, 分 成 4 段, 每 段 8 位, 所 以 你 看 到 IP 地 址 每 段 的 最 大 值 是 255, 但 实 际 上 255 是 用 于 表 示 广 播 地 址 不 会 分 配 给 任 何 主 机 的, 而 0 是 用 于 表 示 整 个 网 络 号 的, 也 不 会 分 配 给 主 机, 所 以 一 般 你 路 由 能 分 配 的 IP 最 后 一 段 肯 定 是 1 254( 在 DHCP 3 支 持 的 情 况 下 ) 图 1.2: IPV4 的 IP 地 址 有 32 位 图 1.3: IP 地 址 包 含 网 络 号 和 主 机 号 一 个 IP 地 址 看 起 来 是 4 段, 其 实 是 两 个 部 分, 分 别 是 网 络 号 和 主 机 号, 按 网 络 号 范 围 的 不 同,IP 地 址 分 为 ABCDE5 类,DE 类 为 特 殊 地 址 类 我 们 不 考 虑, 现 在 看 看 A 类 地 址 是 怎 么 定 义 的 : A 类 地 址 的 网 络 号 由 一 段 (8 位 ) 数 字 表 示, 网 络 地 址 最 高 位 必 须 是 0, 所 以 A 类 地 址 有 2 7 2(126) 个 网 3 这 个 概 念 我 们 后 面 会 说

第 一 章 网 络 基 础 知 识 4 段 ; 剩 下 的 3 段 (24 位 ) 表 示 主 机 号, 每 个 网 段 有 2 24 2(16777214) 类 似 的 可 以 知 道 B 类 和 C 类 地 址 的 计 算 方 法, 如 果 还 不 清 楚 可 以 去 参 考 百 度 百 科 的 相 关 页 面 大 概 知 道 了 IP 的 格 式 和 分 类, 掩 码 表 示 法 要 怎 么 理 解 呢? 我 们 看 一 下 172.16.0.0/12 的 解 释 过 程 1. 我 们 说 了 0 表 示 网 络 号, 准 确 的 说 应 该 是 0 提 示 网 络 号, 前 面 的 172.16 就 是 网 络 号, 这 段 是 固 定 的 值 2. 最 后 的 12 表 示 采 用 的 是 12 位 掩 码 这 个 掩 码 是 什 么 意 思? 3. 12 位 掩 码 表 示 IP 地 址 的 高 12 位 和 1 进 行 与 (AND) 操 作 ( 也 就 是 不 变 ), 剩 下 低 20 位 的 空 间 和 0 进 行 与 操 作, 清 空 出 来 分 配 IP 4. 也 就 是 说, 从 172.16.0.0 开 始, 分 配 2 20 个 IP 地 址, 算 一 下 你 就 知 道 刚 好 到 了 172.31.255.255 5. 我 们 说 了 0 和 255 分 别 表 示 网 络 号 和 广 播 地 址, 是 不 能 分 配 给 具 体 设 备 的, 所 以 实 际 可 用 范 围 是 两 者 中 间 的 值 以 上 是 关 于 IPV4 体 系 下 的 IP 地 址 的 介 绍, 也 是 我 们 现 在 基 本 都 在 用 的 体 系 但 是 你 可 能 也 看 到 了, IPV4 体 系 下 IP 地 址 的 范 围 非 常 有 限 ( 理 论 值 也 就 是 30 多 亿 ), 加 上 一 些 大 型 企 业 和 机 构 占 用 大 量 地 址, 全 球 的 IPV4 地 址 其 实 已 经 分 配 完 毕 ( 不 一 定 全 部 被 使 用 了, 但 已 经 被 分 配 完 毕 了 ) 所 以 就 有 了 新 的 IPV6 体 系,IPV6 体 系 下 的 IP 格 式 大 致 如 下 : 2a03:2880:2110: df07:face:b00c:0:1 可 以 看 到 IPV6 地 址 高 达 128 位, 总 数 就 是 2 128 个, 这 个 数 量 已 经 绝 对 不 需 要 担 心 耗 尽 的 可 能 了 具 体 的 关 于 IPV6 的 问 题, 在 我 们 的 翻 墙 过 程 中 只 有 一 小 部 分 涉 及 到, 这 里 就 不 再 讲 更 多 了 1.3 什 么 是 端 口? 在 讲 上 网 过 程 1.1 的 时 候, 我 们 提 到 了 最 后 浏 览 器 要 访 问 的 是 twitter.com 的 服 务 器 的 443 端 口, 那 么 什 么 是 端 口 呢? 专 业 上 讲 这 是 传 输 层 的 TSAP 寻 址 方 式, 不 过 你 肯 定 不 满 意 这 个 解 释 我 们 知 道 一 台 电 脑 要 联 网 的 软 件 ( 进 程 ) 其 实 是 很 多 的, 这 就 需 要 给 不 同 的 软 件 分 配 不 同 的 通 道 以 区 别 他 们 的 数 据, 否 则 所 有 的 进 程 都 在 一 条 通 道 上 收 发 数 据, 那 么 不 同 协 议 不 同 规 范 的 数 据 毫 无 规 则 的 混 在 在 一 起, 就 完 全 没 有 意 义 了, 或 者 代 价 就 是 每 个 进 程 都 要 把 所 有 数 据 都 先 截 获 下 来, 再 慢 慢 提 取 出 属 于 自 己 的 那 部 分 数 据, 这 显 然 是 不 可 能 的 那 么 端 口 就 起 了 这 样 的 作 用, 端 口 为 不 同 的 进 程 / 协 议 分 配 了 不 同 的 端 口, 例 如 针 对 浏 览 器 的 http 服 务 器 协 议 是 80 端 口,https 是 443 端 口,ftp 数 据 传 输 是 21 端 口,ssh 远 程 登 录 是 22 端 口,telnet 是 23 端 口,

第 一 章 网 络 基 础 知 识 5 DNS 解 析 是 53 端 口, 不 同 的 协 议 使 用 不 同 的 端 口, 数 据 就 很 清 晰 了, 对 于 一 个 端 口 上 的 数 据 就 肯 定 有 一 个 统 一 的 协 议 来 解 析 了 这 就 好 像 紫 禁 城 的 N 个 城 门, 每 个 门 都 有 自 己 特 殊 的 用 途, 给 不 同 的 人 和 不 同 的 车 走 一 样, 这 些 门 就 是 紫 禁 城 的 端 口 图 1.4: 不 同 的 服 务 对 应 不 同 的 端 口 注 意, 以 上 列 出 的 标 准 端 口 都 是 针 对 服 务 器 而 言 的, 因 为 很 多 通 信 协 议 默 认 都 是 使 用 这 些 标 准 端 口, 你 如 果 擅 自 改 成 别 的 端 口, 客 户 端 并 不 知 晓, 就 不 知 道 该 向 哪 里 请 求 了 例 如 有 些 网 站 给 自 己 的 内 部 管 理 服 务 器 改 成 了 8080 端 口 或 者 别 的 端 口, 这 样 可 以 避 免 别 人 发 现 后 台 的 地 址 ( 其 实 别 人 要 扫 描 端 口 也 可 以 发 现 ), 只 有 知 道 端 口 的 人 才 能 访 问 按 照 规 定 0 1023 端 口 都 是 预 留 给 特 定 协 议 的 端 口 范 围, 其 他 的 应 用 和 私 有 的 协 议 不 应 该 使 用 这 个 范 围 内 的 关 口, 否 则 可 能 和 现 有 的 服 务 协 议 造 成 端 口 冲 突 端 口 的 连 接 是 双 方 的, 服 务 器 有 一 个 端 口, 客 户 端 要 连 接 也 必 须 有 一 个 对 应 的 端 口 服 务 器 的 端 口 一 般 要 固 定, 以 便 让 别 人 连 接 ; 而 在 客 户 端 这 里, 就 完 全 可 以 用 各 种 不 同 的 端 口 了,DNS 协 议 为 了 增 强 安 全 性, 客 户 端 的 端 口 甚 至 应 该 鼓 励 增 强 随 机 性, 最 好 每 次 都 不 同 好 比 皇 帝 出 去 祭 天 要 走 特 定 的 门 不 能 变, 可 是 要 微 服 私 访 就 得 灵 活 一 点 了, 不 然 行 踪 就 容 易 暴 露 了 1.4 什 么 是 DHCP? 我 们 前 面 说 了 一 个 问 题, 一 般 路 由 能 分 配 的 最 后 一 段 IP 一 般 是 1 254, 这 是 在 DHCP 允 许 的 条 件 下, 那 么 DHCP 是 什 么 东 西?

第 一 章 网 络 基 础 知 识 6 简 单 来 说,DHCP 是 一 个 自 动 分 配 IP 的 系 统 例 如 你 的 电 脑 在 不 联 网 的 时 候 是 不 会 有 任 何 IP 的, 在 接 入 一 个 路 由 器 之 后, 你 可 以 自 己 手 动 设 置 IP, 但 这 很 繁 琐, 而 且 万 一 两 个 人 设 置 了 一 样 的 IP, 就 会 导 致 网 络 冲 突 所 以 普 遍 的 做 法 是 让 路 由 自 动 分 配 IP 给 机 器 DHCP 的 实 现 过 程 大 概 是 这 样 的 : 1. 你 的 电 脑 接 入 路 由 后, 就 向 路 由 器 下 的 整 个 网 络 ( 所 有 主 机 和 设 备 ) 发 送 一 个 DHCP Discover 请 求, 查 询 看 有 没 有 DHCP 服 务 器 2. 你 的 路 由 收 到 这 个 请 求 之 后, 就 反 馈 给 你 的 电 脑 一 个 DHCP Offer, 告 诉 它 老 子 就 是 DHCP 服 务 器 3. 也 许 网 络 中 还 有 别 的 也 提 供 DHCP 服 务 的 主 机 ( 这 个 情 况 一 般 比 较 少 ), 但 一 般 来 说 你 的 电 脑 会 选 择 响 应 最 快 的 那 个 Offer, 然 后 发 送 一 个 DHCP Request 请 求 给 他 4. 路 由 收 到 这 个 DHCP Request 之 后, 就 会 开 始 和 主 机 进 行 一 些 列 握 手 协 议, 然 后 发 送 相 应 的 IP 配 置 给 他 图 1.5: Windows 通 过 DHCP 自 动 获 取 IP 和 DNS 其 实 呢,DHCP 不 光 是 分 配 IP 的, 他 同 时 还 会 分 配 DNS 服 务 器, 网 关 地 址 这 些 东 西 给 你 所 以 你 看 一 个 网 卡 的 IPV4 或 者 IPV6 协 议 属 性 的 时 候,IP 和 DNS 都 是 可 以 自 动 获 取 的, 这 就 是 通 过 DHCP 实 现 的

第 一 章 网 络 基 础 知 识 7 1.5 什 么 是 域 名? 你 可 能 也 看 到 了,IP 地 址 其 实 是 很 难 记 忆 的 一 个 东 西,30 多 亿 的 地 址 对 人 类 的 记 忆 来 说 根 本 就 是 开 玩 笑 如 果 你 要 访 问 一 台 服 务 器, 难 道 还 先 打 个 电 话 去 问 他 们 IP 是 什 么 吗? 当 然 不 可 能, 所 以 就 有 了 域 名? 没 这 么 快, 首 先 有 的 是 HOST 系 统 对 于 windows 用 户 来 说,c:/windows/system32/etc/drivers/hosts 文 件 里 一 般 只 有 一 行 内 容, 就 是 127.0.0.1 localhost 这 个 是 告 诉 计 算 机, 当 访 问 localhost 这 个 名 称 的 主 机 的 时 候, 实 际 就 是 要 访 问 127.0.0.1, 也 就 是 计 算 机 的 本 机 IP( 访 问 自 己 ) 类 似 的, 你 可 以 把 192.168.1.105 mailserver 写 入 host 文 件, 这 样 就 告 诉 了 计 算 机, 邮 件 服 务 器 mailserver 的 IP 是 192.168.1.105, 这 样 人 类 的 记 忆 就 稍 微 轻 松 了 一 些 可 是 随 着 互 联 网 的 发 展, 很 快 人 们 就 发 现 hosts 文 件 根 本 就 不 够 用, 而 且 很 多 主 机 你 更 根 本 不 知 道 他 的 存 在, 或 者 哪 台 服 务 器 换 了 IP 也 没 通 知 别 人, 旧 的 host 文 件 就 一 直 让 你 去 访 问 错 误 的 IP 了 终 于, 域 名 系 统 出 现 了 图 1.6: 各 种 不 同 的 顶 级 域 名 基 本 概 念 上 你 可 以 把 域 名 和 Host 文 件 等 效 起 来 理 解, 但 是 域 名 是 一 个 多 级 系 统, 它 有 着 不 同 的 域 例 如 mail.lifetyper.com 表 示 lifetyper.com 这 个 域 下 面 的 一 台 叫 mail 的 主 机, 这 样 一 个 域 就 可 以 有 了 很 多 主 机 记 录, 这 些 主 机 记 录 我 们 可 以 叫 做 lifetyper.com 这 个 父 域 的 子 域 而 lifetyper.com 其 实 也 是 com 这 个 父 域 下 面 的 一 个 子 域 你 不 知 道 的 可 能 是,com 的 完 整 写 法 应 该 是 com., 表 示 com 是. 这 个 父 域 下 的 一 个 子 域 这 个. 就 是 我 们 称 之 为 根 域 的 东 西,.net,.org,.cn 这 些 顶 级 域 名 域 其 实 都 是 根 域 的 子 域 就 像 你 用 文 件 搜 索 器 查 找 一 个 文 件 一 样, 它 除 了 告 诉 你 文 件 在 哪 里, 一 般 还 会 告 诉 你 文 件 的 大 小, 最 近 的 修 改 日 期, 文 件 的 所 有 者 等 等 同 样 的, 一 个 域 名 中 往 往 包 含 了 很 多 条 记 录, 我 们 常 用 的 几 个 记 录 有 : 1. A 记 录, 告 诉 你 这 个 域 名 对 应 的 IPV4 IP 地 址 2. AAAA 记 录, 对 应 的 是 域 名 的 IPV6 IP 地 址 ( 当 然, 目 前 很 多 域 名 并 没 有 IPV6 地 址 )

第 一 章 网 络 基 础 知 识 8 3. NS 记 录, 告 诉 你 这 个 域 名 的 名 称 服 务 器 4. CNAME 记 录, 也 叫 别 名 记 录 这 个 记 录 是 把 一 个 域 名 指 向 另 一 个 域 名, 例 如 给 lifetyper.com 设 置 一 个 abc.lifetyper.com 的 CNAME 记 录, 把 这 个 记 录 设 置 为 www.lifetyper.com, 那 么 访 问 abc.lifetyper.com 实 际 上 就 是 要 去 访 问 www.lifetyper.com 注 意 这 个 和 单 纯 的 跳 转 不 同, 应 该 理 解 为 转 译 上 面 提 到 了 一 个 Name Server 名 称 服 务 器 ( 以 后 简 称 NS) 的 概 念, 这 个 NS, 就 是 负 责 设 置 一 个 域 名 几 乎 全 部 记 录 的 服 务 器, 并 且 在 别 人 查 询 的 时 候 把 这 些 记 录 告 诉 别 人, 就 像 一 个 传 达 室 大 爷 例 如 他 可 以 设 置 A 记 录 为 8.8.8.8, 这 样 就 把 域 名 指 向 了 8.8.8.8 这 个 IP 上 的 服 务 器 ( 服 务 器 鸟 不 鸟 它 就 是 另 一 个 问 题 了 ) 为 什 么 说 是 几 乎 全 部 记 录, 而 不 是 全 部 呢? 因 为 NS 记 录 他 设 置 不 了, 相 反 的,NS 记 录 设 置 了 他 这 个 NS 记 录 一 般 只 有 在 域 名 的 注 册 商 那 里 才 可 以 设 置, 就 好 像 传 达 室 大 爷 可 以 负 责 告 诉 你 哪 个 教 室 美 女 多 教 务 处 在 哪 里, 但 谁 当 传 达 室 大 爷 那 是 村 长 校 长 说 了 算 的 而 且 NS 记 录 会 同 时 存 放 在 更 高 一 级 域 的 NS 服 务 器 中, 例 如 lifetyper.com 的 NS 记 录 会 存 放 在 com 域 的 NS 服 务 器 上, 否 则 一 但 lifetyper.com 的 NS 服 务 器 自 己 都 挂 了, 你 去 哪 里 查 NS 记 录 呢? 查 不 到 NS 记 录 就 找 不 到 NS 服 务 器, 那 又 怎 么 查 域 名 的 其 他 记 录 呢? 除 了 多 级 域 概 念 之 外, 域 名 系 统 最 重 要 的 一 点 是 不 需 要 人 们 自 己 去 记 录 这 些 域 名 对 应 什 么 IP, 而 是 通 过 DNS 系 统 去 查 询 就 好 像 你 打 开 windows 的 文 件 搜 索, 通 过 文 件 名 就 可 以 查 到 一 个 文 件 的 所 在 位 置 一 样 那 么 下 一 节 的 标 题 你 也 猜 到 了 1.6 什 么 是 DNS? 这 是 我 们 翻 墙 过 程 中 涉 及 到 的 一 个 非 常 重 要 的 问 题, 这 里 只 做 基 本 介 绍, 具 体 的 很 多 内 容 后 面 会 展 开 本 书 中 发 起 最 初 DNS 解 析 请 求 的 设 备 或 软 件, 我 们 统 称 为 DNS 解 析 器, 例 如 电 脑 就 是 一 个 解 析 器 我 们 说 了, 想 要 知 道 一 个 域 名 对 应 的 IP, 就 要 向 DNS 服 务 器 查 询 DNS 就 是 Domain Name Server 的 简 称 ( 域 名 称 服 务 器 ), 你 们 熟 知 的 Google DNS(8.8.8.8) 和 114DNS(114.114.114.114) 就 是 这 类 服 务 器 我 们 还 是 用 一 个 流 程 例 子 来 描 述 DNS 的 工 作 方 式 ( 这 里 以 递 归 DNS 方 式 准 ) 1. 你 的 浏 览 器 调 用 windows 的 相 关 函 数 接 口, 让 windows 发 出 了 解 析 twitter.com 的 请 求 2. 这 个 请 求 先 发 送 到 了 你 的 路 由 器, 但 路 由 器 没 有 关 于 twitter.com 的 记 录 缓 存, 就 继 续 向 路 由 器 上 设 定 的 DNS( 假 设 是 8.8.8.8) 请 求 解 析 这 个 域 名 3. 8.8.8.8 收 到 解 析 请 求, 发 现 他 也 没 有 这 个 域 名 的 记 录 ( 虽 然 现 实 中 不 太 可 能 ), 他 就 会 向 根 域 ( 也 就 是. 域 ) 的 NS 服 务 器 查 询

第 一 章 网 络 基 础 知 识 9 4. 根 域 的 NS 服 务 器 说, 我 不 知 道, 不 过 com 域 的 NS 服 务 器 知 道, 这 是 com 域 的 NS 服 务 器 地 址 ( 例 如 是 2.2.2.2), 你 去 问 他 5. 然 后 8.8.8.8 就 向 com 域 的 NS 服 务 器 2.2.2.2 发 出 解 析 请 求,2.2.2.2 说 妈 蛋, 我 也 不 知 道, 不 过 我 知 道 twitter.com 的 NS 是 啥 (3.3.3.3), 你 去 问 他 吧 6. 8.8.8.8 灰 溜 溜 的 跑 去 问 3.3.3.3, 这 是 twitter.com 的 NS, 当 然 知 道 twitter.com 的 IP 是 什 么, 终 于 大 喊 一 声 你 咋 才 来 啊! 然 后 告 诉 了 它 twitter.com 的 IP 7. 然 后 8.8.8.8 告 诉 路 由, 路 由 告 诉 你 的 电 脑,windows 告 诉 浏 览 器, 不 出 意 外 的 话, 你 还 是 没 打 开 twitter.com( 谁 让 你 生 在 中 国!) 图 1.7: DNS 递 归 解 析 过 程 上 面 这 个 递 归 解 析 方 式, 是 目 前 最 常 见 的 DNS 服 务 器 工 作 方 式, 大 部 分 工 作 都 由 DNS 服 务 器 完 成 还 有 一 种 很 蛋 疼 的 解 析 方 式 叫 做 迭 代 解 析, 那 么 这 个 过 程 有 什 么 不 同 呢? 1. 你 的 浏 览 器 调 用 windows 的 相 关 函 数 接 口, 让 windows 发 出 了 解 析 twitter.com 的 请 求 2. 这 个 请 求 先 发 送 到 了 你 的 路 由 器, 但 路 由 器 没 有 关 于 twitter.com 的 记 录 缓 存, 就 继 续 向 路 由 器 上 设 定 的 DNS( 假 设 是 8.8.8.8) 请 求 解 析 这 个 域 名 3. 8.8.8.8 收 到 解 析 请 求, 发 现 他 也 没 有 这 个 域 名 的 记 录, 然 后 蛋 疼 的 过 程 开 始 了 4. 8.8.8.8 说 那 个 啥, 地 址 我 不 知 道, 这 个 是 根 域 名 称 服 务 器 的 地 址, 你 自 己 那 个 啥 吧 5. 然 后 你 就 得 自 己 把 上 面 8.8.8.8 干 的 那 些 活, 那 一 次 次 被 人 戏 弄 的 过 程 自 己 重 复 一 遍, 直 到 查 到 IP 为 止 怎 么 样, 这 活 挺 好 干 吧, 返 回 个 根 域 的 名 称 服 务 器 地 址 就 行 了, 这 样 的 DNS 服 务 器 到 底 有 啥 用? 我 觉 得 没 啥 用, 因 为 根 服 务 器 就 那 几 台, 我 还 需 要 你 来 告 诉 我? 所 以 基 本 已 经 没 几 个 DNS 服 务 器 是 迭 代 查

第 一 章 网 络 基 础 知 识 10 询 了, 基 本 都 是 递 归 解 析 1.7 什 么 是 TCP 和 UDP? 哎 呀, 怎 么 忽 然 跳 到 这 么 专 业 的 两 个 词 汇 上 了? 好 吧, 这 可 能 是 本 章 最 后 两 个 概 念 了, 你 先 忍 忍 吧, 我 尽 量 用 不 专 业 的 语 句 描 述 ( 太 专 业 的 我 也 不 会 啊 ) TCP 和 UDP 都 是 网 络 传 输 层 的 概 念, 是 两 种 机 制 不 同 的 传 输 协 议, 他 们 的 主 要 区 别 是 TCP 是 面 向 连 接 的, 而 UDP 是 无 连 接 的, 怎 么 理 解 呢? 比 如 你 要 从 上 海 送 一 件 东 西 到 北 京, 你 可 以 先 打 个 电 话 过 去 通 知 北 京 那 边 的 接 收 人, 告 诉 他 我 现 在 要 寄 东 西 过 去 了, 北 京 那 边 也 会 给 你 一 个 响 应, 告 诉 你 他 知 道 你 要 开 始 寄 送 了 打 电 话 这 个 事 情 本 身 首 先 就 在 收 发 双 方 同 步 了 一 个 寄 东 西 的 时 间, 如 果 打 完 电 话 后 3 天 东 西 都 没 到, 那 么 双 方 通 过 电 话 一 确 认 就 可 以 知 道 这 中 间 出 问 题 了, 应 该 重 新 发 送, 如 果 收 到 了, 北 京 那 边 可 以 给 你 一 个 回 复 告 诉 你 收 到 了 因 为 双 方 有 电 话 这 个 连 接 的 存 在, 就 可 以 对 寄 送 包 裹 的 信 息 和 结 果 作 确 认, 所 以 几 乎 可 以 肯 定 的 保 证 要 寄 送 的 东 西 一 定 会 到 达, 现 实 世 界 有 些 东 西 丢 了 就 没 了, 而 数 字 世 界 数 据 丢 了 重 发 的 成 本 是 极 低 的 这 种 有 电 话 这 个 沟 通 方 式 作 为 连 接 的 传 输 协 议, 就 类 似 TCP 而 UDP 就 简 单 多 了, 事 先 不 需 要 电 话 联 系, 直 接 写 个 地 址 就 把 东 西 送 过 去 了, 这 中 间 如 果 东 西 丢 了, 双 方 也 没 有 什 么 方 法 来 确 认, 只 能 看 快 递 公 司 的 良 心 了 那 你 也 许 会 问 为 什 么 要 用 UDP 这 种 看 起 来 靠 天 吃 饭 的 协 议? 一 个 包 裹 一 次 电 话 你 也 许 觉 得 没 什 么, 如 果 一 千 个 包 裹 呢? 一 万 个 呢? 如 果 送 一 个 包 括 要 两 天, 而 这 个 电 话 本 身 打 通 的 时 间 都 要 3 个 小 时 呢, 如 果 电 话 每 分 钟 5 美 元 话 费 呢? 所 以, 如 果 要 寄 送 的 东 西 并 不 是 那 么 贵 重 必 须 保 证 准 确 到 达, 而 快 递 公 司 毕 竟 也 没 有 不 靠 谱 到 10 个 包 丢 8 个 的 地 步, 这 个 电 话 连 接 过 程 就 显 得 有 些 影 响 效 率 了 就 好 像 一 家 卖 袜 子 的 淘 宝 店 一 天 如 果 要 发 1000 件 货, 一 双 袜 子 1 块 9 毛 9 包 邮 他 才 不 会 每 件 发 货 前 都 跟 你 打 电 话 通 知 一 下, 到 货 了 再 跟 你 电 话 确 认 一 下 东 西 到 了 没 ; 他 只 负 责 把 货 发 出 去, 剩 下 送 货 和 确 认 收 货 就 不 管 了, 真 要 管 的 话 打 个 电 话 可 能 就 要 赔 钱 了 这 里 我 们 归 纳 一 下 TCP 和 UDP 的 区 别 : 特 点 TCP UDP 可 靠 性 面 向 连 接, 高 无 连 接, 低 按 序 传 输 按 先 后 顺 序 到 达 随 机 实 现 难 度 需 要 进 行 数 据 重 组 恢 复, 复 杂 不 在 乎 顺 序, 简 单 传 输 单 位 数 据 流 ( 水 管 ) 数 据 包 ( 包 裹 ) 应 用 范 围 HTTP,FTP,MAIL DNS,TFTP,VOIP

第 一 章 网 络 基 础 知 识 11 1.8 什 么 是 VPN? 不 是 说 好 最 后 两 概 念 了 吗? 怎 么 又 来 一 个! 我 不 是 说 了 可 能 嘛, 章 节 规 划 这 种 事 我 从 来 都 不 擅 长 其 实 你 想 想, 做 个 翻 墙 路 由 如 果 连 VPN 4 是 啥 都 不 先 说 清 楚, 可 能 吗? 如 果 你 经 常 玩 海 外 服 的 游 戏, 你 可 能 已 经 用 过 VPN 了, 很 多 游 戏 加 速 器 什 么 的 其 本 质 就 是 VPN, 只 不 过 一 般 他 们 会 控 制 一 下 路 由 表 ( 算 了, 路 由 表 以 后 再 说 吧 ), 让 你 的 机 器 只 对 游 戏 服 务 器 走 VPN 线 路, 而 对 其 他 服 务 器 的 访 问 还 是 走 你 原 来 的 线 路, 这 其 实 已 经 类 似 一 个 FreeRouter 了, 只 不 过 翻 墙 的 范 围 不 是 你 自 己 决 定 的 如 果 你 认 为 VPN 就 是 一 个 代 理 那 就 错 了, 纯 粹 的 VPN 本 身 不 能 提 供 任 何 代 理 作 用 VPN 的 全 名 是 Virtual Private Network, 就 是 虚 拟 私 有 网 络 中 间 的 实 现 原 理 我 们 就 不 管 了, 其 结 果 就 是 : 在 客 户 端 建 立 了 一 个 虚 拟 的 网 卡, 这 个 虚 拟 的 网 卡 和 服 务 器 的 虚 拟 网 卡 之 间 建 立 了 一 条 虚 拟 的 专 用 通 道 图 1.8: VPN 等 效 结 构 所 有 经 过 这 个 通 道 传 输 的 数 据, 都 会 经 过 不 同 的 VPN 协 议 加 密 打 包 最 后 封 装 成 可 以 被 现 实 网 络 接 收 的 数 据 格 式, 通 过 现 实 的 网 络 接 口 传 达 到 对 方 之 后 5, 再 以 之 前 建 立 连 接 时 商 量 好 的 的 VPN 协 议, 对 数 据 进 行 拆 包 和 解 密 那 你 能 看 出 这 个 过 程 哪 里 像 个 代 理 吗? 当 然 没 有 4 本 文 默 认 只 讨 论 PPTP VPN 这 一 种 类 型, 其 他 类 型 的 原 理 不 同, 但 在 FreeRouter 上 的 应 用 方 式 基 本 一 样 5 虚 拟 的 始 终 是 虚 拟 的, 只 是 让 操 作 系 统 看 起 来 以 为 有 一 个 网 卡 而 已, 实 际 在 物 理 上 并 不 存 在

第 一 章 网 络 基 础 知 识 12 纯 粹 的 VPN 配 置, 就 是 让 你 和 服 务 器 之 间 建 立 了 一 个 连 接, 如 果 其 他 人 再 连 进 服 务 器 来, 你 和 其 他 人 就 类 似 处 于 同 一 个 局 域 网 内 了 那 么 通 过 VPN 远 程 访 问 办 公 室 的 服 务 器 资 源, 或 者 实 现 翻 墙, 游 戏 代 理 是 怎 么 实 现 的 呢? 在 Linux 系 统 上, 这 个 是 借 助 系 统 防 火 墙 的 转 发 功 能 实 现 的 VPN 建 立 之 后 相 当 于 一 个 局 域 网, 而 VPN 服 务 器 就 是 这 个 局 域 网 的 网 关, 所 有 局 域 网 客 户 端 的 数 据 都 会 先 发 送 到 服 务 器 这 个 虚 拟 网 关 上 那 么 在 防 火 墙 规 则 里, 就 可 以 把 所 有 来 自 这 个 虚 拟 局 域 网 IP 的 数 据, 全 部 转 发 到 一 个 现 实 的 网 卡 上 去, 如 果 这 个 网 卡 连 接 了 办 公 室 的 网 络, 那 么 你 就 可 以 通 过 VPN 访 问 办 公 室 网 络 了 如 果 你 还 是 觉 得 VPN 的 概 念 太 玄 幻, 你 就 把 VPN 当 做 你 计 算 机 / 路 由 上 接 入 的 另 一 条 网 线 好 了 谈 到 这 里 我 觉 得 又 不 得 不 再 补 充 两 个 概 念 了, 因 为 你 可 能 已 经 对 上 一 段 话 的 一 些 语 句 感 到 迷 茫 了, 放 心, 这 两 个 概 念 都 会 说 得 很 简 洁 ( 因 为 真 的 不 简 单 ) 1.9 网 卡 / 接 口 / 适 配 器? 网 卡 是 现 实 世 界 的 概 念, 是 你 看 的 见 摸 得 着 的 东 西 也 许 你 也 听 说 过, 对 于 Linux 系 统 来 说 一 切 事 物 都 是 文 件, 同 样 的,Linux 系 统 对 网 卡 的 操 作, 包 括 数 据 收 发 也 都 是 通 过 一 个 网 卡 的 文 件 形 式 化 身 来 实 现 的, 这 个 化 身 在 操 作 系 统 里 就 被 叫 做 接 口 在 Linux 终 端 里 输 入 ifconfig 命 令 就 可 以 看 到 你 的 机 器 有 哪 些 接 口 了 : 图 1.9: OpenWRT 路 由 下 的 接 口 可 以 看 到, 建 立 VPN 连 接 之 后, 我 的 路 由 里 有 一 个 叫 pptp-vpn 的 接 口, 这 对 路 由 的 系 统 来 说 就 是

第 一 章 网 络 基 础 知 识 13 一 个 可 用 的 网 卡 在 windows 里 面, 这 个 一 般 被 叫 做 网 络 适 配 器, 可 以 通 过 ipconfig /all 来 查 看 你 可 以 把 网 卡 / 接 口 / 适 配 器 看 做 是 护 照, 当 你 有 了 一 国 的 护 照, 你 至 少 就 有 了 在 这 个 国 家 行 走 的 权 利, 在 这 个 国 家 行 走 的 权 利 就 是 这 本 护 照 对 应 着 的 网 络 1.10 什 么 是 网 关? 我 们 速 战 速 决 解 决 这 个 概 念, 因 为 真 的 展 开 起 来 将 非 常 麻 烦 汉 子 汉 字 是 非 常 美 妙 的 ( 一 不 小 心 差 点 出 柜 了 ), 网 关 这 两 个 字 其 实 就 已 经 告 诉 了 你 们 它 的 含 义 : 一 个 网 络 的 关 卡 我 们 说 了 接 口 好 像 护 照, 颁 发 护 照 的 国 家 就 是 对 应 的 网 络, 但 你 如 果 想 要 出 国, 就 必 须 通 过 出 入 境 关 卡 才 行, 哪 怕 你 要 去 的 国 家 是 免 签 的, 这 个 出 入 境 关 卡 就 是 网 关 默 认 网 关, 顾 名 思 义, 就 是 当 一 个 访 问 网 络 的 请 求 没 有 被 指 定 要 走 哪 个 特 定 网 关 的 时 候, 就 走 默 认 网 关, 就 好 像 日 本 人 进 出 国 门 一 般 都 走 成 田 机 场 一 样 但 那 并 不 是 强 制 要 求, 谁 还 禁 止 你 从 东 京 飞 洛 杉 矶 吗 一 般 来 说, 当 你 连 接 上 路 由 之 后, 路 由 就 是 你 的 默 认 网 关, 你 所 有 的 数 据 都 是 通 过 路 由 收 发 的 如 6 果 有 人 进 行 ARP 欺 骗 让 你 误 以 为 他 的 机 器 是 默 认 网 关, 那 么 你 所 有 的 网 络 数 据 都 会 通 过 他 的 机 器, 对 于 FTP 和 SMTP 这 种 连 密 码 都 是 明 文 的 协 议, 他 就 可 以 在 自 己 机 器 上 完 全 截 获, 轻 松 获 得 你 的 密 码 我 们 也 说 了, 默 认 网 关 是 当 网 络 请 求 没 有 指 定 网 关 的 时 候 走 的 通 路, 如 果 你 愿 意, 你 也 可 以 要 求 走 其 他 的 网 关 例 如 你 可 以 设 定 访 问 某 个 IP 的 时 候, 不 走 默 认 网 关 而 走 特 定 的 网 关 当 然, 同 时 伴 随 着 的 是, 你 肯 定 要 使 用 这 个 网 关 所 对 应 的 接 口 来 使 用 这 个 网 关 例 如 你 现 在 在 太 平 洋 中 间 的 公 海, 你 要 去 看 兵 马 俑, 你 就 可 以 拿 着 中 国 护 照 ( 接 口 ) 从 北 京 出 入 境 关 卡 ( 网 关 ) 进 入 中 国 ; 而 如 果 你 要 去 看 自 由 女 神, 你 就 可 以 拿 着 美 国 护 照 ( 另 一 个 接 口 ) 从 纽 约 ( 另 一 个 网 关 ) 入 境 你 也 可 以 在 使 用 一 个 接 口 访 问 网 络 的 时 候 不 指 定 这 个 接 口 的 网 关, 这 个 时 候 就 会 使 用 这 个 接 口 的 默 认 网 关, 我 们 一 般 面 对 的 都 是 这 个 情 况 而 针 对 不 同 的 目 的 地, 选 择 性 的 使 用 网 关 / 接 口, 这 个 其 实 就 是 FreeRouter 实 现 针 对 网 站 ( 准 确 的 说 是 域 名 ) 选 择 性 翻 墙 的 关 键 所 在 6 这 个 真 不 能 再 讲 了, 自 己 搜

第 二 章 GFW 的 工 作 方 式 你 可 以 很 轻 易 的 欺 骗 全 世 界, 但 你 这 辈 子 也 骗 不 了 自 己 在 有 了 一 些 基 本 的 网 络 知 识 之 后, 我 们 现 在 讲 讲 GFW 的 工 作 方 式, 所 谓 知 己 知 彼 百 战 不 殆 嘛 不 过 GFW 本 身 是 一 个 人 人 都 知 道 它 存 在, 却 从 来 不 会 被 官 方 承 认 的 机 构, 就 好 像 秘 密 警 察 部 门 一 样 所 以 对 于 它 的 工 作 方 式, 各 方 也 都 只 能 是 通 过 分 析 和 模 拟 来 大 致 猜 测, 也 许 已 经 接 近 真 相, 但 永 远 都 不 等 于 真 相 首 先 你 要 明 白 GFW 的 目 的 是 什 么, 它 不 是 要 阻 止 你 访 问 所 有 的 境 外 网 站, 也 不 是 允 许 你 访 问 所 有 的 境 内 网 站 如 果 一 个 国 内 网 站 出 现 它 不 想 看 到 的 东 西, 基 于 现 在 中 国 宽 带 网 络 的 现 状, 网 警 要 动 手 清 理 一 个 境 内 网 站 实 在 太 容 易 了, 不 过 这 就 不 在 我 们 的 关 心 范 围 里 了 话 说 回 来, 在 国 内 开 反 动 网 站 的 话, 这 种 智 商 的 确 令 人 心 痛 对 于 境 外 的 网 站,GFW 的 封 锁 重 点 是 : 新 闻, 社 交, 政 治, 色 情, 文 件 共 享 类 网 站 其 他 几 种 很 好 理 解, 社 交 类 的 原 因 是 因 为 阿 拉 伯 之 春 的 很 多 串 联 都 是 通 过 facebook 完 成 的, 而 twitter 又 是 实 际 上 的 最 大 的 即 时 新 闻 发 布 站 点, 文 件 共 享 类 网 站 可 以 让 人 们 很 方 便 的 传 播 一 些 它 不 想 看 到 的 东 西 对 于 GFW 来 说, 最 有 效 的 方 式 是 什 么? 请 参 考 第 一 章 的 题 注 一 2.1 DNS 劫 持 和 污 染 如 果 从 技 术 实 现 上 来 说,GFW 做 有 效 的 方 式 当 然 是 DNS 劫 持 和 污 染 了, 也 许 你 对 这 个 东 西 完 全 没 概 念, 但 实 际 上 你 这 么 多 年 来 可 能 一 直 在 被 这 东 西 祸 害 着 在 这 里 先 教 你 一 个 简 单 的 命 令 :nslookup 开 始 菜 单, 运 行 (win8 用 户 win+r 键 ), 输 入 cmd, 回 车 分 别 用 nslookup 查 一 下 facebook.com(nslookup facebook.com) 和 twitter.com(nslookup twitter.com) 的 域 名, 重 复 几 次 是 不 是 发 现 点 问 题? 这 两 个 网 站 怎 么 IP 是 一 样 的?facebook 准 备 收 购 twitter 了? 你 再 试 试 14

第 二 章 GFW 的 工 作 方 式 15 youtube.com, 嗯, 你 总 不 会 觉 得 Google 要 把 youtube 卖 给 facebook 吧 之 所 以 会 看 到 这 种 奇 怪 的 景 象, 就 是 GFW 的 DNS 污 染 在 作 怪 我 们 前 面 已 经 说 了, 要 访 问 一 个 网 站, 首 先 的 步 骤 是 通 过 DNS 服 务 器 解 析 这 个 网 站 域 名 对 应 的 IP, 可 是 如 果 DNS 服 务 器 返 回 给 你 的 IP 都 是 错 的, 你 又 怎 么 可 能 访 问 到 网 站 呢? 好 比 你 想 从 广 州 去 北 京, 阻 止 你 的 最 好 办 法 不 是 半 路 截 杀 你, 而 是 告 诉 你 上 船 一 路 往 南 走 GFW 的 DNS 劫 持 是 造 成 劫 持 和 污 染 的 根 源! 很 多 人 可 能 对 GFW 的 DNS 污 染 的 概 念 始 终 停 留 在 DNS 缓 存 投 毒 这 个 概 念 上, 什 么 叫 缓 存 投 毒? 首 先 要 了 解 什 么 是 DNS 缓 存 因 为 DNS 系 统 设 计 的 时 候, 就 考 虑 到 这 是 一 个 需 要 频 繁 响 应 的 系 统, 所 以 一 条 域 名 记 录 被 查 询 到 之 后, 都 会 在 DNS 服 务 器 的 缓 存 中 驻 留 一 段 时 间, 这 样 下 次 查 询 的 时 候 就 直 接 从 缓 存 中 读 取 记 录 而 不 需 要 再 次 进 行 递 归 查 询 了 如 果 错 误 的 记 录 进 入 了 DNS 服 务 器, 这 个 错 误 的 记 录 就 会 被 保 持 一 段 时 间 1, 如 果 在 缓 存 过 期 后 又 有 一 次 错 误 的 信 息 进 入, 那 么 还 是 继 续 保 留 这 错 误 的 记 录, 这 个 过 程 如 果 一 直 重 复, 服 务 器 就 永 远 无 法 返 回 正 确 的 记 录 了, 这 就 成 了 缓 存 中 毒 而 一 般 意 义 上 的 黑 客 的 缓 存 投 毒, 是 通 过 生 日 攻 击 2 这 种 方 式 进 行 的,GFW 需 要 用 这 么 低 级 的 手 段 吗? 黑 客 需 要 发 送 生 日 攻 击, 目 的 是 通 过 两 边 大 量 的 数 据 碰 撞 猜 到 查 询 者 发 起 的 查 询 的 Transaction ID, 因 为 只 有 响 应 包 的 Transaction ID 和 请 求 包 的 一 样 才 会 被 查 询 者 接 受 但 是 GFW 完 全 控 制 了 中 国 网 络 的 对 外 出 口 网 关, 他 还 需 要 猜 你 的 Transaction ID 吗? 他 只 要 直 接 嗅 探 就 行 了, 就 好 像 你 在 自 己 的 路 由 上 用 TcpDump 抓 取 所 有 通 过 路 由 的 网 路 数 据 一 样, 既 然 可 以 嗅 探 到 你 全 部 的 DNS 查 询 数 据,GFW 想 要 伪 造 一 个 响 应 包 也 就 完 全 没 有 困 难 了 除 了 嗅 探 DNS 查 询 数 据, 其 实 所 有 的 明 文 传 输 的 密 码 (FTP,SMTP 等 ) 都 是 可 以 轻 松 被 嗅 探 到 的 我 们 前 面 已 经 说 了,DNS 是 基 于 UDP 协 议 的, 而 UDP 这 种 不 面 向 连 接 的 协 议 是 极 度 缺 乏 安 全 性 的, 你 完 全 不 能 保 证 当 你 向 一 个 服 务 器 查 询 DNS 记 录 后, 返 回 记 录 给 你 的 真 的 就 是 那 台 DNS 服 务 器 我 们 知 道,13 套 根 域 名 服 务 器 系 统 没 有 一 套 是 在 中 国 的, 中 国 只 有 镜 像, 而.com,.net 这 些 顶 级 域 名 称 服 务 器 在 中 国 连 镜 像 都 没 有, 而 twitter facebook youtube 这 些 域 名 的 权 威 名 称 服 务 器 更 是 毫 无 疑 问 的 全 部 在 国 外, 所 以 DNS 服 务 器 在 递 归 查 询 这 些 网 站 域 名 的 A 记 录 的 时 候, 信 息 一 定 会 经 过 GFW 到 国 外 现 在 GFW 知 道 了 你 ( 某 台 DNS 服 务 器 ) 要 向 国 外 的 某 个 服 务 器 查 询 twitter.com 的 A 记 录, 在 国 外 服 务 器 返 回 正 确 的 信 息 给 你 之 前,GFW 就 伪 造 一 个 响 应 包 给 你, 告 诉 你 twitter.com 的 服 务 器 在 新 疆 某 个 山 沟 里,IP 是 什 么 什 么 再 强 调 一 次,UDP 包 是 无 法 判 断 来 源 的 真 实 性 的, 而 GFW 伪 造 的 包 里 所 有 信 息 都 符 合 DNS 协 议 规 范,DNS 服 务 器 就 接 受 了 这 个 错 误 的 记 录 1 不 光 是 服 务 器, 我 们 自 己 的 机 器 也 会 对 DNS 记 录 有 一 个 缓 存, 可 以 用 命 令 ipconfig /flushdns 来 清 空 这 个 缓 存 2 一 边 向 服 务 器 发 动 大 量 未 知 域 名 的 解 析 请 求, 促 使 服 务 器 向 上 级 名 称 服 务 器 也 发 出 大 量 请 求, 一 边 同 时 伪 造 大 量 响 应 数 据 给 服 务 器, 当 数 目 足 够 大 的 时 候, 伪 造 响 应 的 Transaction ID 就 可 能 和 服 务 器 查 询 的 Tranaction ID 重 合, 使 得 伪 造 的 响 应 被 服 务 器 接 受

第 二 章 GFW 的 工 作 方 式 16 图 2.1: DNS 劫 持 流 程 那 么 国 外 的 服 务 器 就 不 会 返 回 正 确 的 信 息 过 来 了 吗? 会, 一 定 会, 因 为 UDP 虽 然 不 安 全, 但 基 本 上 还 是 可 以 送 达 的 但 是 你 别 忘 了, 错 误 的 信 息 已 经 抢 先 进 入 了 DNS 服 务 器 的 缓 存, 后 面 再 过 来 的 数 据 DNS 服 务 器 已 经 完 全 当 它 不 存 在 了 谁 先 到 谁 就 是 对 的, 这 就 是 扯 淡 的 DNS 逻 辑, 而 国 外 服 务 器 再 快, 也 不 可 能 快 过 守 在 边 境 的 GFW 网 关, 所 以 你 在 用 8.8.8.8 配 合 dig 这 些 工 具 查 询 域 名 的 时 候 会 发 现, 也 许 解 析 taobao.com 花 了 200 毫 秒, 而 解 析 twitter.com 只 花 了 30 毫 秒, 那 是 因 为 这 个 根 本 就 是 GFW 在 国 内 发 回 给 你 的 以 上 所 描 述 的,GFW 抢 先 于 境 外 服 务 器 返 回 给 你 一 个 错 误 结 果 的 行 为, 就 叫 做 DNS 劫 持 根 据 我 的 观 察 分 析,GFW 这 个 劫 持 行 为 是 发 生 在 所 有 对 国 外 IP 进 行 敏 感 域 名 查 询 的 时 候, 不 是 说 只 有 你 在 往 8.8.8.8 这 些 知 名 国 外 DNS 查 询 的 时 候 才 会 发 生 劫 持, 你 也 不 要 指 望 说 能 不 能 找 到 个 比 较 低 调 没 被 GFW 发 现 的 DNS 服 务 器 IP 可 以 不 被 劫 持, 没 用 的 GFW 甚 至 都 不 用 判 断 目 标 IP 是 什 么, 只 要 是 通 过 出 口 网 关 往 外 面 跑 的, 查 询 敏 感 域 名 的 全 部 劫 持, 这 个 我 可 以 很 明 确 的 告 诉 你 说 到 这 个 什 么 低 调 的 没 被 GFW 发 现 的 DNS, 我 又 忍 不 住 要 说 个 题 外 话 Google 被 封 锁 之 后, 有 些 人 知 道 可 以 通 过 查 找 未 被 封 锁 IP 的 方 式 访 问 Google, 这 本 来 没 什 么, 各 有 各 的 方 法 可 偏 偏 有 些 人, 自 己 知 道 了 这 些 IP 之 后 就 把 这 些 信 息 当 成 了 自 己 的 私 有 财 产 你 不 肯 分 享 给 别 人 就 算 了, 还 要 去 攻 击 那 些 分 享 这 些 IP 的 人, 说 什 么 这 会 让 GFW 赶 尽 杀 绝 的 我 只 想 说 这 几 条 : 1. 没 别 人 的 分 享, 你 他 妈 哪 里 知 道 这 些 IP 的? 真 正 自 己 去 找 到 这 些 IP 的 人 根 本 不 会 说 这 种 话 2. 你 他 妈 真 以 为 GFW 会 需 要 你 来 告 诉 他 哪 些 IP 没 被 封? 真 要 想 动 手, 全 国 局 域 网 + 白 名 单 模 式 早 就

第 二 章 GFW 的 工 作 方 式 17 可 以 启 动 了 3. 自 我 阉 割 的 人 只 有 做 太 监 一 条 路 可 以 走, 还 未 必 做 得 成 4. Google 的 IP 从 来 就 不 是 你 的 私 有 财 产, 这 种 想 法 的 本 质, 除 了 自 私 还 是 自 私 好 吧 我 骂 完 了, 关 于 DNS 劫 持 的 具 体 发 生 阶 段 和 一 些 实 例 分 析, 可 以 参 考 我 网 站 上 的 文 章 : 重 新 理 解 GFW 的 DNS 污 染 和 劫 持 策 略 2.1.1 虚 假 IP 劫 持 那 么,GFW 会 返 回 一 些 什 么 样 的 错 误 信 息 给 你 呢? 就 目 前 各 方 面 统 计 的 信 息 来 看,GFW 返 回 给 你 的 虚 假 信 息, 其 实 就 是 篡 改 了 域 名 的 A 记 录 部 分, 把 你 指 引 导 错 误 的 IP 就 行 了 准 确 的 说, 不 只 是 A 记 录, 对 于 记 录 IPV6 地 址 的 AAAA 记 录 他 们 也 是 一 样 会 劫 持 的, 相 关 信 息 参 考 本 站 文 章 :GFW 的 DNS 劫 持 也 会 干 扰 IPV6 的 AAAA 记 录 目 前 还 值 的 庆 幸 的 是,GFW 返 回 的 虚 假 记 录 只 用 了 一 些 特 定 的 IP, 我 们 可 以 通 过 一 些 手 段 3 来 过 滤 掉 这 些 信 息, 从 而 获 得 正 确 的 解 析 结 果 3 目 前 已 知 的,GFW 用 于 DNS 劫 持 污 染 的 IP 有 48 个 4, 如 下 表 : 118.5.49.6 128.121.126.139 159.106.121.75 169.132.13.103 188.5.4.96 189.163.17.5 192.67.198.6 197.4.4.12 202.106.1.2 202.181.7.85 203.161.230.171 203.98.7.65 207.12.88.98 208.56.31.43 209.145.54.50 209.220.30.174 209.36.73.33 209.85.229.138 211.94.66.147 213.169.251.35 216.221.188.182 216.234.179.13 23.89.5.60 243.185.187.39 第 三 章 iptables 部 分 会 提 到 4 从 2015 年 年 初 开 始, 这 个 数 字 已 经 达 到 几 千, 对 应 的 防 污 染 办 法 也 跟 随 着 修 改, 传 统 的 依 靠 防 火 墙 过 滤 规 则 挡 住 污 染 的 方 法 已 经 失 效

第 二 章 GFW 的 工 作 方 式 18 249.129.46.48 253.157.14.165 37.61.54.158 4.36.66.178 46.82.174.68 49.2.123.56 54.76.135.1 59.24.3.173 64.33.88.161 64.33.99.47 64.66.163.251 65.104.202.252 65.160.219.113 66.45.252.237 72.14.205.104 72.14.205.99 74.125.127.102 74.125.155.102 74.125.39.102 74.125.39.113 77.4.7.92 78.16.49.15 8.7.198.45 93.46.8.89 关 于 为 什 么 使 用 特 定 IP 而 不 是 随 机 IP, 可 能 的 原 因 有 以 下 几 点 : 1. 因 为 劫 持 工 作 量 巨 大, 如 果 使 用 随 机 数 的 话, 生 成 随 机 数 的 计 算 负 担 会 更 重 2. 随 机 IP 可 能 指 向 正 常 工 作 的 网 站, 加 上 这 种 解 析 请 求 的 数 量 巨 大, 会 破 坏 全 球 网 络 的 稳 定 性 3. 部 分 IP 指 向 的 是 制 作 自 由 门 等 翻 墙 软 件 的 公 司, 通 过 这 种 方 式 实 际 上 是 对 他 们 发 起 DDOS 5 攻 击 2.1.2 空 包 劫 持 除 了 返 回 错 误 的 信 息 之 外, 我 还 观 察 到 一 次 很 特 殊 的 GFW 对 境 内 DNS 的 空 包 劫 持 没 错, 境 内, 这 也 在 提 醒 我 们 GFW 不 是 简 单 的 只 工 作 在 出 国 网 关 上, 而 是 同 时 也 分 部 在 全 国 各 个 骨 干 网 络 上 的 这 次 劫 持 发 生 在 我 用 114DNS 查 询 instagram 的 一 个 CDN 节 点 域 名 scontent-a.cdninstagram.com 的 时 候 我 们 的 查 询 包 默 认 是 要 求 服 务 器 做 递 归 查 询 的, 按 标 准 服 务 器 在 返 回 包 中 也 应 该 注 明 它 知 道 了 你 发 出 了 递 归 的 请 求, 可 是 GFW 劫 持 了 我 向 114 的 这 个 请 求, 返 回 了 一 个 不 需 要 递 归 请 求 的 响 应 包, 同 时 没 有 任 何 A 记 录, 而 Reply Code 中 的 错 误 代 码 是 没 有 错 误 5 分 布 式 拒 绝 服 务 攻 击

第 二 章 GFW 的 工 作 方 式 19 和 不 检 查 返 回 源 的 真 实 性 一 样,DNS 甚 至 都 不 会 检 查 应 答 包 中 关 于 递 归 请 求 的 部 分 是 否 发 生 了 变 化, 这 样 一 个 不 需 递 归 请 求, 没 有 A 记 录, 没 有 无 错 误 代 码 的 结 果 就 被 DNS 的 解 析 器 ( 客 户 端, 我 们 的 路 由 或 者 电 脑 ) 接 受 了, 因 为 格 式 完 全 符 合 协 议 规 范 啊, 然 后 一 个 明 明 存 在 的 域 名 就 成 了 找 不 到 IP 的 域 名 了 关 于 这 个 问 题, 具 体 细 节 参 考 文 章 GFW 的 DNS 劫 持 中 的 空 包 污 染 问 题 空 包 劫 持 的 问 题, 因 DNS ISP 不 同 有 很 大 的 区 别, 且 针 对 的 域 名 很 少, 总 的 来 说 这 种 行 为 是 GFW 的 DNS 劫 持 中 的 少 数 派 而 对 于 空 包 污 染 的 过 滤, 规 则 很 容 易 和 迭 代 查 询 的 数 据 包 匹 配 上, 所 以 会 阻 止 本 地 发 起 的 迭 代 查 询 的 结 果 但 我 们 的 OS 所 发 出 的 DNS 请 求 默 认 都 是 递 归 请 求, 基 本 上 不 用 担 心 这 个 问 题, 如 果 你 在 使 用 某 些 调 试 工 具 ( 例 如 Dig+trace 选 项 ) 的 时 候 发 现 没 有 数 据 返 回, 请 先 禁 用 这 个 空 包 过 滤 规 则 6 2.1.3 轻 松 的 扩 散 污 染 GFW 劫 持 搞 定 了 所 有 对 境 外 服 务 器 发 起 的 DNS 解 析 请 求 的, 就 从 源 头 上 保 证 了 我 们 的 递 归 DNS 服 务 器 只 可 能 获 得 敏 感 域 名 的 错 误 IP 那 剩 下 的 工 作 就 是 扩 散 污 染 了 我 们 前 面 说 过,DNS 服 务 器 有 两 种 工 作 方 式 1.6, 分 别 是 递 归 和 迭 代, 迭 代 是 一 种 很 蛋 疼 的 工 作 方 式, 但 现 实 中 总 还 是 有 部 分 DNS 服 务 器 是 在 以 迭 代 的 方 式 工 作 的 按 理 说, 这 些 DNS 服 务 器 几 乎 是 没 有 什 么 解 析 能 力 的 可 实 际 上 呢, 大 部 分 情 况 下 他 们 又 可 以 对 几 乎 所 有 域 名 的 解 析 请 求 都 做 出 响 应 那 么 他 们 自 己 不 能 做 递 归 查 询 去 获 取 域 名 的 各 种 记 录, 这 些 记 录 是 哪 里 来 的 呢?DNS 体 系 里, 还 有 一 个 东 西 叫 做 Zone Transfer 普 通 的 DNS 查 询, 一 般 只 是 查 询 域 名 的 A 记 录 1.5,DNS 服 务 器 也 只 是 响 应 一 条 A 记 录 但 是 DNS 中 还 有 一 种 特 殊 的 记 录 查 询, 叫 做 AXFR 记 录 当 一 个 DNS 服 务 器 接 收 到 这 种 记 录 查 询 的 时 候, 如 果 系 统 的 配 置 没 有 禁 止 这 条 命 令 的 查 询, 他 就 会 把 自 己 服 务 器 内 所 存 储 的 全 部 域 名 的 全 部 记 录 都 传 输 给 请 求 者, 这 个 过 程 因 为 数 据 量 庞 大 需 要 进 行 持 久 的 连 续 传 输, 且 安 全 性 要 求 高, 一 般 是 通 过 TCP 协 议 传 输 的, 如 果 走 UDP 的 话 可 以 被 黑 客 用 于 实 现 能 量 恐 怖 的 DNS 放 大 攻 击 7 这 样 一 个 查 询 AXFR 记 录, 并 取 得 另 一 台 DNS 服 务 器 上 所 有 记 录 的 过 程, 就 叫 做 Zone Transfer 不 过 一 般 来 说 DNS 服 务 器 都 不 会 支 持 或 允 许 你 任 意 查 询 AXFR 记 录, 否 则 负 担 会 大 的 不 可 思 议, 一 般 他 们 会 有 防 火 墙 策 略 只 允 许 特 定 的 主 机 查 询 AXFR 记 录 进 行 Zone Transfer 对 于 那 些 不 支 持 递 归 的 ISP 的 DNS 服 务 器, 只 可 能 是 以 这 样 的 形 式 取 得 域 名 记 录 的 ( 别 跟 我 说 拿 U 盘 拷 啊 ) 那 么 好 了, 支 持 递 归 解 析 的 DNS 服 务 器 已 经 被 劫 持 了, 而 只 能 迭 代 的 DNS 服 务 器 又 只 能 从 递 归 服 务 器 那 里 通 过 Zone Transfer 复 制 记 录, 毫 无 疑 问 复 制 到 的 也 是 被 污 染 的 数 据, 那 么 全 国 的 DNS 就 已 经 被 6 具 体 的 规 则 会 在 后 面 的 章 节 讨 论 7 指 利 用 伪 造 UDP 包 的 查 询 源 ( 被 攻 击 者 的 IP), 通 过 DNS 查 询 数 据 量 大 的 域 名 记 录 ( 例 如 TXT 记 录 ), 最 终 让 DNS 服 务 器 把 这 个 庞 大 的 响 应 包 返 回 到 被 攻 击 者 的 过 程, 而 庞 大 的 DNS 响 应 一 般 会 转 以 TCP 协 议 传 送, 这 就 造 成 了 被 攻 击 者 的 TCP 端 口 阻 塞

第 二 章 GFW 的 工 作 方 式 20 GFW 搞 定 了 你 也 许 会 说, 万 一 我 从 国 外 的 DNS 服 务 器 进 行 Zone Transfer 呢, 你 不 是 说 Zone Transfer 还 是 走 TCP 的 吗, 这 一 般 不 会 被 劫 持 了 吧 我 很 感 激 你 有 这 么 聪 明, 这 的 确 是 个 办 法 ( 其 实 我 也 是 临 时 想 到 的 ) 但 是 我 们 也 说 了, 绝 大 部 分 DNS 主 机 不 会 允 许 你 做 Zone Transfer, 这 个 负 担 太 重 了, 基 本 上 你 只 能 自 己 去 国 外 架 设 服 务 器, 搜 集 递 归 数 据, 然 后 Zone Transfer 到 国 内 了, 所 以 国 内 确 实 有 些 私 人 的 DNS 是 没 被 污 染 的 啊 当 然 我 觉 得 他 们 更 可 能 的 是 在 服 务 器 上 用 写 死 hosts 的 方 式 实 现 的, 这 种 方 式 怎 么 说 呢, 事 实 正 义, 而 程 序 不 正 义, 任 何 人 为 干 预 修 改 域 名 记 录 的 行 为 我 觉 得 本 质 都 是 劫 持 而 对 于 各 大 ISP 8 的 DNS 来 说, 你 觉 得 国 营 企 业, 有 这 可 能 吗? 2.2 敏 感 词 过 滤 我 对 这 种 技 术 的 研 究 比 较 少, 只 能 大 概 的 介 绍 一 下, 如 果 需 要 具 体 的 细 节, 可 以 在 你 能 翻 墙 之 后 参 考 这 篇 文 章, 还 有 这 篇 文 章, 或 者 wikipedia 上 关 于 TCP 重 置 攻 击 的 描 述 我 们 平 常 浏 览 网 页 所 用 的 协 议 叫 做 HTTP 协 议, 基 本 上 你 在 每 个 网 页 的 开 头 都 可 以 看 到 http:// 的 字 样 HTTP 协 议 本 身 是 一 个 比 TCP,UDP 更 高 一 层 的 ( 更 贴 近 用 户 ) 的 应 用 层 协 议, 但 上 层 协 议 最 终 都 是 要 以 封 包 后 以 更 底 层 传 输 层 的 方 式 进 行 传 输 例 如 DNS 协 议 是 用 UDP 协 议 传 输,HTTP 协 议 使 用 的 就 是 TCP 协 议 我 们 说 TCP 相 对 UDP 来 说 是 更 为 安 全 的, 但 这 只 是 相 对 的,TCP 数 据 依 然 是 可 以 被 中 间 人 修 改 的 最 简 单 的 例 子, 就 是 你 们 可 能 用 过 的 一 些 屏 蔽 优 酷, 土 豆 视 频 广 告 的 插 件 和 脚 本, 这 些 东 西 的 原 理 就 是 拦 截 并 修 改 HTTP 数 据 流, 将 涉 及 广 告 的 部 分 代 码 进 行 替 换 这 说 明 了 两 点,TCP 协 议 的 内 容 是 可 以 被 感 知 和 识 别 的 ( 比 如 找 到 广 告 代 码 的 部 分 ), 也 是 可 以 被 修 改 的 ( 替 换 成 无 广 告 的 代 码 ) 虽 然 TCP 协 议 不 会 像 UDP 那 么 容 易 让 第 三 方 伪 造 和 修 改 数 据, 但 肯 定 位 于 你 和 境 外 服 务 器 中 间 的 GFW 还 是 可 以 做 到 的, 没 见 过 圣 旨 的 情 况 下 伪 造 圣 旨 有 困 难, 可 是 让 传 旨 太 监 拿 着 现 成 的 圣 旨 改 个 字 还 是 很 容 易 的 8 Internet Service Provider, 网 络 服 务 提 供 商, 也 就 是 电 信, 联 通, 长 宽, 铁 通 之 类 的

第 二 章 GFW 的 工 作 方 式 21 图 2.2: TCP 重 置 注 入 HTTP 连 接 的 建 立, 有 一 个 著 名 的 三 次 握 手 过 程 : 客 户 端 先 向 服 务 器 发 出 连 接 请 求, 服 务 器 返 回 一 个 连 接 许 可, 客 户 端 再 发 起 连 接 确 认 如 果 GFW 检 测 到 你 要 访 问 的 某 个 地 址 中 包 含 了 敏 感 信 息 ( 域 名 本 身 可 能 就 是 敏 感 信 息 ), 他 就 修 改 或 冒 充 服 务 器 返 回 的 连 接 许 可, 告 诉 你 服 务 器 拒 绝 连 接, 这 样 客 户 端 就 会 自 己 放 弃 连 接, 你 们 平 常 上 网 经 常 看 到 的 大 部 分 网 络 连 接 被 重 置 就 是 这 个 的 结 果, 当 然, 少 数 情 况 下 可 能 服 务 器 真 的 出 问 题 也 会 拒 绝 连 接 你 也 许 会 问 我 们 能 不 能 忽 略 这 个 重 置 (RST) 消 息? 当 然 可 以, 可 是 GFW 比 你 想 得 更 多, 他 不 光 发 送 RST 给 你, 还 发 送 RST 给 服 务 器, 这 样 服 务 器 也 会 认 为 你 已 经 断 开 连 接 了, 就 不 再 发 送 数 据 给 你 了 GFW 这 种 做 法 的 优 势 很 明 显 : 不 需 要 对 完 整 的 HTTP 页 面 数 据 进 行 检 测, 只 要 发 现 URL( 网 页 地 址 ) 中 有 敏 感 信 息, 就 直 接 断 开 了 你 和 服 务 器 之 间 的 连 接, 大 大 减 轻 了 他 自 己 系 统 的 负 担 但 这 种 做 法 的 缺 点 也 很 明 显, 检 测 力 度 太 弱 了 大 家 最 熟 悉 的 例 子 莫 过 于 SexInSex 和 草 榴 这 些 色 情 网 站, 你 直 接 输 入 他 们 的 主 站 域 名 一 般 都 是 连 接 被 重 置, 但 只 要 找 个 其 他 的 IP 替 代 域 名, 一 点 问 题 都 没 有, 因 为 GFW 对 这 些 网 站 检 测 的 敏 感 信 息 仅 仅 是 URL 中 的 域 名, 在 你 把 域 名 替 换 为 不 敏 感 的 IP 之 后, 你 查 看 的 页 面 里 面 有 100 个 无 码 200 个 3P 它 也 完 全 不 在 乎 但 不 是 说 GFW 对 敏 感 信 息 的 检 测 仅 限 于 域 名, 对 于 一 些 数 据 量 很 大, 内 容 庞 杂 的 网 站,GFW 的 URL 检 测 会 精 确 到 页 面 例 如 你 在 wikipedia 上 查 种 猪 饲 养 技 术, 党 和 国 家 会 为 多 了 一 个 纳 税 人 感 到 高 兴 而 绝 对 不 拦 你, 可 是 如 果 你 要 查 八 九 年 天 安 门 学 运, 那 90 秒 内 你 就 别 想 访 问 wikipedia 了 我 们 也 经 常 碰 到 另 一 种 情 况, 就 是 某 些 网 站 使 用 的 是 HTTPS 协 议, 似 乎 在 使 用 这 些 网 站 的 时 候 我 们 从 来 不 会 碰 到 页 面 连 接 被 重 置 的 问 题, 这 是 为 什 么 呢? 这 是 因 为 HTTPS 采 用 了 公 钥 + 私 钥 9 加 密 技 术, 数 据 在 封 包 成 TCP 包 之 前 就 已 经 被 加 密 过, 敏 感 的 信 息 被 加 密 之 后 就 是 一 堆 无 法 解 读 的 乱 码, 这 些 信 息 对 于 GFW 来 说 是 无 法 解 读 的, 或 者 说 解 读 成 本 是 巨 大 的, 这 就 使 得 一 直 到 今 天 ( 2015 年 1 月 21 日 ), 我 们 也 没 有 看 到 哪 个 HTTPS 页 面 被 GFW 连 接 重 置 9 在 下 一 章 讲 DNSSEC 的 时 候 会 再 谈 公 钥 + 私 钥 加 密 体 系

第 二 章 GFW 的 工 作 方 式 22 2.3 IP 阻 断 这 应 该 是 我 所 知 道 的 GFW 的 最 后 绝 招 了 我 们 前 面 说 了 GFW 的 手 段 有 DNS 污 染, 敏 感 词 检 测 重 置, 如 果 一 个 网 站 不 用 域 名 直 接 用 IP, 或 者 有 很 多 方 法 可 以 让 别 人 知 道 它 域 名 的 真 实 IP( 草 榴 在 这 方 面 就 很 出 色 嘛 ), 同 时 页 面 还 都 是 HTTPS 形 式 加 密 过 的,GFW 就 没 办 法 了?Naive! 没 办 法 骗 你 去 南 半 球 看 兵 马 俑 了, 骗 你 说 紫 禁 城 被 拆 迁 了 你 也 不 相 信 了, 老 子 就 把 你 要 走 的 路 直 接 给 断 了 其 实 我 觉 得 我 应 该 在 第 一 章 补 充 一 个 路 由 概 念 的, 好 吧, 就 在 这 里 说 吧 首 先 我 们 要 知 道, 网 络 上 的 任 意 两 个 IP, 他 们 之 间 建 立 连 接 几 乎 都 不 可 能 是 直 连 的, 如 果 任 意 两 个 IP 都 可 以 直 连,GFW 就 只 能 裁 掉 全 部 技 术 人 员 改 建 爆 破 大 队 直 接 破 门 了, 就 好 像 如 果 你 从 广 州 到 北 京 是 通 过 一 条 直 通 的 封 闭 管 道 进 行 的, 那 车 匪 路 霸 早 饿 死 了 无 论 是 面 向 连 接 的 TCP, 还 是 不 面 向 连 接 的 UDP, 数 据 在 网 络 上 的 两 个 IP 之 间 的 传 送, 都 是 通 过 一 级 一 级 的 路 由 中 继 完 成 的, 只 不 过 TCP 的 中 继 路 径 在 连 接 建 立 之 后 是 固 定 的, 而 UDP 的 中 继 路 径 每 次 都 不 同 例 如 你 要 从 国 内 的 A 到 国 外 的 B, 数 据 传 送 的 实 际 路 径 可 能 是 这 样 的 : 图 2.3: 静 态 路 由 丢 弃 别 的 节 点 都 可 能 会 变, 但 GFW 肯 定 会 在 这 条 路 的 中 间 出 现 是 不 用 怀 疑 的 你 看,GFW 这 个 位 置 不 当 车 匪 路 霸 都 可 惜 了 一 个 数 据 到 达 一 个 节 点 后, 下 一 个 节 点 发 往 哪 里 是 由 一 个 叫 路 由 表 的 东 西 控 制 的, 动 态 路 由 10 表 是 由 一 套 路 由 算 法 得 出 的, 而 静 态 路 由 表 则 是 可 以 人 为 指 定 的 GFW 觉 得 静 态 路 由 表 是 个 好 东 西, 就 充 分 发 挥 了 它 的 错 误 利 用 10 虽 然 现 在 针 对 动 态 路 由 表 的 BGP 劫 持 技 术 GFW 也 早 就 掌 握 了, 但 我 们 先 不 考 虑 这 么 复 杂 的 东 西

第 二 章 GFW 的 工 作 方 式 23 假 定 GFW 发 现 某 个 境 外 反 动 网 站, 并 且 知 道 了 他 的 IP 是 1.2.3.4 我 们 已 经 知 道 GFW 是 控 制 了 中 国 的 网 络 出 口 网 关 的, 也 就 是 说 不 管 你 怎 么 访 问, 不 管 前 面 后 面 的 节 点 是 什 么, 最 终 都 要 通 过 GFW 这 个 节 点 那 么 一 个 对 1.2.3.4 发 起 的 网 络 请 求, 在 数 据 到 达 GFW 节 点 之 后, 根 据 路 由 表 下 一 个 节 点 应 该 发 往 哪 里 呢?GFW 猥 琐 地 猛 吸 一 口 烟 屁 股, 嗯, 发 往 达 美 克 星! 达 美 克 星? 没 错! 那 是 什 么 鬼 地 方? 不 知 道! 那 怎 么 办? 爱 咋 办 咋 办! 反 正 这 个 网 络 请 求 最 终 的 命 运 我 是 不 知 道, 只 知 道 它 被 发 送 到 了 一 个 黑 洞 地 址 同 样 的, 所 有 发 往 1.2.3.4 的 请 求 全 部 要 被 发 往 这 个 根 本 不 存 在 的 黑 洞 地 址 当 然 你 要 觉 得 达 美 克 星 太 残 忍, 撒 哈 拉 沙 漠 正 中 央 也 是 可 以 考 虑 的 选 项, 总 之 是 一 个 让 你 进 得 去 就 出 不 来 的 地 址 那 么, 毫 无 疑 问 的, 国 内 网 络 通 往 1.2.3.4 的 路 径 就 被 切 断 了, 你 知 道 IP 有 什 么 用, 部 署 了 HTTPS 加 密 又 有 什 么 用?

第 三 章 常 用 的 辅 助 工 具 这 个 世 界, 没 有 什 么 是 比 时 间 更 宝 贵 的 再 经 过 一 些 更 进 阶 的 知 识 准 备 ( 你 不 会 真 以 为 第 一 章 那 些 文 科 生 普 及 文 档 就 足 够 了 吧 ), 我 们 很 快 就 可 以 开 始 正 题 了 注 意! 本 章 的 命 令 默 认 都 是 Linux 系 统 命 令, 因 为 我 们 最 后 要 面 对 的 OpenWRT 就 是 一 个 Linux 系 统 3.1 Ping 和 TCPing 命 令 Ping 命 令, 是 一 个 基 于 网 络 层 ( 比 传 输 层 还 底 层 ) 的 ICMP(Internet Control Message Protocol) 协 议 的 命 令, 主 要 用 于 检 测 和 目 标 主 机 之 间 的 网 络 是 否 通 畅, 以 及 网 络 的 延 时 Ping 命 令 的 使 用 非 常 简 单, 开 始, 运 行,cmd, 回 车, 打 开 命 令 提 示 符 ( 我 想 linux 用 户 应 该 不 需 要 我 来 教 你 们 怎 么 打 开 terminal), ping IP 地 址, 或 者 ping 网 站 域 名 Ping 命 令 的 解 读 实 在 太 人 性 化 了, 我 觉 得 我 就 没 必 要 再 解 释 了 ping 命 令 我 们 一 般 很 少 加 别 的 参 数 运 行,windows 下 默 认 ping 只 运 行 4 次, 加 上 参 数 -t 后 可 以 让 命 令 持 续 运 行, 直 到 我 们 手 工 停 止 1 但 是 前 几 年, 有 一 种 很 流 行 的 网 络 攻 击 手 段 就 是 利 用 ping 命 令 进 行 的, 所 以 很 多 主 机 现 在 都 会 在 防 火 墙 规 则 里 禁 止 ping 响 应, 即 使 你 可 以 访 问 网 站 也 未 必 就 可 以 ping 通 这 种 情 况 下 我 们 可 以 利 用 另 一 个 tcping 工 具, 通 过 对 远 程 服 务 器 的 TCP 端 口 的 通 畅 与 否 进 行 检 测, 来 判 断 网 络 的 畅 通 tcping 在 windows 和 linux 系 统 中 都 不 是 内 建 的 命 令, 需 要 我 们 自 己 去 下 载,TCPING 的 官 方 网 站 在 这 里 TCPing 的 命 令 参 数 和 使 用 方 法 和 Ping 很 相 似, 主 要 的 区 别 是 Ping 是 通 过 既 有 的 ICMP 协 议 进 行, 而 TCPing 是 通 过 TCP 协 议 进 行, 所 以 可 以 再 最 后 加 入 一 个 端 口 参 数, 对 服 务 器 的 不 同 端 口 进 行 探 测, 例 如 网 页 服 务 器 默 认 是 探 测 80 端 口 ( 不 指 定 端 口 时 默 认 就 是 80), 而 邮 件 服 务 器 可 以 探 测 SMTP 的 25 端 口 基 本 上 对 于 一 个 网 站 来 说,80 端 口 是 不 可 能 关 闭 的, 所 以 我 们 一 般 会 用 TCPing 来 代 替 Ping 对 本 地 到 服 务 器 之 间 的 网 络 通 断 进 行 探 测 1 ping flood 24

第 三 章 常 用 的 辅 助 工 具 25 3.2 traceroute 命 令 我 们 在 上 一 章 最 后 一 节 2.3 提 到 另 一 个 路 由 表 的 概 念, 我 们 说 了 路 由 表 决 定 了 两 个 IP 之 间 的 连 接 最 终 是 通 过 那 些 节 点 连 接 起 来 的 如 果 我 们 想 要 查 看 两 个 IP 之 间 的 连 接 实 际 经 过 了 哪 些 节 点, 就 可 以 借 助 traceroute 命 令 来 查 看 traceroute 命 令 的 使 用 非 常 简 单, traceroute+ 目 标 IP 然 后 就 会 开 始 追 踪 出 你 和 目 标 IP 之 间 经 过 的 路 由 节 点 了, 当 然 你 也 可 以 直 接 用 traceroute+ 域 名 的 方 式, 前 提 是 你 执 行 traceroute 命 令 的 机 器 有 个 正 常 工 作 的 DNS 系 统, 能 正 常 解 析 域 名 在 windows 下, 有 一 个 等 效 的 命 令 叫 做 tracert 如 果 你 有 兴 趣 的 话, 可 以 去 这 个 页 面 看 看 traceroute 的 详 细 解 释 我 们 在 windows 下 用 tracert 命 令 跟 踪 一 下 twitter.com 试 试 : 图 3.1: 通 过 翻 墙 路 由 的 tracert 第 三 行 的 目 标 IP 因 为 是 我 VPN 服 务 器 的 IP, 所 以 抹 黑 隐 藏 掉 可 以 看 到,tracert 会 对 每 一 个 节 点 发 出 3 次 探 测 包, 并 检 查 每 一 次 节 点 响 应 的 速 度, 但 这 三 次 探 测 并 不 一 定 每 一 次 都 会 有 响 应, 于 是 就 出 现 了 星 号 * 一 般 来 说, 如 果 到 一 个 节 点 之 后 出 现 了 3 个 星 号, 就 意 味 着 到 这 个 节 点 之 后 网 路 已 经 中 断 了 ( 大 部 分 是 被 GFW 通 过 静 态 路 由 丢 弃 了 ) 但 也 有 可 能 是 某 些 节 点 因 为 自 身 的 设 置 不 响 应 tracert 的 探 测, 碰 到 这 种 情 况 继 续 等 待 一 下, 如 果 在 等 待 过 几 个 节 点 之 后 探 测 信 息 又 恢 复 了, 那 说 明 只 是 个 别 节 点 不 响 应 而 已, 但 网 路 还 是 通 的 而 对 于 没 有 VPN 转 发 的 普 通 中 国 网 路 来 说, 到 twitter 的 通 路 一 般 都 是 断 的, 结 果 会 是 这 样 : root@openwrt:~# traceroute twitter.com traceroute to twitter.com (199.59.148.82), 30 hops,max 38 byte packets

第 三 章 常 用 的 辅 助 工 具 26 1 10.1.1.1 (10.1.1.1) 0.460 ms 0.430 ms 0.420 ms 2 161.187.184.117.in-addr.arpa (117.184.187.161) 3.610 ms 3.724 ms * 3 153.125.181.221.in-addr.arpa (221.181.125.153) 2.505 ms 2.206 ms 4.212 ms 4 221.183.14.153 (221.183.14.153) 2.611 ms 221.176.19.49 (221.176.19.49) 3.642 ms 2.693 ms 5 221.176.16.206 (221.176.16.206) 31.164 ms 32.144 ms 33.038 ms 6 221.176.18.114 (221.176.18.114) 33.854 ms 34.504 ms 31.493 ms 7 * * * 8 * * * 9 * * * 10 * * * 11 * * * 可 以 看 到 从 第 六 个 几 点 之 后 就 再 也 没 有 跟 踪 信 息 了, 通 过 一 些 查 IP 的 网 站 我 们 可 以 看 到, 最 后 一 个 节 点 221.176.18.114 是 中 国 移 动 的 骨 干 网, 也 就 是 说 我 们 对 twitter 的 访 问 在 这 个 位 置 被 路 由 丢 弃 了, 根 本 就 没 达 到 国 外, 更 不 要 说 twitter 的 服 务 器 了 3.3 route 命 令 既 然 GFW 可 以 通 过 静 态 路 由 丢 弃 我 们 的 网 络 请 求, 那 么 我 们 自 己 可 以 用 静 态 路 由 表 来 绕 过 GFW 吗? 当 然 可 以, 这 就 是 route 命 令 的 一 个 重 要 作 用 了 Route 命 令 的 Man Pange 在 这 里, 有 时 间 一 定 要 多 去 看 看 这 些 命 令 的 man page, 我 不 可 能 把 每 一 条 都 很 详 细 的 给 你 翻 译 过 来 我 们 说 了 traceroute 是 检 查 两 个 IP 之 间 实 际 的 路 由 状 况, 而 route 命 令 就 是 查 看 当 前 主 机 上 已 有 的 路 由 表 的 命 令 直 接 输 入 route, 我 们 就 会 看 到 类 似 如 下 的 信 息 (VPN IP 隐 去 ): root@openwrt:~# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 10.1.1.1 0.0.0.0 UG 0 0 0 eth0.2 10.1.1.0 * 255.255.255.0 U 0 0 0 eth0.2 10.10.10.1 * 255.255.255.255 UH 0 0 0 pptp -VPN 106.XXX.XXX.XXX 10.1.1.1 255.255.255.255 UGH 0 0 0 eth0.2 106.XXX.XXX.XXX 10.1.1.1 255.255.255.255 UGH 0 0 0 eth0.2 127.0.0.1 * 255.255.255.255 UH 0 0 0 pptp -VPN 192.168.199.0 * 255.255.255.0 U 0 0 0 br-lan 分 栏 解 释 :Destination 是 目 标 地 址,default 就 是 默 认 的 所 有 地 址 Gateway 是 网 关 我 解 释 过 了,Gen- Mask 是 掩 码, 其 实 我 也 解 释 过 了 Iface 是 对 应 的 接 口 名, 我 也 解 释 过 了 Metric,Ref 和 Use 在 很 多 内 核 中 都 不 使 用, 我 们 不 用 管 Flags 里 的 字 母 含 义 分 别 如 下 : 1. U, 表 示 这 个 路 由 活 着 (Up)

第 三 章 常 用 的 辅 助 工 具 27 2. H, 表 示 这 货 是 台 主 机 (Host), 在 网 络 中 主 机 和 路 由 是 不 同 的 3. G, 表 示 要 通 过 网 关 访 问 (Use Gateway) 上 面 这 个 例 子 中,10.1.1.1 是 我 路 由 接 入 的 默 认 网 关, 我 默 认 的 所 有 网 络 (default) 都 是 通 过 这 个 网 关 访 问 的, 这 个 网 关 对 应 的 接 口 是 eth0.2 而 192.168.199.0/24 是 我 路 由 后 面 分 配 出 来 的 内 网 网 络, 我 在 这 个 内 网 里 互 访 主 机 是 不 需 要 经 过 网 关 的, 所 以 这 里 没 有 G 当 然 我 们 主 要 的 目 的 不 是 查 看 路 由 表, 而 是 修 改 路 由 表 我 们 可 以 看 到 上 面 的 10.10.10.1 是 VPN 服 务 器 对 应 的 网 关, 我 们 到 VPN 服 务 器 的 网 络 是 通 畅 的,VPN 服 务 器 到 twitter 的 网 络 也 是 通 畅 的, 那 么 我 们 就 可 以 通 过 VPN 网 关 来 访 问 twitter 了 最 简 单 粗 暴 的 做 法 是 直 接 把 我 们 的 默 认 接 口 改 成 VPN 接 口, 这 样 我 们 所 有 的 网 络 请 求 都 会 通 过 VPN 接 口 进 行 了, 只 要 GFW 不 拦 截 我 们 到 VPN 的 通 路, 那 就 没 什 么 可 以 阻 拦 我 们 了 route add default dev pptp -VPN 这 里 的 pptp-vpn 要 根 据 实 际 情 况 来 确 定, 我 们 在 前 面 说 过 可 以 通 过 ifconfig 命 令 来 查 看 各 个 接 口 的 名 称, 但 我 们 也 可 以 通 过 一 些 脚 本 来 自 动 提 取 这 个 信 息, 这 个 可 以 用 后 面 提 到 的 SED 配 合 正 则 表 达 式 很 轻 松 的 实 现 如 果 我 们 不 需 要 让 所 有 网 络 都 走 VPN 了, 只 要 删 除 这 条 路 由 表 就 行 了, 命 令 很 简 单 只 要 把 add 改 成 del 就 行 了 route del default dev pptp -VPN 如 果 让 路 由 上 的 所 有 网 络 访 问 都 走 VPN, 其 实 和 我 们 直 接 在 本 机 挂 全 局 VPN 也 没 什 么 区 别, 唯 一 的 区 别 就 是 可 能 方 便 了 一 些 不 能 拨 VPN 的 设 备 使 用, 节 约 了 一 些 连 VPN 的 动 作 时 间 而 已 一 种 更 精 确 的 做 法, 是 指 针 对 被 GFW 屏 蔽 的 IP 走 VPN, 这 也 是 FreeRouter V1 的 做 法 例 如 我 们 假 定 twitter.com 的 IP 是 5.5.5.5, 只 需 要 执 行 如 下 命 令 即 可 : route add -host 5.5.5.5 dev pptp -VPN 这 个 -host 是 默 认 选 项, 不 写 也 可 以, 指 的 是 添 加 一 个 IP 作 为 目 标 地 址 有 的 时 候 一 些 网 站 有 很 多 个 IP, 但 一 般 都 是 处 于 同 一 个 网 段 内, 例 如 我 们 假 设 google 的 IP 范 围 是 6.6.6.1 6.6.6.6.254, 我 们 就 用 -net 选 项 表 示 添 加 一 个 网 段 作 为 目 标 地 址 : route add -net 6.6.6.6.0/24 dev pptp -VPN 具 体 的 掩 码 要 写 多 少 可 以 根 据 实 际 情 况 调 整, 但 很 多 时 候 我 们 不 知 道 确 切 的 范 围, 只 好 把 整 个 C 地 址 网 段 全 部 加 入 VPN 路 由 表 了 由 此 可 以 看 出,FreeRouter V1 一 个 很 大 的 问 题 就 是 IP 的 搜 集 非 常 困 难, 如 果 发 生 IP 变 动 的 话 更 是 难 上 加 难 多 加 了 关 系, 顶 多 是 多 消 耗 一 点 VPN 的 流 量 ; 如 果 漏 加 了 就 非 常 麻 烦 了, 对 于 dropbox 这 些 靠 客 户 端 形 式 工 作 的 东 西 来 说, 除 了 抓 包 都 没 有 直 观 的 方 式 可 以 获 取 服 务 器 的 IP 这 也 就 是 为 什 么 我 会 最 终 停 止 V1 的 更 新, 全 力 投 入 V2 的 维 护 的 主 要 原 因

第 三 章 常 用 的 辅 助 工 具 28 3.4 Dig 命 令 我 们 前 面 讲 了 如 何 用 traceroute 来 检 查 网 络 中 的 路 由 跳 跃 情 况, 现 在 来 讲 讲 如 何 用 Dig 命 令 检 查 域 名 的 解 析 情 况 在 windows 和 linux 系 统 中, 有 一 个 很 基 本 的 域 名 解 析 工 具 叫 nslookup, 但 相 对 而 言 dig 的 功 能 和 返 回 的 信 息 要 强 大 得 多 在 这 里 下 载 bind, 就 可 以 获 得 dig 工 具 了 你 们 看 一 下 Dig 的 Man Page 就 会 发 现 这 货 的 参 数 多 得 吓 人, 我 们 只 挑 一 些 可 能 常 用 的 讲 解 首 先 讲 一 下 Dig 命 令 的 基 本 使 用 格 式 : dig @DNSIP Domain QueryType 例 如 我 们 要 通 过 Google DNS 来 查 facebook.com 的 IPV6 地 址 (AAAA 记 录 ) 就 是 这 样 的 : dig @8.8.8.8 facebook.com AAAA 返 回 的 信 息 是 这 样 的 : root@openwrt:~# dig @8.8.8.8 facebook.com A ; <<>> DiG 9.9.4 <<>> @8.8.8.8 facebook.com A ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER <<- opcode:,query status:,noerror id: 702 ;; flags: qr rd ra; QUERY:,1 ANSWER:,1 AUTHORITY:,0 ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version:,0 flags:; udp: 512 ;; QUESTION SECTION: ;facebook.com. IN A ;; ANSWER SECTION: facebook.com. 723 IN A 173.252.110.27 ;; Query time: 74 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Mon Jul 28 15:56:07 CST 2014 ;; MSG SIZE rcvd: 57 所 有 以 分 号 ; 开 始 的 内 容 都 是 dig 命 令 对 获 取 到 的 原 始 返 回 信 息 的 注 释 部 分, 没 有 注 释 的 部 分 才 是 我 们 真 正 要 查 询 的 内 容 这 里 解 释 部 分 内 容 : status:noerror 这 是 DNS 返 回 的 信 息 中 Reply Code 部 分, 用 于 告 知 客 户 端,DNS 服 务 器 这 次 进 行 的 查 询 是 否 成 功 还 是 有 错 误 发 生

第 三 章 常 用 的 辅 助 工 具 29 id:702 这 个 就 是 DNS 查 询 和 返 回 信 息 中 的 Transaction ID, 因 为 UDP 协 议 不 是 按 顺 序 到 达 的, 所 以 这 个 ID 用 于 把 查 询 和 返 回 信 息 配 对 flags:qr rd ra 这 个 是 DNS 返 回 信 息 中 的 Flag 部 分,QR 表 示 这 是 一 个 返 回 响 应 包 ( 对 应 查 询 包 ),rd 表 示 客 户 端 请 求 进 行 递 归 查 询,ra 表 示 服 务 器 支 持 递 归 查 询 QUERY:1 表 示 收 到 一 个 查 询 ANSWER: 表 示 回 应 了 一 个 答 复 AUTHORITY:0 表 示 没 有 从 域 名 的 权 威 名 称 服 务 器 查 询 数 据, 可 能 因 为 DNS 缓 存 中 已 经 有 这 个 记 录 了, 就 不 需 要 查 询 了 ADDITIONAL:1 表 示 有 一 条 额 外 的 信 息, 一 般 是 域 名 的 权 威 名 称 服 务 器 的 地 址 中 间 就 是 查 询 的 内 容 和 回 复 的 内 容 了, 应 该 很 好 理 解 最 后 是 整 个 查 询 过 程 的 耗 时, 以 及 原 始 信 息 有 多 少 个 字 节 除 了 这 种 基 本 的 查 询,dig 有 很 多 选 项 可 以 用, 常 用 的 有 : +short 表 示 不 显 示 所 有 注 释 部 分 的 代 码, 只 显 示 要 查 询 的 数 据, 这 个 选 项 可 以 用 在 脚 本 里 给 其 他 命 令 提 供 域 名 的 IP +vc 表 示 用 TCP 方 式 查 询, 而 不 是 用 UDP 方 式,TCP 模 式 查 询 受 到 GFW 劫 持 的 影 响 非 常 小 ( 不 是 没 有, 只 是 范 围 很 小 ) +dnssec 表 示 查 询 域 名 的 DNSSEC 签 名 信 息, 关 于 DNSSEC 会 在 后 面 讲 解 +trace 表 示 禁 止 服 务 器 用 递 归 方 式 查 询, 一 般 来 说 就 是 让 DNS 返 回 根 域 服 务 器 的 地 址, 然 后 客 户 端 自 己 去 做 迭 代 查 询, 后 面 的 查 询 和 DNS 服 务 器 不 再 有 关 系, 只 取 决 于 客 户 端 和 各 级 名 称 服 务 器 之 间 的 网 络 关 于 dig +trace 可 能 是 我 们 实 际 调 试 中 用 到 最 多 的 命 令 了, 关 于 这 个 命 令 的 一 些 使 用 实 例, 可 以 参 考 本 站 文 章 : 重 新 理 解 GFW 的 DNS 污 染 和 劫 持 策 略 3.5 正 则,SED,AWK 正 则 表 达 式 是 一 件 屠 龙 神 器, 但 是 要 把 它 讲 好 非 常 困 难, 我 的 建 议 是 阅 读 这 篇 正 则 表 达 式 30 分 钟 入 门, 这 是 我 目 前 见 过 最 好 的 正 则 表 达 式 入 门 的 文 章 了 我 只 讲 一 个 SED 配 合 正 则 表 达 式 使 用 的 例 子, 让

第 三 章 常 用 的 辅 助 工 具 30 你 们 有 一 点 基 本 的 概 念, 因 为 如 果 你 完 全 不 了 解 正 则 表 达 式, 这 几 个 命 令 在 你 看 起 来 可 能 会 跟 天 书 一 样 难 懂 我 写 过 一 篇 文 章 讲 的 是 如 何 从 greatfire.org 网 站 上 抓 取 在 中 国 被 屏 蔽 率 超 过 70% 的 网 站 域 名, 然 后 生 成 用 于 FreeRouter V2 的 配 置 文 件, 这 个 脚 本 的 代 码 如 下 : set -x Output="./greatfire.conf" if [ -f $Output ] then rm $Output fi Threshold=70 for i in 0 1 2 3 4 5 6 7 8 9 do curl -s --insecure "https://zh.greatfire.org/search/alexa -top -1000- domains?page=$i" \ grep 'class="first"' grep 'class="blocked"' grep -ve "google" \ sed -e "s#^[^\/]*\/\([^\"]*\)[^\%]*\%...\([^\%]*\)\%.*#\1 \2#g" \ awk '$2>='"$Threshold"' {print "ipset=/"$1"/vpn" }'\ >>$Output done 看 不 懂 没 关 系, 一 行 行 解 释 : 1. set -x 表 示 打 开 调 试, 方 便 查 看 脚 本 运 行 信 息 2. 刚 开 始 是 清 理 掉 之 前 的 输 出 文 件 3. Threshold=70 是 一 个 表 示 屏 蔽 率 的 变 量, 我 们 说 了 是 70% 4. curl -s insecure... 是 用 curl 下 载 一 个 网 页,-s 表 示 静 默 模 式 工 作, insecure 是 因 为 这 是 个 https 网 页, 因 为 一 些 证 书 的 问 题 我 用 这 个 选 项 绕 过 去 5. 最 后 面 的 $i 表 示 上 面 从 1 到 9 的 数 字, 因 为 要 抓 很 多 个 页 面 6. 另 外 提 一 下,openwrt 的 shell 是 ash, 非 常 精 简 也 很 简 陋, 连 for 循 环 都 只 能 这 样 一 个 个 的 写 那 个 网 页 中, 关 于 被 屏 蔽 的 网 站 部 分 的 源 码 是 这 样 的 : tr class="odd"><td class="first"><a href="/facebook.com">facebook.com </a></td><td 月 >2 2011</td><td class="blocked" style="background -size: 100%;" >100%</td><td class="tags"><a href="/search/ blocked" class="tag">blocked </a, > 继 续 解 释 :

第 三 章 常 用 的 辅 助 工 具 31 1. grep class=first grep class= blocked 是 表 示 把 网 页 众 多 行 的 源 码 中, 包 含 这 两 个 字 符 串 的 行 提 取 出 来, 2. grep -ve google 是 表 示 把 包 含 google 这 个 字 符 串 的 行 剔 除 掉 ( 因 为 Google 太 多 子 域 名 了, 我 觉 得 没 必 要 全 部 提 取 ) sed -e "s#^[^\/]*\/\([^\"]*\)[^\%]*\%...\([^\%]*\)\%.*#\1 \2#g" \ 1. SED 是 基 于 一 行 一 行 输 入 的 流 编 辑 工 具,-e 是 为 了 使 用 多 个 命 令, 其 实 这 里 没 必 要. 2. 后 面 的 s# 一 大 堆 东 西 # 又 是 一 大 堆 #g 是 VIM 用 户 很 熟 悉 的 查 找 替 换 命 令, 我 们 的 目 的 是 把 域 名 和 屏 蔽 率 提 取 出 来. 3. 表 示 一 个 字 符 串 的 开 始, 然 后 中 间 通 过 一 次 次 的 反 斜 线 逐 步 往 后 定 位. 4. 用 括 号 括 起 来 的 部 分, 就 是 一 个 分 组, 这 里 的 分 组 1 就 是 域 名, 分 组 2 就 是 被 屏 蔽 率 awk '$2>='"$Threshold"' {print "ipset=/"$1"/vpn" }'\ 1. 你 可 以 认 为 awk 是 一 个 类 似 excel 的 工 具, 他 可 以 把 输 入 的 数 据 按 列 进 行 处 理 2. $2 就 是 分 组 2, 也 就 是 被 屏 蔽 率, 我 们 和 设 定 的 70 去 比 较, 就 是 说 如 果 屏 蔽 率 大 于 70% 就 进 行 后 面 的 操 作 3. 如 果 被 屏 蔽 率 大 于 70%, 就 在 $1, 也 就 是 域 前 后 分 别 添 加 一 些 别 的 字 符, 最 终 组 成 我 们 要 的 配 置 文 件 说 到 底 我 还 是 没 怎 么 讲 清 正 则 表 达 式 的 理 解, 其 实 每 次 写 正 则 表 达 式 都 很 头 痛 要 调 半 天, 你 们 还 是 自 己 去 上 面 提 到 的 那 个 链 接 里 字 自 己 好 好 学 学 吧. 其 实 FreeRouter2 项 目 本 身 并 不 依 赖 这 些 工 具, 只 是 一 些 辅 助 脚 本 用 到 了, 不 过 我 说 了 要 尽 量 让 每 一 个 细 节 都 被 你 们 理 解, 所 以 至 少 要 在 这 里 把 用 到 的 工 具 和 相 关 的 教 程 交 给 你 们.

第 四 章 FreeRouter V2 的 技 术 原 理 你 在 干 什 么, 没 有 人 可 以 阻 止 他 们 我 就 是 没 有 人! 如 果 你 觉 得 前 面 的 几 个 命 令 要 么 你 早 就 会 了, 要 么 你 用 不 上, 那 么 从 这 节 开 始 的 内 容 你 必 须 一 个 字 一 个 字 仔 细 的 去 看, 因 为 这 章 的 前 三 节 是 FreeRouterV2 用 到 的 关 键 技 术 所 在, 如 果 你 不 理 解 ip 命 令 如 何 工 作, 不 理 解 iptables 是 怎 么 工 作, 不 理 解 Dnsmasq 是 怎 么 工 作 的, 你 根 本 就 无 法 理 解 FreeRouter V2 是 怎 么 工 作 的 4.1 IP 命 令 除 了 前 面 提 到 的 route 命 令 之 外, 我 们 其 实 还 有 一 个 更 强 大 的 用 于 维 护 路 由 表 的 工 具, 就 是 ip 命 令, 它 的 说 明 请 参 考 man page IP 命 令 的 功 能 太 过 强 大, 我 们 只 讲 我 们 后 面 会 用 到 的 几 种 情 况 4.1.1 table 概 念 首 先 我 们 这 里 要 先 建 立 一 个 table 概 念, 你 可 以 认 为 table 是 一 个 网 络 访 问 请 求 ( 数 据 流 ) 的 容 器 一 般 情 况 下, 我 们 可 以 把 符 合 一 定 特 征 的 网 络 访 问 请 求 ( 数 据 流 ) 都 收 集 到 一 个 table 中, 这 样 当 我 们 需 要 对 有 这 一 类 特 征 的 网 络 访 问 请 求 进 行 处 理 时, 就 可 以 直 接 操 作 这 个 table 了, 而 不 需 要 一 条 一 条 的 去 处 理 在 linux 操 作 系 统 中,table 就 是 一 个 0 到 255 的 数 字, 当 然 我 们 也 可 以 在 /etc/iproute2/rt_tables 文 件 中 给 table 数 字 对 应 上 一 个 名 称, 然 后 就 可 以 用 这 个 名 称 来 操 作 这 个 table 了 例 如 我 们 的 OpenWRT 系 统 里 的 rt_tables 文 件 默 认 是 这 样 的 : # # reserved values # 255 local 254 main 253 default 32

第 四 章 FREEROUTER V2 的 技 术 原 理 33 0 unspec # # local # #1 inr.ruhep local,main,default,unspec 这 些 都 是 系 统 内 建 的 ip table, 可 以 看 到 他 们 分 别 都 对 应 了 一 个 数 字, 你 操 作 table 254 和 操 作 table main 其 实 是 完 全 一 样 的 我 们 也 可 以 修 改 这 个 文 件, 建 立 一 个 自 己 的 table, 例 如 我 们 可 以 建 立 一 个 ID 为 10, 名 字 叫 vpn 的 table 如 果 我 们 想 要 在 访 问 被 封 锁 网 站 的 时 候 通 过 VPN 接 口 出 去, 那 我 们 就 可 以 先 对 这 些 数 据 打 上 标 签 4.2.2, 然 后 用 ip rule 命 令 把 有 这 些 标 签 的 数 据 全 部 加 入 一 个 table 4.1.2 把 数 据 添 加 到 table 假 定 我 们 现 在 已 经 把 要 访 问 全 部 被 封 锁 网 站 的 数 据 打 上 了 标 签 1(fwmark 1), 我 们 又 已 经 建 立 了 一 个 名 叫 vpn 的 table, 那 么 命 令 就 可 以 这 样 写 : ip rule add fwmark 1 priority 1984 table vpn 先 阅 读 一 下 man page 上 对 这 个 命 令 的 注 释 : ip rule [ list add del flush ] SELECTOR ACTION SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ] [ dev STRING ] [ pref NUMBER ] ACTION := [ table TABLE_ID ] [ nat ADDRESS ] [ prohibit reject unreachable ] [ realms [SRCREALM/] DSTREALM ] TABLE_ID := [ local main default NUMBER ] 说 明 如 下 : 1. ip rule add 表 示 添 加 一 条 规 则 2. fwmark 1 表 示 符 合 fwmark( 标 签 ) 值 等 于 1 的 数 据 3. priority 1984, 表 示 这 条 规 则 的 优 先 级 是 1984, 每 条 命 令 必 须 有 独 立 的 优 先 级 优 先 级 从 0 到 32767, 数 字 越 小 优 先 级 越 高, 但 0 32766 32767 一 般 都 是 已 经 分 配 的, 所 以 你 要 在 这 几 个 数 中 间 选 一 个 数 作 为 优 先 级 4. table vpn 表 示 把 这 些 数 据 全 部 添 加 到 vpn 这 个 table 里 去

第 四 章 FREEROUTER V2 的 技 术 原 理 34 如 果 想 检 查 已 有 的 ip rule, 可 以 用 以 下 的 命 令 : ip rule list 一 般 情 况 下 你 会 看 到 如 下 的 回 显 : 0: from all lookup local 1984: from all fwmark 0x1 lookup vpn 32766: from all lookup main 32767: from all lookup default 4.1.3 让 table 数 据 走 VPN 接 口 现 在 我 们 已 经 有 了 一 个 table 了, 如 何 让 这 个 table 走 VPN 接 口 呢? 先 阅 读 一 下 man page 上 的 说 明 : ip route { add del change append replace monitor } ROUTE SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ] [ table TABLE_ID ] [ proto RTPROTO ] [ type TYPE ] [ scope SCOPE ] ROUTE := NODE_SPEC [ INFO_SPEC ] NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ] [ table TABLE_ID ] [ proto RTPROTO ] [ scope SCOPE ] [ metric METRIC ] INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]... NH := [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ rtt TIME ] [ rttvar TIME ] [ window NUMBER ] [ cwnd NUMBER ] [ initcwnd NUMBER ] [ ssthresh REALM ] [ realms REALM ] [ rto_min TIME ] [ initrwnd NUMBER ] TYPE := [ unicast local broadcast multicast throw unreachable prohibit blackhole nat ] TABLE_ID := [ local main default all NUMBER ] SCOPE := [ host link global NUMBER ] FLAGS := [ equalize ] NHFLAGS := [ onlink pervasive ] RTPROTO := [ kernel boot static NUMBER ] 很 复 杂? 那 我 们 看 看 实 际 用 到 的 命 令 :

第 四 章 FREEROUTER V2 的 技 术 原 理 35 ip route add default dev pptp -VPN table vpn 是 不 是 瞬 间 觉 得 很 亲 切 了?ip route 和 前 面 的 route 命 令 几 乎 是 一 样 的, 只 不 过 后 面 多 了 一 个 table vpn, 表 示 添 加 默 认 接 口 这 个 动 作 只 是 用 于 table vpn 里 的 数 据 的, 这 个 灵 活 性 就 是 route 命 令 所 没 有 的 了 注 意! 这 里 的 pptp-vpn 也 是 要 根 据 你 系 统 实 际 VPN 接 口 的 名 称 修 改 的 我 们 这 里 没 有 指 定 网 关 IP( 例 如 via 10.10.10.10.1 ) 之 类 的, 因 为 一 般 一 个 接 口 连 接 上 之 后, 如 果 网 关 支 持 DHCP, 那 么 在 分 配 IP 的 时 候 也 就 会 把 默 认 网 关 通 告 给 客 户 端, 不 需 要 我 们 去 额 外 指 定 除 非 你 的 VPN 不 支 持 DHCP, 但 这 这 种 VPN 我 还 没 见 过 如 果 你 想 确 认 某 个 table 是 不 是 走 了 VPN 接 口 还 是 别 的 接 口, 可 以 用 如 下 命 令 : ip route show table vpn 如 果 确 实 添 加 默 认 接 口 成 功 了, 你 应 该 看 到 default dev pptp -VPN scope link 其 实 这 个 添 加 默 认 接 口 的 命 令 是 应 该 早 于 你 往 这 个 table 添 加 数 据 的, 以 免 数 据 进 来 了 却 不 知 道 要 从 哪 里 走, 所 以 完 整 的 顺 序 是 : 1. 修 改 /etc/iprout2/rt_tables 建 立 一 个 table 2. 给 这 个 table 指 定 一 个 默 认 的 网 络 接 口 3. 给 指 定 的 数 据 打 上 标 签 4. 把 打 上 了 标 签 的 数 据 添 加 到 这 个 table 里 去 1 2 4 我 们 都 知 道 怎 么 做 了, 那 么 如 何 给 指 定 的 数 据 打 上 标 签 呢? 这 就 用 到 了 iptables 防 火 墙 了 4.2 IPTables 防 火 墙 后 记 : 从 2015 年 年 初 开 始,GFW 用 于 DNS 污 染 的 IP 已 经 达 到 几 千 个, 有 些 甚 至 还 是 正 常 运 营 的 网 站 的 IP 这 使 得 我 们 本 来 的, 依 靠 linux 防 火 墙 过 滤 有 限 投 毒 IP 的 策 略 彻 底 失 效, 除 非 你 愿 意 去 维 护 一 个 几 千 IP 的 防 火 墙 规 则, 而 且 没 有 证 据 可 以 证 明 这 些 IP 的 产 生 不 是 随 机 的 所 以, 以 下 章 节 已 经 没 有 实 用 意 义, 但 出 于 学 习 的 话 依 然 可 以 看 看 netfilter 是 linux 内 核 的 一 个 模 块, 这 个 模 块 当 于 linux 系 统 的 防 火 墙, 它 会 对 所 有 进 出 linux 系 统 的 网 路 数 据 进 行 管 理,netfilter 防 火 墙 模 块 的 结 构 如 下 图 所 示 :

第 四 章 FREEROUTER V2 的 技 术 原 理 36 图 4.1: netfilter 防 火 墙 结 构 1 我 们 可 以 看 到 棕 色 框 框 住 的 部 分 就 是 iptables 的 几 个 链, 分 别 是 PREROUTING INPUT FORWARD OUTPUT POSTROUTING, 大 致 讲 一 下 这 几 个 链 的 工 作 流 程 当 一 个 数 据 通 过 网 络 接 口 进 入 系 统 之 后, 首 先 进 入 PREROUTING 链 进 行 处 理 PREROUTING 链 中 根 据 对 数 据 的 不 同 处 理, 分 别 把 处 理 方 法 写 在 mangle 表 和 nat 表 中,mangle 表 一 般 用 于 对 数 据 添 加 标 签 方 便 后 面 的 链 处 理,nat 表 一 般 是 进 行 网 络 地 址 转 换 和 转 发 的 动 作 2 在 经 过 两 道 PREROUTING 链 处 理 之 后, 数 据 会 根 据 需 求 分 别 交 给 INPUT 和 FORWARD 链 处 理 INPUT 链 再 经 过 打 标 签, 过 滤 等 动 作 后, 再 把 数 据 交 给 上 层 应 用 的 协 议 栈 去 处 理 例 如 我 们 可 以 在 INPUT 链 末 端 把 数 据 交 给 我 们 写 的 一 个 应 用, 在 应 用 中 分 析 和 提 取 数 据, 当 应 用 处 理 过 数 据 之 后, 就 要 把 数 据 返 还 到 OUTPUT 链,OUTPUT 链 再 经 过 一 次 NAT 表 看 是 否 要 转 址 ( 只 是 要 经 过, 不 一 定 真 的 会 发 生 转 址 操 作 ), 然 后 交 给 POSTROUTING 链 FORWARD 链 一 般 只 是 经 过 filter 表 的 过 滤 筛 选 就 会 把 数 据 交 给 POSTROUTING 链, 从 OUTPUT 链 过 来 的 数 据 和 从 FORWARD 链 过 来 的 数 据 经 过 POSTROUTING 链 处 理 后 就 交 给 了 后 面 的 输 出 设 备 了 netfilter 是 linux 内 核 模 块 的 名 称, 可 是 用 户 要 如 何 操 作 这 个 模 块, 给 防 火 墙 添 加 和 修 改 规 则 呢? 这 里 用 到 的 就 是 iptables,netfilter 才 是 防 火 墙 的 实 体,iptables 是 这 个 实 体 的 管 理 工 具 因 为 二 者 的 结 合 非 常 紧 密, 所 以 我 们 一 般 都 习 惯 性 的 称 之 为 iptables 防 火 墙 完 整 的 iptables 命 令 说 明, 请 参 考 iptables 的 man page 和 extention man page 关 于 netfilter 各 个 扩 展 模 块 的 功 能 说 明, 可 以 参 考 openwrt 网 站 上 的 这 个 页 面 4.2.1 IPSET 概 念 在 讲 iptables 的 功 能 之 前, 我 们 先 引 入 一 个 额 外 的 概 念 :ipset 1 如 果 不 是 棕 色 也 很 正 常, 我 是 色 盲 2 NAT,Network Address Translate, 其 实 是 个 很 重 要 的 概 念, 只 是 和 我 们 的 主 题 关 系 不 大 所 以 我 没 提

第 四 章 FREEROUTER V2 的 技 术 原 理 37 ipset 和 前 面 讲 的 table 有 点 像, 但 更 好 理 解, 它 就 是 一 个 存 储 了 IP 值 的 数 组, 一 般 以 内 存 变 量 的 形 式 驻 留 在 系 统 内 存 中, 一 重 启 就 会 消 失 要 建 立 一 个 ipset, 我 们 可 以 ipset 的 create 命 令 : ipset create vpn iphash -exist 这 里 表 示 建 立 一 个 名 叫 VPN 的 iphash 类 型 的 ipset,iphash 类 型 的 IPSET 可 以 存 储 65535 个 IP 地 址,-exist 表 示 如 果 这 个 叫 这 个 名 字 的 ipset 已 经 存 在 了, 就 跳 过 不 建 立 了 如 果 要 把 一 个 IP( 例 如 8.8.8.8) 加 入 一 个 IPSET( 例 如 刚 刚 建 立 的 vpn set), 那 就 是 : ipset add vpn 8.8.8.8 如 果 要 删 除, 把 add 改 成 del 就 行 了 ipset del vpn 8.8.8.8 如 果 我 们 要 清 空 整 个 ipset, 就 用 flush 选 项 : ipset flush vpn 如 果 我 们 要 测 试 一 个 IP( 还 是 8.8.8.8) 在 不 在 IPSET( 还 是 vpn set) 里, 就 用 TEST 选 项 : ipset test vpn 8.8.8.8 4.2.2 iptables 的 mark 功 能 我 们 前 面 说 了, 要 把 访 问 被 封 锁 网 站 数 据 加 入 一 个 table 让 它 走 VPN 接 口, 首 先 就 要 对 数 据 打 上 标 签, 那 么 如 何 用 iptables 给 数 据 打 上 标 签 呢? 我 们 得 先 把 所 有 被 封 锁 网 站 的 IP 加 入 一 个 IPSET, 然 后 我 们 再 用 iptables 的 一 个 名 叫 set 的 模 块 来 对 这 个 IPSET 进 行 打 标 签 的 操 作 下 面 是 man page 上 对 这 个 模 块 的 说 明 : set This module matches IP sets which can be defined by ipset(8). [!] --match -set setname flag[,flag]... where flags are the comma separated list of src and/or dst specifications and there can be no more than six of them. Hence the command iptables -A FORWARD -m set --match -set test src,dst will match packets, for which (if the set type is ipportmap) the source address and destination port pair can be found in the specified set. If the set type of the specified set is single dimension (for example ipmap), then the command will match packets for which the source address can be found in the specified set.

第 四 章 FREEROUTER V2 的 技 术 原 理 38 我 们 实 际 的 命 令 是 : iptables -t mangle -I PREROUTING -m set --match -set vpn dst -j MARK --set-mark 1 解 释 说 明 : 1. iptables -t mangle 默 认 情 况 下 iptables 是 对 filter 表 操 作 的, 如 果 要 指 定 某 个 表, 就 要 用 -t 选 项 -t mangle 表 示 我 们 操 作 mangle 表, 为 什 么 是 mangle 表? 因 为 PREROUTING 链 是 存 放 在 mangle 表 里 的, 默 认 的 filter 表 里 没 有 PREROUTING 链, 那 为 什 么 是 PREROUTING 链 呢? 往 下 看 2. -I,I 表 示 insert, 也 就 是 插 入 一 条 规 则 3. PREROUTING 不 管 是 从 外 部 网 线 输 入 的 数 据, 还 是 从 我 们 从 电 脑 上 发 出 的 数 据, 对 于 路 由 来 说 都 是 输 入 的 数 据, 这 里 的 进 和 出 是 从 路 由 的 角 度 来 看 的, 原 始 数 据 进 来, 处 理 过 的 数 据 输 出, 和 你 是 上 传 还 是 下 载 无 关 我 们 也 知 道 PREROUTING 链 是 整 个 防 火 墙 链 的 最 前 端, 如 果 我 们 要 从 源 头 上 处 理 数 据, 就 需 要 对 这 个 链 动 手 4. -m set 表 示 调 用 set 模 块, 所 有 调 用 模 块 的 格 式 都 是 -m 模 块 名 5. match-set vpn dst, 表 示 匹 配 一 个 名 叫 vpn 的 ipset,dst 表 示 这 是 目 标 地 址, 因 为 我 们 要 访 问 的 那 些 被 封 锁 的 服 务 器 对 路 由 来 说 只 可 能 是 目 的 地 而 不 是 源 头 (src),src 是 我 们 自 己 6. -j MARK,-j 是 一 个 通 用 选 项, 表 示 把 数 据 交 给 后 面 的 动 作 进 行 处 理, 也 就 是 MARK 7. set-mark 1, 这 是 iptables 的 一 个 叫 CONNMARK 的 extension 提 供 的 功 能, 就 是 给 数 据 打 上 标 签 了 iptables 的 规 则 插 入 是 有 顺 序 的, 如 果 在 -I 后 面 指 定 一 个 规 则 号, 就 表 示 在 这 个 规 则 号 前 面 插 入 一 条 规 则, 如 果 不 指 定 规 则 号, 就 表 示 在 所 有 规 则 的 最 前 面 插 入 一 条 规 则 而 iptables 规 则, 是 从 最 前 面 的 规 则 开 始 一 个 个 尝 试 的, 如 果 一 个 数 据 和 前 面 的 某 条 规 则 匹 配 上 了, 后 面 的 规 则 就 对 他 无 效 了, 所 以 你 最 后 插 入 的 规 则 其 实 是 优 先 级 最 高 的 规 则 如 果 你 要 加 入 一 条 优 先 级 不 是 那 么 高 的 规 则, 可 以 用 -A,Append, 表 示 在 特 定 或 所 有 规 则 后 面 加 入 这 条 规 则 所 以 插 入 规 则 的 命 令 格 式 是 3 : iptables -t 表 名 -I 链 名 \ 规 则 号 \ 规 则 令 : 在 用 iptables 添 加 了 规 则 之 后, 如 果 想 看 看 这 些 规 则 是 否 添 加 成 功, 以 及 他 们 的 顺 序, 可 以 用 这 个 命 iptables -t 表 名 -L 链 名 3 命 令 中 的 反 斜 线 是 不 需 要 的, 因 为 latex 中 的 lstlisting 原 生 就 不 支 持 中 文, 无 法 正 确 显 示 空 格 我 才 加 入 的, 如 果 你 知 道 怎 么 解 决 这 个 问 题 请 告 诉 我, 不 胜 感 激

第 四 章 FREEROUTER V2 的 技 术 原 理 39 如 果 要 删 除 一 条 规 则, 就 用 -D 选 项, 后 面 可 以 跟 规 则 号 表 示 删 除 指 定 规 则 号, 如 果 不 跟 规 则 号, 则 从 最 上 面 ( 最 优 先 ) 的 0 号 规 则 开 始 删 除 iptables -t 表 名 -D 链 名 \ 规 则 号 如 果 你 的 自 定 义 规 则 已 经 太 多 太 乱, 你 想 把 整 个 链 里 的 规 则 都 清 空, 就 用 -F,flush 选 项 iptables -t 表 名 -F 链 名 所 以 现 在 我 们 已 经 知 道 了 可 以 让 一 个 table 里 的 数 据 走 VPN 接 口, 也 知 道 了 如 何 把 打 标 签 的 数 据 加 入 一 个 table, 也 知 道 了 如 何 把 一 个 IPSET 的 数 据 都 打 上 标 签, 那 么, 如 何 把 被 封 锁 网 站 的 IP 加 入 一 个 IPSET 呢? 这 里 我 们 还 是 先 把 IPTABLES 的 其 他 功 能 讲 完 吧, 等 到 下 一 节 我 们 再 处 理 这 个 问 题 4.2.3 iptables 的 m32 模 块 我 们 在 前 面 2.1 提 到 了 GFW 对 DNS 劫 持 和 污 染 的 根 源 是 在 向 境 外 DNS 发 起 解 析 请 求 时, 抢 先 返 回 虚 假 的 IP 信 息 给 解 析 器 根 据 观 察 分 析,GFW 伪 造 的 虚 假 信 息 格 式 是 非 常 固 定 的, 甚 至 可 以 说 是 非 常 便 于 识 别 和 拦 截 的 我 们 只 要 利 用 iptables 的 过 滤 规 则, 就 可 以 很 轻 松 的 丢 弃 这 些 污 染 信 息 我 们 在 前 面 也 说 了, 境 外 DNS 的 正 确 信 息 不 是 不 会 返 回, 只 是 被 GFW 的 虚 假 信 息 抢 先 占 了 位 置 导 致 不 被 解 析 器 接 受 而 已, 而 防 火 墙 是 一 个 在 解 析 器 之 前 的 关 卡, 只 要 在 这 里 丢 弃 了 污 染 信 息, 那 么 境 外 DNS 返 回 的 正 确 信 息 就 可 以 作 为 第 一 个 到 达 的 信 息 顺 利 被 解 析 器 接 受 了 工 欲 善 其 事, 必 先 利 其 器, 我 们 要 想 过 滤 GFW 的 劫 持 信 息, 就 要 先 了 解 这 个 数 据 的 格 式 在 网 络 数 据 抓 取 上, 业 界 公 认 的 神 器 莫 过 于 WireShark 了, 启 动 wireshare 之 后 选 择 网 卡, 在 过 滤 项 中 写 port 53, 表 示 我 们 只 查 看 数 据 信 息 中 包 含 53 端 口 的 信 息 为 什 么 是 53 端 口? 因 为 DNS 服 务 器 的 查 询 端 口 是 53, 然 后 我 们 通 过 Dig 命 令, 指 定 使 用 8.8.8.8 去 查 询 twitter.com 的 A 记 录 可 以 看 到 如 下 的 查 询 和 返 回 信 息 : 图 4.2: 虚 假 信 息 和 正 确 信 息 混 杂 可 以 看 到,GFW 凭 借 自 己 的 位 置 优 势 ( 离 我 们 近 ) 抢 先 返 回 了 两 个 虚 假 的 IP 地 址 给 我 们, 但 后 面 Google DNS 的 正 确 信 息 也 返 回 了, 只 是 没 有 被 解 析 器 接 受, 我 们 要 干 掉 的 就 是 前 面 两 条 错 误 信 息 观 察 多 次 之 后 我 们 发 现 这 种 信 息 的 格 式 是 完 全 一 样 的, 区 别 仅 仅 是 IP 地 址 会 在 一 个 数 组 范 围 内 变 化 : 可 以 看 到 GFW 伪 造 的 这 个 虚 假 信 息 非 常 粗 糙, 一 般 DNS 都 会 返 回 一 些 Additional 信 息, 例 如 告 诉 你 这 个 域 名 的

第 四 章 FREEROUTER V2 的 技 术 原 理 40 图 4.3: 污 染 信 息 实 例 权 威 名 称 服 务 器 地 址 之 类 的 GFW 的 目 的 就 是 污 染, 只 要 把 错 误 IP 传 达 给 你 就 完 了, 所 以 他 整 个 消 息 包 在 虚 假 IP 之 后 就 没 了, 还 真 是 精 打 细 算 节 约 流 量 呢 我 目 前 搜 集 和 统 计 到 的 GFW 用 于 DNS 劫 持 的 污 染 IP 有 48 个, 如 下 表 所 示 118.5.49.6 128.121.126.139 159.106.121.75 169.132.13.103 188.5.4.96 189.163.17.5 192.67.198.6 197.4.4.12 202.106.1.2 202.181.7.85 203.161.230.171 203.98.7.65 207.12.88.98 208.56.31.43 209.145.54.50 209.220.30.174 209.36.73.33 209.85.229.138 211.94.66.147 213.169.251.35

第 四 章 FREEROUTER V2 的 技 术 原 理 41 216.221.188.182 216.234.179.13 23.89.5.60 243.185.187.39 249.129.46.48 253.157.14.165 37.61.54.158 4.36.66.178 46.82.174.68 49.2.123.56 54.76.135.1 59.24.3.173 64.33.88.161 64.33.99.47 64.66.163.251 65.104.202.252 65.160.219.113 66.45.252.237 72.14.205.104 72.14.205.99 74.125.127.102 74.125.155.102 74.125.39.102 74.125.39.113 77.4.7.92 78.16.49.15 8.7.198.45 93.46.8.89 转 换 成 16 进 制 就 是 : 042442B2 0807C62D 1759053C 253D369E 2E52AE44 31027B38 364C8701 3B1803AD 402158A1 4021632F 4042A3FB 4168CAFC 41A0DB71 422DFCED 480ECD63 480ECD68 4A7D2766 4A7D2771 4A7D7F66

第 四 章 FREEROUTER V2 的 技 术 原 理 42 4A7D9B66 4D04075C 4E10310F 5D2E0859 76053106 80797E8B 9F6A794B A9840D67 BC050460 BDA31105 C043C606 C504040C CA6A0102 CAB50755 CB620741 CBA1E6AB CF0C5862 D0381F2B D1244921 D155E58A D1913632 D1DC1EAE D35E4293 D5A9FB23 D8DDBCB6 D8EAB30D F3B9BB27 F9812E30 FD9D0EA5 我 不 一 定 会 及 时 更 新 本 文 档, 最 新 的 数 据 我 会 发 布 到 FreeRouter V2 项 目 本 身 和 这 篇 文 章 里 为 什 么 这 里 要 把 IP 地 址 转 换 成 16 进 制 呢? 因 为 你 知 道 整 个 计 算 机 是 基 于 2 进 制 的, 从 上 面 的 抓 包 你 也 可 以 看 到 实 际 的 IP 地 址 都 是 16 进 制 的, 我 们 过 滤 这 些 地 址 要 用 的 iptables 的 u32 模 块 也 只 认 识 16 进 制 的 数 字 u32 模 块 是 iptables 的 一 个 扩 展 包, 他 允 许 你 从 一 个 IP 数 据 包 中 抓 取 4 个 字 节 (32 比 特 ) 的 数 据, 然 后 对 这 个 4 个 字 节 的 数 据 进 行 数 值 分 析, 在 符 合 条 件 之 后 交 给 iptables 进 行 各 种 处 理 而 IP 地 址 刚 好 就 是 4 个 字 节, 那 么 我 们 只 需 要 在 DNS 返 回 信 息 的 IP 包 中 提 取 出 IP 地 址 信 息, 然 后 和 上 面 的 这 个 列 表 对 比, 如 果 发 现 匹 配 就 丢 弃 这 个 数 据 就 可 以 了 我 们 用 到 的 完 整 命 令 如 下 : iptables -t mangle -I PREROUTING -p udp --sport 53 -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0 xffff@16=0x4a7d7f66,0x4a7d9b66,0x4a7d2766,0x4a7d2771,0xbda31105,0xd155e58a,0xf9812e30,0x80797e8b,0 x9f6a794b,0xa9840d67" -j DROP iptables -t mangle -I PREROUTING -p udp --sport 53 -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0 xffff@16=0xc043c606,0xca6a0102,0xcab50755,0xcba1e6ab,0xcb620741,0xcf0c5862,0xd0381f2b,0xd1913632,0 xd1dc1eae,0xd1244921" -j DROP

第 四 章 FREEROUTER V2 的 技 术 原 理 43 iptables -t mangle -I PREROUTING -p udp --sport 53 -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0 xffff@16=0xd35e4293,0xd5a9fb23,0xd8ddbcb6,0xd8eab30d,0xf3b9bb27,0x253d369e,0x042442b2,0x2e52ae44,0 x3b1803ad,0x402158a1" -j DROP iptables -t mangle -I PREROUTING -p udp --sport 53 -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0 xffff@16=0x4021632f,0x4042a3fb,0x4168cafc,0x41a0db71,0x422dfced,0x480ecd68,0x480ecd63,0x4e10310f,0 x0807c62d,0x5d2e0859" -j DROP iptables -t mangle -I PREROUTING -p udp --sport 53 -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0 xffff@16=0xfd9d0ea5,0x364c8701,0x1759053c,0x31027b38,0x4d04075c,0xc504040c,0x76053106,0xbc050460" -j DROP 命 令 有 5 条 是 因 为 u32 模 块 一 次 最 多 允 许 我 们 匹 配 10 个 数 据, 具 体 格 式 的 分 析 我 们 只 需 要 看 一 条 就 够 了, 以 第 一 条 为 例 详 细 说 明 : 1. iptables -t mangle -I PREROUTING, 这 些 和 上 一 节 是 一 样 的, 不 重 复 了 2. -p udp, 表 示 只 分 析 UDP 协 议 的 数 据, 因 为 DNS 查 询 默 认 都 是 UDP 协 议 的 3. sport 53, 表 示 源 端 口 是 53 的 数 据, 因 为 DNS 服 务 器 返 回 的 数 据 都 是 从 它 的 53 端 口 返 回 的 4. -m u32 u32, 这 里 表 示 使 用 u32 模 块, 这 是 个 标 准 命 令 格 式 在 开 始 后 面 的 u32 模 块 分 析 前, 我 们 先 补 充 介 绍 一 下 DNS 响 应 包 的 数 据 组 成 首 先 这 是 一 个 IP 包, 就 有 IP 报 头, 另 外 这 是 UDP 协 议 的, 就 有 UDP 报 头, 后 面 的 UDP 数 据 就 是 DNS 服 务 器 的 响 应 数 据 了, 所 以 格 式 是 这 样 的 : [IP_Header]::[ UDP_Header]::[ UDP_Data==DNS_Response] u32 模 块 部 分 的 匹 配 代 码 是 这 样 的 : 0&0x0F000000=0x05000000 && 22&0xFFFF@16=0x4A7D7F66 0 第 一 个 0 表 示 从 第 0 个 字 节 开 始 抓 4 个 字 节, 计 算 机 世 界 一 直 都 是 从 0 开 始 数 的 &0x0F000000 & 表 示 把 前 面 抓 到 的 4 个 字 节 和 & 后 面 的 掩 码 进 行 与 操 作, 这 个 就 算 是 文 科 生 也 应 该 在 计 算 机 基 础 课 上 学 过, 不 解 释 了 0x0F000000 就 是 这 个 掩 码 了, 这 表 示 其 他 位 全 部 置 0, 只 保 留 第 0 字 节 的 低 4 位 =0x05000000

第 四 章 FREEROUTER V2 的 技 术 原 理 44 =0x05000000 表 示 判 断 前 面 进 行 完 与 操 作 的 数 是 不 是 等 于 0x05000000. 如 果 你 知 道 IP 包 的 数 据 格 式, 就 知 道 第 0 个 字 节 的 低 4 位 表 示 的 是 IP 报 头 的 长 度, 一 般 来 说 都 是 20 字 节 但 也 有 特 例 这 里 我 们 要 确 定 这 个 报 头 没 有 什 么 特 殊 格 式, 长 度 确 实 是 20, 为 什 么 要 判 断 这 个 长 度 后 面 会 解 释 22&0xFFFF 这 个 表 示 从 第 22 个 字 节 开 始 取 4 个 字 节 (22 25), 和 掩 码 0xFFFF(0x0000FFFF) 与 操 作, 也 就 是 取 24,25 字 节 的 内 容, 得 到 一 个 数 X 你 抓 包 分 析 看 一 下 就 会 发 现,24,25 字 节 对 应 的 数 字 是 UDP_Header 里 表 示 UDP 包 的 长 度, 也 就 是 UDP_Header+UDP_Data 的 总 长 度 @ 这 个 @ 的 作 用 非 常 大, 一 定 要 理 解 @ 表 示 从 IP 包 的 最 开 始 往 后 跳 跃 X 个 字 节, 具 体 跳 跃 多 少 呢? 就 是 @ 前 面 的 数 值 了 我 们 说 了 @ 前 面 的 一 个 与 操 作 得 到 了 UDP 包 的 长 度, 也 就 是 说 这 里 我 们 要 从 0 开 始 往 后 跳 过 UDP 包 的 长 度 整 个 IP 包 的 长 度 是 IP 头 长 度 (20)+UDP 包 的 长 度 (X), 现 在 我 们 从 0 开 始 跳 过 了 UDP 包 的 长 度 (X), 就 位 于 了 整 个 IP 包 的 最 末 再 往 前 倒 退 20 个 字 节 的 位 置 16 我 们 前 面 的 抓 包 已 经 看 到 了, 虚 假 的 IP 信 息 刚 好 位 于 整 个 IP 包 的 最 后 4 个 字 节, 我 们 现 在 已 经 处 在 最 末 -20 个 字 节 的 位 置 了, 那 么 从 这 个 位 置 开 始 数, 抓 第 16 个 字 节 开 始 的 4 个 字 节 就 行 了, 也 就 是 16 19 字 节, 为 什 么 不 是 17 20? 我 们 是 从 第 0 个 字 节 开 始 算 的, 别 忘 了 这 点 后 面 的 -j DROP 就 很 好 理 解 了, 直 接 丢 弃 在 我 们 的 防 火 墙 中 应 用 以 上 规 则,GFW 的 对 境 外 DNS 查 询 的 劫 持 信 息 就 被 过 滤 掉 了, 剩 下 的 就 是 正 确 的 解 析 信 息 了 但 是 要 记 住! 只 有 对 境 外 DNS 查 询 的 污 染 包 是 GFW 发 出 的, 也 只 有 这 个 情 况 下 这 个 数 据 格 式 才 是 和 我 们 的 命 令 匹 配 的 虽 然 这 可 以 解 决 大 部 分 问 题 了, 但 有 的 时 候 我 们 还 是 需 要 境 内 DNS+ 境 外 DNS 组 合 的 方 式, 因 为 境 内 DNS 的 速 度 比 较 快, 而 且 他 们 对 一 些 大 网 站 的 节 点 解 析 都 比 较 适 合 我 们 但 是 我 们 在 使 用 这 些 境 内 DNS 面 对 的 问 题 不 是 GFW 的 劫 持, 而 是 他 们 给 出 的 原 始 数 据 就 是 被 污 染 ( 被 劫 持 后 污 染 ) 的 这 样 的 结 果 是, 他 们 给 出 的 DNS 响 应 包 会 因 为 服 务 器 配 置 的 格 式 不 同 而 千 差 万 别, 而 且 基 本 确 定 的 是 IP 都 不 是 在 最 末 的 4 字 节 上, 因 为 正 常 的 响 应 包 末 尾 一 般 都 是 Additional RRs 数 据 我 们 想 要 使 用 境 内 DNS 获 得 高 速 的 解 析 又 不 想 被 污 染, 就 要 对 境 内 DNS 的 响 应 数 据 也 做 过 滤, 那 么 这 种 IP 位 置 不 固 定 的 响 应 包 要 如 何 过 滤 呢? 这 里 我 们 就 要 用 到 更 强 大 的 string 模 块 了 4.2.4 iptables 的 string 模 块 通 过 上 一 节 的 介 绍, 我 们 也 看 到 了 u32 模 块 第 一 个 缺 点 是 只 能 针 对 特 定 位 置 的 4 个 字 节 数 据 进 行 分 析, 如 果 位 置 不 固 定 就 没 有 办 法 了 如 果 要 对 位 置 不 固 定 的 数 据 进 行 分 析, 我 们 就 要 使 用 string 模 块, 它

第 四 章 FREEROUTER V2 的 技 术 原 理 45 可 以 帮 我 们 在 一 个 IP 包 里 搜 索 任 意 位 置, 看 是 否 有 匹 配 的 字 符 串 当 然 u32 的 固 定 位 置 分 析 也 不 能 算 是 完 全 的 缺 点, 只 针 对 固 定 位 置 固 定 长 度 的 数 据 分 析 意 味 着 u32 模 块 消 耗 的 CPU 资 源 非 常 少, 因 为 我 们 基 本 上 只 需 要 做 一 些 简 单 的 与 或 操 作 和 比 较 计 算 就 可 以 了 而 string 模 块 强 大 的 搜 索 功 能, 其 代 价 就 是 消 耗 了 更 多 的 CPU 资 源 和 u32 一 样,string 模 块 搜 索 IP 时 也 是 使 用 16 进 制, 因 为 原 始 数 据 就 是 这 样 的 因 为 计 算 复 杂 度 很 高, 一 条 string 匹 配 的 iptables 命 令 只 能 一 次 只 能 匹 配 一 个 IP( 字 符 串 ), 所 以 我 们 得 写 48 条 命 令 : iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 042442B2 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 0807C62D " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 1759053C " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 253D369E " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 2E52AE44 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 31027B38 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 364C8701 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 3B1803AD " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 402158A1 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 4021632F " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 4042A3FB " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 4168CAFC " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 41A0DB71 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 422DFCED " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 480ECD63 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 480ECD68 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 4A7D2766 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 4A7D2771 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 4A7D7F66 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 4A7D9B66 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 4D04075C " --from

第 四 章 FREEROUTER V2 的 技 术 原 理 46 iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 4E10310F " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 5D2E0859 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 76053106 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 80797E8B " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " 9F6A794B " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " A9840D67 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " BC050460 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " BDA31105 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " C043C606 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " C504040C " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " CA6A0102 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " CAB50755 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " CB620741 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " CBA1E6AB " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " CF0C5862 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " D0381F2B " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " D1244921 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " D155E58A " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " D1913632 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " D1DC1EAE " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " D35E4293 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " D5A9FB23 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " D8DDBCB6 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " D8EAB30D " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " F3B9BB27 " --from

第 四 章 FREEROUTER V2 的 技 术 原 理 47 iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " F9812E30 " --from iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string " FD9D0EA5 " --from 相 对 来 说 string 模 块 的 命 令 就 好 理 解 多 了, -m string 表 示 启 用 string 模 块 进 行 匹 配, algo bm 表 示 启 用 贝 叶 (Boyer-Moore) 字 符 串 搜 索 算 法, 另 一 种 算 法 是 kmp(knuth-pratt-morris), 具 体 应 该 只 是 效 率 和 不 同 应 用 的 区 别, 算 法 原 理 我 们 就 不 细 究 了 hex-string 表 示 要 匹 配 HEX 格 式 的 IP 地 址 了, 注 意 这 里 前 面 不 要 有 0x 表 示 16 进 制 了, 直 接 写 16 进 制 数 据 就 行, 后 面 跟 着 的 就 是 IP 地 址 的 16 进 制 格 式 from 60 to 180 这 表 示 的 是 搜 索 的 偏 置 范 围 (offset), 从 第 60 字 节 开 始 到 180 字 节 结 束, 一 般 来 说 DNS 返 回 包 的 长 度 很 少 有 超 过 180 字 节, 而 A 记 录 IP 值 的 位 置 因 为 IP 和 UDP 协 议 报 文 格 式 的 关 系, 基 本 上 不 可 能 出 现 在 60 字 节 之 前, 所 以 指 定 这 个 范 围 是 足 够 的, 同 时 也 可 以 大 大 减 轻 搜 索 算 法 的 运 算 压 力 如 果 你 担 心 有 什 么 奇 葩 DNS 返 回 的 结 果 在 这 范 围 之 外, 删 除 这 两 个 偏 置 选 项 就 行 了, 这 样 会 默 认 搜 索 整 个 字 符 串, 但 相 应 的 搜 索 消 耗 的 CPU 资 源 就 更 多 了 和 u32 模 块 的 使 用 一 样, 把 这 些 规 则 保 存 为 防 火 墙 规 则 就 可 以 过 滤 所 有 境 内 和 境 外 DNS 中 的 污 染 和 劫 持 信 息 了, 要 注 意 string 模 块 的 过 滤 其 实 已 经 包 含 了 u32 模 块 的 功 能, 不 需 要 再 添 加 u32 模 块 的 过 滤 规 则 了 但 是 境 内 DNS 的 原 始 数 据 都 是 污 染 的, 你 过 滤 掉 这 些 污 染 的 信 息 后 也 不 会 给 你 返 回 正 确 的 信 息 而 你 希 望 的 结 果 肯 定 是 同 时 享 受 境 内 DNS 的 高 速 解 析 速 度, 又 可 以 让 境 外 DNS 给 我 们 某 些 敏 感 网 站 的 正 确 解 析 结 果 要 实 现 这 样 的 组 合, 就 要 在 iptables 的 过 滤 规 则 之 下, 继 续 配 合 下 一 节 提 到 的 Dnsmasq 了

第 四 章 FREEROUTER V2 的 技 术 原 理 48 4.3 Dnsmasq 解 析 器 Dnsmasq 是 OpenWRT 系 统 默 认 内 置 的 DNS 解 析 器, 要 注 意 这 个 解 析 器 不 等 同 于 nslookup 和 dig, 后 面 的 只 是 调 试 工 具, 除 了 返 回 一 些 查 询 信 息 外 不 能 给 任 何 系 统 和 应 用 提 供 解 析 结 果, 而 Dnsmasq 可 以 我 们 需 要 对 Dnsmasq 的 性 质 有 个 基 本 认 识,Dnsmasq 并 不 能 算 是 一 个 DNS 服 务 器 软 件, 他 的 准 确 定 义 是 一 个 DNS 转 发 器 就 是 说, 它 把 收 到 的 DNS 解 析 请 求, 转 发 到 一 些 DNS 服 务 器 上 去, 然 后 从 DNS 服 务 器 接 收 返 回 的 结 果, 最 后 再 返 回 给 你? 你 也 许 会 觉 得 这 玩 意 这 么 蛋 疼, 我 自 己 查 询 不 好 吗, 干 嘛 要 你 来 转 发? 其 实 它 能 做 的 不 仅 仅 是 转 发, 转 发 仅 仅 是 他 实 现 DNS 查 询 的 方 式, 我 们 知 道 它 即 不 能 递 归 查 询, 又 不 是 蛋 疼 的 迭 代, 能 做 的 当 然 就 是 转 发 了 首 先 它 提 供 了 一 个 缓 存 功 能, 这 可 以 大 大 减 轻 你 查 询 的 网 络 请 求 次 数, 这 也 是 为 什 么 很 多 时 候 我 们 可 以 把 他 当 一 个 DNS 服 务 器 来 用 的 原 因 除 此 之 外 Dnsmasq 提 供 了 非 常 多 灵 活 的 选 项 让 我 们 可 以 完 全 掌 控 DNS 解 析 的 行 为, 具 体 的 内 容 请 参 考 它 的 Man Page, 我 们 在 FreeRouter V2 中 要 用 到 的 是 他 的 以 下 几 个 功 能 4.3.1 IPSET 功 能 我 记 得 前 面 我 挖 了 个 坑, 就 是 关 于 如 何 把 被 屏 蔽 网 站 的 IP 全 部 搜 集 到 一 个 IPSET 里 的 问 题 4.2.2, 现 在 我 们 就 来 解 决 它 Dnsmasq 从 2 66 版 开 始 就 支 持 IPSET 功 能 了, 注 意 OpenWRT 默 认 自 带 的 Dnsmasq 是 精 简 版 本 并 没 有 IPSET 功 能, 需 要 我 们 自 己 替 换 为 dnsmasq-full, 也 就 是 完 整 版 如 果 要 确 定 自 己 的 Dnsmasq 有 没 有 IPSET 功 能 支 持, 可 以 SSH 登 录 路 由 后 输 入 dnsmasq version 查 看 当 前 的 版 本 和 编 译 信 息, 可 以 看 到 下 面 的 信 息 中 已 经 包 含 了 ipset, 如 果 显 示 的 是 no-ipset, 就 说 明 没 有 IPSET 功 能 支 持 root@openwrt:~# dnsmasq --version Dnsmasq version 2.71 Copyright (c) 2000-2014 Simon Kelley Compile time options: IPv6 GNU-getopt no-dbus no-i18n no-idn DHCP DHCPv6 no-lua TFTP no-conntrack ipset auth DNSSEC This software comes with ABSOLUTELY NO WARRANTY. Dnsmasq is free software, and you are welcome to redistribute it under the terms of the GNU General Public License, version 2 or 3. 这 个 功 能 的 作 用, 就 是 把 指 定 域 名 的 解 析 结 果 存 入 一 个 IP, 具 体 哪 些 域 名 可 以 通 过 配 置 文 件 来 指 定 例 如 我 们 现 在 不 能 访 问 google 了 4, 那 么 我 们 就 把 Google.com 的 IP 都 加 入 一 个 叫 vpn 的 IPSET, 然 后 配 合 我 们 前 面 学 过 的 iptables mark 功 能,ip route 命 令 把 对 google IP 的 访 问 全 部 通 过 VPN 接 口 进 行 我 们 的 命 令 是 这 样 的 : 4 不 知 道 以 后 你 们 看 到 这 段 是 什 么 感 想, 反 正 中 国 在 现 在 ( 2015 年 1 月 21 日 ) 是 真 的 不 能 访 问 Google 了

第 四 章 FREEROUTER V2 的 技 术 原 理 49 ipset=/google.com/vpn 非 常 令 人 感 动 的 一 点 是,dnsmasq 是 支 持 从 顶 级 域 往 下 匹 配 的, 也 就 是 说 你 写 了 google.com 之 后, 什 么 mail google.com,maps google.com 的 二 级 三 级 四 级 域 名 也 全 部 被 匹 配 了, 后 面 vpn 就 是 我 们 事 先 通 过 ipset 命 令 建 立 好 的 用 于 存 储 这 些 IP 的 IPSET 你 也 许 会 想,Google 那 么 多 IP,Dnsmasq 能 全 部 都 查 到? 查 不 到! 可 是 也 完 全 没 必 要 查 到 因 为 你 能 用 到 的 IP 就 是 DNS 解 析 给 你 的 IP, 其 他 的 IP 如 果 你 连 解 析 都 没 去 解 析 他, 为 什 么 要 知 道 呢? 就 好 比 你 要 去 美 国 出 差, 但 是 老 板 只 让 你 坐 国 航 的 飞 机, 那 为 什 么 还 要 去 查 东 航 的 机 票 价 格 呢? 这 其 实 也 就 是 FreeRouter V2 里 相 对 V1 最 优 美 的 地 方 了, 只 有 在 你 需 要 访 问 某 个 被 封 锁 的 IP 时 它 才 会 起 作 用, 而 且 具 体 什 么 IP 可 能 被 封 锁 是 完 全 由 你 自 己 指 定 的, 因 为 域 名 是 你 指 定 的 在 FreeRouter V1 里 这 一 切 是 通 过 静 态 路 由 表 的 方 式 实 现 的, 这 种 方 法 的 缺 点 是 : 1. 要 精 确 搜 集 一 个 网 站 的 全 部 子 域 名 和 对 应 的 全 部 IP 极 度 困 难 2. 以 为 精 确 搜 集 很 难, 所 以 经 常 不 得 不 把 整 个 网 段 加 入 静 态 路 由 表, 但 整 个 网 段 中 有 很 多 IP 其 实 是 没 被 屏 蔽 的 3. 很 多 IP 对 应 的 网 站 普 通 人 听 都 没 听 过, 这 辈 子 可 能 也 都 不 会 上, 但 是 如 果 不 加 注 释 的 话, 你 根 本 不 知 道 IP 对 应 的 到 底 是 什 么 网 站, 4. 因 为 IP 的 可 读 性 太 差, 如 果 哪 个 网 站 解 封 了, 或 者 根 本 就 停 掉 了, 要 找 出 网 站 对 应 的 IP 再 删 除 都 很 繁 琐 而 用 Dnsmasq 的 IPSET 功 能 就 完 全 没 有 这 种 问 题 了, 一 个 域 名 就 基 本 能 帮 你 搞 定 一 个 网 站 的 访 问 了 5, 虽 然 有 可 能 出 现 部 分 解 析 的 IP 并 没 有 被 屏 蔽 也 被 走 了 VPN 的 情 况 ( 因 为 Google 的 IP 实 在 太 多 了 ), 但 肯 定 都 还 是 google 的 IP, 不 会 影 响 到 其 他 任 何 网 站 所 以 我 们 唯 一 需 要 维 护 的, 就 是 被 封 锁 的 网 站 的 域 名 列 表, 这 也 就 是 我 对 FreeRouter V2 最 主 要 的 维 护 工 作 了 其 实 你 自 己 就 可 以 去 维 护 这 个 列 表, 我 想 只 要 智 商 正 常 的 人 看 到 这 里 应 该 都 知 道 这 个 列 表 该 怎 么 写 我 只 是 提 醒 你 们 一 下,windows 格 式 和 unix 格 式 对 于 换 行 符 的 处 理 是 不 同 的, 这 使 得 在 windows 下 编 辑 的 文 件 在 linux 系 统 下 可 能 会 无 法 被 正 确 识 别 最 稳 妥 的 办 法 是 SSH 登 录 进 路 由 之 后 用 vim 编 辑, 或 者 在 windows 平 台 用 vim 以 unix 编 辑 ;vim 可 以 保 留 文 件 的 unix 格 式 不 变, 而 且 如 果 有 多 余 的 换 行 符, 你 在 vim 下 是 可 以 看 得 出 来 的 你 们 也 许 听 说 过 一 些 什 么 gfw_list 之 类 的 域 名 列 表, 那 个 列 表 里 有 几 千 个 被 封 锁 的 域 名, 但 是 我 看 了 一 下 觉 得 那 个 列 表 的 质 量 实 在 是 太 糟 糕 了 那 个 列 表 似 乎 是 一 个 论 坛 社 区 的 人 自 己 在 维 护, 人 人 都 可 以 5 Google 和 facebook 这 类 大 网 站 还 有 很 多 负 责 存 储 静 态 文 件 和 其 他 内 容 的 独 立 域 名, 也 要 一 并 加 入 列 表 才 行

第 四 章 FREEROUTER V2 的 技 术 原 理 50 提 交, 但 从 来 没 人 检 查, 很 多 明 显 是 部 署 在 国 内 的 网 站 也 被 他 们 加 进 去 了 这 年 头 靠 得 住 的 人 真 没 几 个, 所 以 我 决 定 还 是 自 己 搜 集 比 较 好 目 前 这 个 列 表 还 不 到 200 个 域 名, 可 是 我 几 乎 已 经 感 觉 不 到 墙 的 存 在 了, 至 少 你 们 在 讨 论 Google 被 封 和 解 封 这 两 个 话 题 的 时 候 我 根 本 察 觉 不 到,youtube 该 看 啥 就 看 啥,twitter 的 推 送 都 很 正 常 Porntube 什 么 的 虽 然 也 可 以 上 但 口 味 太 重 不 适 合 我, 中 国 人 嘛, 就 该 上 草 榴 ( 敢 求 邀 请 码 一 律 拉 黑 )! 4.3.2 为 Dnsmasq 指 定 DNS 我 们 说 了 Dnsmasq 其 实 是 一 个 DNS 转 发 器, 只 是 把 我 们 的 DNS 解 析 请 求 转 发 到 各 个 公 共 DNS 上, 那 么 我 们 就 必 须 为 Dnsmasq 指 定 好 使 用 哪 些 DNS 在 OpenWRT 系 统 中,Dnsmasq 的 默 认 DNS 服 务 器 来 源 是 通 过 在 /etc/config/dhcp 文 件 中 配 置 实 现 的 : config dnsmasq option domainneeded '1' option boguspriv '1' option filterwin2k '0' option localise_queries '1' option rebind_protection '1' option rebind_localhost '1' option local '/lan/' option domain 'lan' option expandhosts '1' option nonegcache '0' option authoritative '1' option readethers '1' option leasefile '/tmp/ dhcpleases ' option resolvfile '/tmp/resolv. confauto ' 我 们 看 到 最 后 一 行 是 resolvfile, 查 一 下 Dnsmasq 的 Man Page 就 会 看 到 Dnsmasq 会 通 过 读 取 这 个 选 项 中 指 定 的 文 件 来 获 取 DNS 服 务 器 列 表, 如 果 没 有 通 过 这 个 选 项 指 定 DNS 服 务 器 的 配 置 文 件 的 话,dnsmasq 默 认 会 去 读 取 /etc/resolv.conf 文 件 读 取 DNS 服 务 器 列 表 我 们 再 看 看 这 个 /etc/resolv.conf auto 文 件 的 内 容, 不 同 设 备 可 能 有 区 别, 但 格 式 基 本 如 此 : # Interface WAN nameserver 8.8.8.8 nameserver 8844 # Interface VPN nameserver 8.8.8.8 nameserver 8844

第 四 章 FREEROUTER V2 的 技 术 原 理 51 这 个 数 据 是 怎 么 来 的 呢? 原 来 当 我 们 的 每 一 个 网 络 接 口 成 功 连 接 上 之 后 (interface up), 如 果 这 个 接 口 上 有 配 置 DNS 服 务 器, 或 者 DHCP 服 务 器 通 告 了 DNS 服 务 器, 就 会 在 这 个 文 件 里 写 入 这 个 接 口 的 DNS 服 务 器 因 为 我 们 自 己 在 WAN 和 VPN 的 接 口 设 定 中 都 指 定 了 Google DNS, 结 果 就 生 成 了 我 们 上 面 的 文 件 如 果 我 们 要 指 定 DNS 服 务 器, 而 不 是 让 Dnsmasq 自 动 从 各 个 接 口 获 取 ( 因 为 ISP 分 配 给 我 们 的 DNS 基 本 都 是 被 污 染 的 ), 最 简 单 也 是 最 简 陋 的 方 法 就 是 手 工 在 每 个 接 口 的 配 置 界 面 中 指 定 DNS, 这 样 自 动 获 取 到 的 也 是 我 们 指 定 的 DNS 但 是 如 果 网 络 环 境 发 生 了 变 化, 或 者 需 要 重 新 设 置 接 口, 就 又 要 重 新 设 置 一 次 而 且 这 实 际 上 就 修 改 到 了 /etc/config/network 文 件, 倒 不 是 说 不 能 这 样 改, 只 是 每 个 人 的 网 路 环 境 是 不 同 的, 这 个 文 件 也 会 因 人 而 异, 这 样 让 我 们 很 难 提 供 一 个 统 一 的 解 决 方 案 还 有 一 个 方 法 就 是 修 改 /etc/config/dhcp 文 件, 把 最 后 的 resolvefile 选 项 改 成 我 们 指 定 的 文 件, 然 后 在 那 个 文 件 里 写 入 DNS 服 务 器 列 表, 但 是 和 上 面 的 原 因 一 样, 修 改 config 目 录 的 文 件 会 导 致 无 法 提 供 统 一 的 解 决 方 案 最 后 我 发 现 dnsmasq 提 供 了 一 个 参 数 叫 做 no-resolv, 这 个 选 项 允 许 不 从 任 何 文 件 中 读 取 DNS 服 务 器 列 表, 改 用 server 参 数 手 工 指 定 DNS 服 务 器 这 个 时 候 我 们 就 只 需 要 在 Dnsmasq.conf(Dnsmasq 的 配 置 文 件 ) 中 写 如 下 命 令 就 可 以 了 : #disable resolv file no-resolv server=8.8.8.8 井 号 # 开 始 的 部 分 是 注 释 代 码, 会 被 Dnsmasq 忽 略 掉,no-resolv 就 是 不 读 取 任 何 任 何 列 表 文 件, server=8.8.8.8 就 表 示 用 8.8.8.8 作 为 一 个 DNS 服 务 器 如 果 我 们 想 知 道 Dnsmasq 到 底 使 用 了 什 么 DNS 服 务 器, 可 以 先 重 启 Dnsmasq 服 务 : /etc/ initd/dnsmasq restart 然 后 通 过 logread 命 令 查 看 dnsmasq 启 动 过 程 的 记 录, 所 有 用 到 的 DNS 服 务 器 信 息 都 会 显 示 出 来 4.3.3 添 加 多 个 DNS 我 们 知 道 基 本 上 只 有 境 外 的 DNS 才 可 能 给 我 们 返 回 某 些 敏 感 域 名 的 正 确 解 析 结 果, 国 内 DNS 从 源 头 上 就 被 污 染 了 但 访 问 境 外 DNS 的 一 个 问 题 是 他 们 的 速 度 普 遍 比 国 内 的 慢,ISP 提 供 的 DNS 延 时 可 能 只 有 两 三 毫 秒, 而 Google DNS 在 国 内 某 些 地 区 的 延 时 高 达 400 毫 秒 ( 忽 然 变 30 毫 秒 的 那 是 GFW 劫 持 ) 而 且 大 部 分 时 间 我 们 访 问 的 网 站 可 能 还 是 普 通 的 国 内 网 站, 这 些 网 站 用 境 内 DNS 解 析 的 时 候 往 往 会 返 回 给 我 们 一 个 更 合 理 的 数 据

第 四 章 FREEROUTER V2 的 技 术 原 理 52 例 如 淘 宝 的 一 些 静 态 文 件 是 存 放 在 CDN 6 节 点 上 的, 这 些 节 点 可 能 用 了 类 似 a tbcdn cn 这 样 的 域 名 这 些 节 点 在 国 内 外 都 有 分 布, 因 为 这 些 域 名 本 身 的 名 称 服 务 器 有 比 较 智 能 的 动 态 分 配 功 能, 当 你 用 Google DNS 去 解 析 的 时 候, 他 们 会 以 为 你 是 一 个 美 国 客 人, 就 返 回 了 一 个 美 国 节 点 的 IP 给 你, 而 用 114DNS 的 时 候 他 们 觉 得 你 是 个 中 国 客 人, 就 给 你 返 回 了 一 个 中 国 节 点 的 IP, 后 者 明 显 才 是 我 们 要 的 结 果 如 果 只 是 分 配 到 国 外 节 点 速 度 慢 也 就 罢 了, 可 是 淘 宝 的 一 些 日 本 节 点 IP 在 国 内 根 本 就 是 被 屏 蔽 了 的, 结 果 就 出 现 了 访 问 taobao 的 时 候 很 多 内 容 加 载 不 了, 页 面 不 完 整 所 以 我 们 希 望 的 就 是 同 时 使 用 境 内 和 境 外 DNS, 第 一 步 首 先 是 添 加 这 些 境 内 境 外 的 DNS 服 务 器 : #Local Process server=127.0.0.1 #Google DNS server=8.8.8.8 #Nortorn DNS server=199.85.127.20 #Comodo DNS server=8.26.56.26 #DNS Advantage server=156.154.70.1 #Verizon DNS server=4.2.2.4 #NTT DNS server=129.250.35.250 #114 DNS server=114.114.114.114 #Ali DNS server=223.5.5.5 #CNNIC server=1.2.4.8 按 照 Dnsmasq 的 说 法, 第 一 条 添 加 127.0.0.1 是 为 了 让 Dnsmasq 成 为 路 由 器 自 身 的 Dns 缓 存, 实 际 上 我 测 下 来 这 个 好 像 可 有 可 无, 加 上 也 没 坏 处 后 面 我 们 依 次 添 加 了 国 内 和 国 外 公 共 DNS 但 是 这 并 不 等 于 工 作 就 完 成 了, 因 为 默 认 情 况 下 Dnsmasq 只 会 使 用 第 一 个 DNS(127.0.0.1 会 被 忽 略 ), 也 就 是 8.8.8.8, 这 和 我 们 所 要 的 结 果 完 全 不 同 我 们 还 需 要 添 加 一 个 参 数 : all-servers 这 个 参 数 是 告 诉 Dnsmasq, 在 收 到 一 个 DNS 解 析 请 求 之 后, 向 所 有 的 DNS 服 务 器 都 发 起 查 询, 然 后 接 受 并 返 回 最 先 返 回 的 那 个 结 果 给 客 户 端 所 以 现 在 的 工 作 情 况 是 : 6 Content Deliver Network, 一 种 网 络 加 速 技 术

第 四 章 FREEROUTER V2 的 技 术 原 理 53 1. 对 于 绝 大 部 分 国 内 的 和 没 被 GFW 盯 上 的 网 站, 因 为 他 们 的 域 名 解 析 结 果 并 没 有 被 污 染, 所 以 速 度 最 快 的 国 内 DNS 优 先 返 回 了 解 析 结 果 给 我 们, 这 个 结 果 是 真 实 的, 不 会 被 iptables 过 滤 2. 而 对 于 被 GFW 污 染 了 的 域 名, 境 内 DNS 返 回 的 信 息 全 是 被 污 染 的, 但 已 经 被 我 们 的 iptables 防 火 墙 挡 掉 了, 这 个 结 果 对 Dnsmasq 来 说 是 不 可 见 的 3. 所 以 Dnsmsq 只 能 继 续 等 境 外 Dnsmasq 返 回 的 结 果 (GFW 对 境 外 DNS 的 劫 持 信 息 会 被 iptables 挡 掉 ), 当 第 一 个 境 外 DNS 返 回 的 正 确 结 果 到 达 后, 就 返 回 给 客 户 端 4.3.4 屏 蔽 运 营 商 的 DNS 广 告 所 以, 我 们 现 在 在 速 度 和 正 确 的 结 果 上 达 到 了 最 佳 的 平 衡 但 是 还 有 个 残 留 的 小 问 题 : 这 就 是 如 果 你 在 添 加 境 内 DNS 的 时 候 使 用 了 ISP 的 DNS 的 话, 你 会 发 现 当 你 不 小 心 输 错 域 名, 访 问 了 一 个 不 存 在 的 域 名 的 时 候, 会 被 指 向 到 一 个 运 营 商 提 供 的 网 页 那 里 这 个 网 页 可 能 是 什 么 电 信 导 航 首 页, 也 可 能 是 他 们 的 合 作 伙 伴 的 导 航 首 页 之 类 的, 如 果 你 觉 得 这 都 没 什 么 问 题 那 这 节 可 以 不 看 这 种 行 为 本 质 上 其 实 也 是 一 种 DNS 劫 持, 对 于 不 存 在 的 域 名, 标 准 的 DNS 服 务 器 不 应 该 返 回 任 何 A 记 录 地 址, 而 且 应 该 在 返 回 包 的 Reply Code 中 置 03(status: NXDOMAIN), 表 示 这 是 一 个 不 存 在 的 域 名 但 是 OpenDNS 和 国 内 的 运 营 商 的 DNS 就 会 利 用 这 个 机 会, 对 不 存 在 的 域 名 返 回 一 个 他 们 制 定 的 服 务 器 IP, 从 而 引 导 所 有 对 不 存 在 域 名 的 访 问 都 访 问 他 们 的 广 告 商 页 面, 从 而 赚 取 广 告 收 益 如 果 你 很 讨 厌 这 种 行 为, 那 你 可 以 选 择 不 用 他 们 的 DNS, 但 他 们 的 DNS 往 往 还 都 是 最 快 的 ( 毕 竟 他 是 你 的 运 营 商 ), 所 以 如 果 要 既 用 他 们 的 DNS 又 避 免 这 些 广 告, 就 可 以 用 Dnsmasq 的 一 个 bogus-nxdomain 的 选 项 这 个 选 项 的 诞 生 原 因 和 我 们 面 对 的 情 况 几 乎 是 一 样 的 : -,B --bogus -nxdomain=<ipaddr > Transform replies which contain the IP address given into "No such domain" replies. This is intended to counteract a devious move made by Verisign in September 2003 when they started returning the address of an advertising web page in response to queries for unregistered, names instead of the correct NXDOMAIN response. This option tells dnsmasq to fake the correct response when it sees this behaviour. As at Sept 2003 the IP address being returned by Verisign is 64.94.110.11 当 我 们 搜 集 到 运 营 商 把 不 存 在 域 名 指 向 了 哪 些 IP 之 后, 我 们 用 这 个 选 项 加 入 dnsmasq 的 配 置 中, 如 果 DNS 服 务 器 返 回 的 IP 是 这 些 IP,Dnsmasq 就 认 为 这 些 是 虚 假 的 信 息, 直 接 忽 略 它 然 后 告 诉 客 户 端 这 个 域 名 不 存 在 关 于 这 些 IP 地 址, 这 里 有 一 个 比 较 全 面 的 搜 集 列 表, 摘 录 如 下 : #Some DNS server will return certain IP for non -exist domain for their, advertisementblock these IP here. #OpenDNS bogus -nxdomain =67.215.65.132 bogus -nxdomain =67.215.77.132

第 四 章 FREEROUTER V2 的 技 术 原 理 54 bogus -nxdomain =208.69.34.132 bogus -nxdomain =208.69.32.132 #DNSPai bogus -nxdomain =123.125.81.12 bogus -nxdomain=101.226.10.8 #Nanfang Unicom (nfdnserror1.wo.com.cn to nfdnserror17.wo.com.cn) bogus -nxdomain =220.250.64.18 bogus -nxdomain =220.250.64.19 bogus -nxdomain =220.250.64.20 bogus -nxdomain =220.250.64.21 bogus -nxdomain =220.250.64.22 bogus -nxdomain =220.250.64.23 bogus -nxdomain =220.250.64.24 bogus -nxdomain =220.250.64.25 bogus -nxdomain =220.250.64.26 bogus -nxdomain =220.250.64.27 bogus -nxdomain =220.250.64.28 bogus -nxdomain =220.250.64.29 bogus -nxdomain =220.250.64.30 bogus -nxdomain =220.250.64.225 bogus -nxdomain =220.250.64.226 bogus -nxdomain =220.250.64.227 bogus -nxdomain =220.250.64.228 #Shandong Unicom (sddnserror1.wo.com.cn to sddnserror9.wo.com.cn) bogus -nxdomain =123.129.254.11 bogus -nxdomain =123.129.254.12 bogus -nxdomain =123.129.254.13 bogus -nxdomain =123.129.254.14 bogus -nxdomain =123.129.254.15 bogus -nxdomain =123.129.254.16 bogus -nxdomain =123.129.254.17 bogus -nxdomain =123.129.254.18 bogus -nxdomain =123.129.254.19 #Wuhan Telecom bogus -nxdomain=58.53.211.46 bogus -nxdomain=58.53.211.47 #Nanjing Telecom bogus -nxdomain =202.102.110.203 bogus -nxdomain =202.102.110.205 #Shanghai Telecom bogus -nxdomain =180.168.41.175 #Beijing Unicom (bjdnserror1.wo.com.cn to bjdnserror5.wo.com.cn) bogus -nxdomain =202.106.199.34

第 四 章 FREEROUTER V2 的 技 术 原 理 55 bogus -nxdomain =202.106.199.35 bogus -nxdomain =202.106.199.36 bogus -nxdomain =202.106.199.37 bogus -nxdomain =202.106.199.38 #Chengdu Telecom bogus -nxdomain=61.139.8.101 bogus -nxdomain=61.139.8.102 bogus -nxdomain=61.139.8.103 bogus -nxdomain=61.139.8.104 #Hangzhou Telecom bogus -nxdomain =60.191.124.236 如 果 使 用 了 ISP 的 DNS, 把 这 个 文 件 也 加 入 我 们 的 Dnsmasq 配 置 项 之 后, 我 们 的 DNS 节 方 案 基 本 就 是 完 美 的 了 我 前 面 说 了 不 做 任 何 涉 及 商 业 利 益 的 选 项, 所 以 这 个 文 件 只 会 是 个 选 项 而 不 会 部 署 到 FreeRouter V2 中, 在 你 使 用 了 ISP 的 DNS 之 后 可 以 自 己 选 择 是 否 使 用, 如 果 你 不 用 ISP 的 DNS, 可 以 忽 略 4.3.5 限 定 范 围 的 解 析 目 前 为 止 我 们 的 DNS 解 决 方 案 都 是 基 于 用 iptables 过 滤 来 阻 挡 GFW 的 污 染 信 息, 虽 然 这 些 规 则 其 实 已 经 有 效 的 工 作 了 好 几 年 (GFW 的 更 新 真 的 很 慢 ), 但 是 我 们 不 能 保 证 哪 天 会 不 会 有 新 的 污 染 IP 被 投 入 使 用, 这 样 我 们 的 防 火 墙 规 则 可 能 就 过 滤 不 了 了 其 实 我 们 从 一 开 始 就 提 到 了,GFW 可 以 对 DNS 进 行 劫 持 的 根 源 是 UDP 协 议 本 身 的 不 安 全, 如 果 我 们 可 以 保 证 路 由 器 到 DNS 服 务 器 之 间 的 网 络 是 安 全 的, 那 么 GFW 的 DNS 劫 持 也 就 没 办 法 了 进 行 了 例 如 我 们 现 在 可 以 把 所 有 到 Google DNS 的 访 问 都 通 过 route 命 令 添 加 到 VPN 接 口 进 行 : route add -host 8.8.8.8 dev pptp -VPN 这 个 时 候 我 们 和 8.8.8.8 的 通 信 就 是 通 过 加 密 过 的 PPTP 协 议 进 行 的 了, 目 前 来 说 GFW 还 是 不 能 分 析 和 劫 持 PPTP 协 议 的 7, 这 样 我 们 就 可 以 获 得 正 确 的 DNS 解 析 了 那 国 内 DNS 怎 么 办? 不 用 吧, 速 度 太 慢 用 吧, 走 VPN 也 没 用 啊, 因 为 服 务 器 上 的 原 始 数 据 就 是 被 污 染 的 Dnsmasq 的 server 选 项 还 有 一 个 特 殊 的 应 用 方 法, 就 是 让 指 定 的 域 名 用 指 定 的 DNS 解 析, 这 样 我 们 可 以 默 认 用 走 VPN 的 Google DNS 解 析, 但 对 于 那 些 没 有 被 污 染 又 经 常 访 问 的 域 名 就 指 定 让 国 内 DNS 来 解 析, 例 如 : 7 虽 然 有 研 究 证 明 PPTP 的 加 密 方 式 强 度 不 够, 如 果 运 用 强 大 的 运 算 力, 花 上 几 天 也 可 以 解 密 PPTP 协 议, 但 是 我 真 的 不 能 想 象 GFW 要 疯 到 什 么 地 步 才 会 去 对 所 有 PPTP 协 议 解 密, 如 果 是 针 对 性 的 解 密, 我 想 大 部 分 人 都 还 没 这 个 待 遇

第 四 章 FREEROUTER V2 的 技 术 原 理 56 ##local.conf generated date:sun Jul 13 20:53:40 CST 2014## ##All.CN Domain## server=/cn/114.114.114.114 ##Alexa Top500 In China## server=/baidu.com/114.114.114.114 server=/qq.com/114.114.114.114 server=/taobao.com/114.114.114.114 server=/weibo.com/114.114.114.114 server=/hao123.com/114.114.114.114 我 们 说 了 Dnsmasq 是 可 以 从 顶 级 域 开 始 往 下 匹 配 的,server=/cn/114.114.114.114 表 示 所 有 的 CN 域 名 都 交 给 114 来 解 析, 因 为 CN 域 名 的 特 殊 性 ( 这 是 中 国 的 国 别 域 名, 控 制 权 完 全 在 党 国 手 里 ), 基 本 上 不 可 能 有 什 么 反 动 网 站 会 用 这 个 后 缀 的 域 名, 其 实 稍 微 有 点 远 见 的 商 业 网 站 也 不 该 用 cn 域 名 在 国 外 注 册 个.com 域 名, 这 就 是 你 的 私 有 财 产, 只 要 不 违 反 相 关 的 规 定 谁 能 动 你? 国 内 虽 说 有 法 律, 但 是, 你 懂 的 这 种 限 定 范 围 解 析 的 方 法, 是 在 GFW 做 重 大 更 新 导 致 现 有 规 则 失 效 的 情 况 下 的 备 选 项, 但 在 解 析 速 度 和 效 果 上 肯 定 不 是 最 佳 的, 所 以 这 个 限 定 国 内 域 名 的 列 表 我 只 会 作 为 一 个 参 考 选 项 在 FreeRouter V2 里 提 供, 但 并 不 会 导 入, 如 果 需 要 你 可 以 自 己 决 定 是 否 使 用 4.4 DNSSEC 的 原 理 和 实 用 性 以 下 两 节 原 文 在 这 里 和 这 里,DNSSEC 是 未 来 的 DNS 系 统 的 一 个 趋 势 有 必 要 了 解 一 下, 但 不 了 解 并 不 影 响 我 们 对 FreeRouter V2 项 目 工 作 原 理 的 理 解 另 外 讲 解 DNSSEC 原 理 的 时 候 讲 解 了 前 面 提 到 的 公 钥 + 私 钥 非 对 称 加 密 体 系, 这 是 网 络 安 全 中 非 常 重 要 的 一 个 概 念, 也 是 密 码 学 出 现 以 来 最 伟 大 的 创 造, 非 常 有 必 要 了 解 一 下 它 的 基 本 原 理 我 只 整 理 一 下 格 式 稍 微 合 并 一 下 内 容 4.4.1 简 介 DNSSEC 是 为 了 解 决 传 统 DNS 系 统 中 的 各 种 不 安 全 性, 由 IETF 制 定 的 一 套 配 合 现 有 DNS 系 统 的 安 全 扩 展 系 统, 目 标 在 于 解 决 各 种 DNS 缓 存 投 毒 / 生 日 攻 击 /DNS 劫 持 等 问 题, 从 源 头 上 保 证 DNS 数 据 的 正 确 性 和 完 整 性 这 里 我 大 致 讲 一 下 它 的 工 作 原 理, 并 分 析 一 下 这 个 系 统 目 前 的 实 用 性 4.4.2 传 统 DNS 系 统 的 弱 点 DNS 系 统 的 通 讯 采 用 的 是 UDP 协 议, 这 种 不 面 向 连 接 的 协 议 适 用 于 快 速 大 量 的 传 输 小 数 据, 这 也 是 DNS 系 统 采 用 UDP 的 原 因 之 一 当 然 DNS 也 可 以 使 用 TCP 协 议, 不 过 那 是 默 认 用 于 NameServer( 名 称

第 四 章 FREEROUTER V2 的 技 术 原 理 57 服 务 器, 以 下 简 称 NS) 之 间 的 Zone Transfer 的, 普 通 的 DNS 解 析 器 并 不 会 使 用 TCP 协 议 向 NS 发 起 请 求 作 为 整 个 互 联 网 最 重 要 的 基 础 协 议 之 一,DNS 其 实 是 一 个 非 常 脆 弱 的 系 统, 它 面 对 的 主 要 可 能 问 题 有 DNS 缓 存 投 毒 /DNS 劫 持 / 生 日 攻 击 /DNS 数 据 泄 露 等, 前 两 者 对 普 通 用 户 的 危 害 是 非 常 恐 怖 的, 它 完 全 可 以 把 一 个 银 行 域 名 指 向 黑 客 的 服 务 器 这 些 弱 点 的 根 本 原 因 是 UDP 协 议 是 不 面 向 连 接 的 协 议, 没 人 可 以 保 证 端 对 端 的 传 输 是 安 全 的, 而 DNS 协 议 本 身 在 建 立 初 期 又 实 在 太 纯 洁 了, 根 本 没 有 考 虑 各 种 后 来 可 能 出 现 的 攻 击,DNS 协 议 本 身 对 数 据 的 验 证 是 非 常 脆 弱 的 基 本 的 验 证 只 有 一 个 Transaction ID, 这 种 东 西 用 生 日 攻 击 就 可 以 猜 测 出 来, 成 功 率 根 本 不 用 你 操 心 ; 如 果 是 在 局 域 网, 直 接 在 网 关 监 听 甚 至 可 以 捕 获 Transaction ID, 捕 获 后 直 接 用 于 伪 造 DNS 解 析 数 据 返 回 给 客 户 端 就 行 了, 在 你 用 Google DNS 查 询 twitter.com 的 时 候,GFW 就 是 这 么 干 的 在 讲 解 DNSSEC 的 原 理 之 前, 我 们 必 须 先 科 普 一 下 : 4.4.3 公 钥 / 私 钥 加 密 的 基 本 原 理 公 钥 私 钥 加 密 体 系 是 基 于 这 样 两 个 前 提 : 你 产 生 一 对 公 钥 / 私 钥 之 后, 如 果 你 仅 仅 持 有 公 钥 或 者 私 钥 中 的 一 个 密 钥, 无 论 你 配 合 明 文, 密 文 还 是 别 的 数 据, 都 不 可 能 推 导 出 另 一 个 密 钥 无 论 公 钥 还 是 私 钥 都 可 以 用 于 加 密 数 据, 但 加 密 后 的 数 据 要 想 解 密, 就 必 须 由 另 一 半 完 成 所 以 公 钥 / 私 钥 体 系 的 应 用 主 要 有 两 种 : 加 密 数 据 例 如 现 在 A 要 给 B 发 送 数 据, 他 就 先 用 B 的 公 钥 加 密 消 息 ( 因 为 公 钥 是 公 开 的, 人 人 都 可 以 有 的 ), 然 后 发 送 给 B, 即 使 是 广 播 发 送 也 无 所 谓, 因 为 只 有 B 才 持 有 B 的 私 钥, 所 以 只 有 B 才 能 解 密 这 个 消 息 验 证 签 名 例 如 我 要 告 诉 你 我 是 总 统, 我 就 用 总 统 的 私 钥 加 密 一 个 签 名 然 后 给 你 看, 因 为 你 们 都 有 总 统 的 公 钥, 所 以 都 可 以 解 密 这 个 签 名 看 看 是 不 是 我 其 实 我 用 任 何 私 钥 加 密 数 据, 你 们 都 可 以 用 总 统 的 公 钥 解 密, 但 是 只 有 用 总 统 的 私 钥 加 密 的 数 据, 解 密 后 的 签 名 才 是 有 意 义 的, 否 则 可 能 只 是 一 堆 乱 码, 你 们 一 看 : 我 靠, 神 经 病 啊, 打 死!

第 四 章 FREEROUTER V2 的 技 术 原 理 58 4.4.4 DNSSEC 中 公 钥 私 钥 的 应 用 在 传 统 的 DNS 系 统 中, 各 种 A 记 录 CNAME 记 录 MX 记 录 统 称 为 RR(Resource Record ), 这 些 RR 一 旦 DNS 服 务 器 发 送 给 解 析 器, 解 析 器 就 无 条 件 接 受, 也 不 管 数 据 对 不 对 ( 可 能 被 缓 存 投 毒 了 ), 甚 至 到 底 是 不 是 服 务 器 发 回 来 的 ( 可 能 被 DNS 劫 持 了 ), 其 实 也 不 是 解 析 器 想 这 样 无 条 件 接 受, 而 是 解 析 器 除 了 接 受 也 没 办 法 验 证 啊 为 了 解 决 这 个 问 题,DNSSEC 增 加 了 RRSIG(Resource Record Signature,RR 签 名 ), DNSKEY(Domain s Public Key, 域 名 公 钥 ),DS(DiaoSiDelegation Signer, 上 级 授 权 签 名 ) 这 三 种 记 录, 同 时 从 根 域 名 到 顶 级 域 名 服 务 器 都 各 自 增 加 了 一 套 公 钥 / 私 钥 我 们 用 一 个 例 子 来 解 释 DNSSEC 如 何 利 用 这 几 个 记 录 图 4.4: DNSSEC 中 RRSIG 的 作 用

第 四 章 FREEROUTER V2 的 技 术 原 理 59 图 4.5: DNSSEC 中 DS 和 DNSKEY 记 录 的 作 用 1. 我 们 ( 一 台 DNS 服 务 器 ) 现 在 要 查 询 paypal.com 的 DNS 记 录,paypal.com 的 名 称 服 务 器 ( 以 下 简 称 PP_NS) 返 回 了 对 应 的 A 记 录 IP 数 据 (RR,Resource Record,A 记 录 MX 记 录 这 些 记 录 都 统 称 为 RR) 和 一 长 串 字 符 (RRSIG), 还 有 对 应 的 DNSKEY 和 DS 记 录, 那 我 怎 么 知 道 这 个 IP 是 真 的 A 记 录, 而 不 是 被 修 改 了 的 呢? 2. 先 看 看 RRSIG 是 什 么 产 生 的,PP_NS 对 RR 做 哈 希, 然 后 用 自 己 的 私 钥 对 这 个 哈 希 进 行 加 密, 就 产 生 了 RRISG 3. 而 查 询 到 的 DNSKEY, 就 是 PP_NS 的 公 钥, 我 们 用 这 个 公 钥 对 这 个 RRSIG 解 密 就 得 到 了 RR 的 哈 希 值, 然 后 我 们 自 己 再 对 RR 做 一 次 哈 希, 通 过 判 断 两 个 哈 希 是 否 一 样 就 可 以 知 道 数 据 是 否 正 确 了 4. 你 也 许 会 想, 我 tm 怎 么 知 道 这 些 DNSKEY 真 的 就 是 PP_NS 发 回 来 的, 说 不 定 连 你 整 套 公 钥 / 密 钥 都 是 黑 客 伪 造 的 呢? 这 里 就 用 到 了 DS 5. DS 的 产 生 是 这 样 的,PP_NS 把 自 己 的 公 钥 交 给 给 上 级 的 NS, 也 就 是.com 顶 级 域 名 的 名 称 服 务 器 ( 以 下 简 称 COM_NS) 那 里, 用 COM_NS 的 私 钥 对 PP_NS 的 公 钥 加 密, 就 得 到 了 DS 6. 如 果 你 不 相 信 PP_NS 的 公 钥, 你 可 以 去 COM_NS 那 里 查 COM_NS 的 公 钥, 然 后 对 PP_NS 的 DS 记 录 解 密, 如 果 解 密 结 果 和 DNSKEY 对 上 了, 就 说 明 DNSKEY 是 对 的.COM_NS 这 个 级 别 的 数 据 你 总 该 相 信 了 吧 7. 如 果 连 COM_NS 的 公 钥 都 不 相 信, 没 关 系,COM_NS 自 己 也 有 DS 记 录, 这 个 DS 是 由 跟 服 务 器 (ROOT_NS) 用 自 己 的 私 钥 加 密 产 生 的, 你 再 用 ROOT_NS 的 公 钥, 做 一 样 的 解 密 验 证 就 可 以 了 8. 如 果 你 不 相 信 ROOT_NS 的 公 钥, 那 你 他 妈 别 玩 了! 这 个 公 钥 是 你 自 己 告 诉 DNS 服 务 器 的, 根 本 不 用 你 去 查 询 ROOT_NS 的 公 钥, 就 是 一 般 的 解 析 器 和 DNS 服 务 器 里 设 定 的 Trust Anchor, 因 为 这 个 数 据 最 终 是 你

第 四 章 FREEROUTER V2 的 技 术 原 理 60 自 己 设 定 的, 所 以 整 个 验 证 链 最 后 的 安 全 阀 其 实 在 你 手 里, 但 你 有 责 任 自 己 去 维 护 这 个 Trust Anchor 的 正 确 性 如 果 ROOT_NS 的 公 钥 变 动, 就 必 须 跟 着 修 改, 否 则 顶 层 一 级 的 解 密 校 验 就 会 失 败 这 个 Trust Anchor 虽 然 是 你 自 己 输 入, 但 并 不 是 你 随 意 产 生 的, 这 个 实 际 上 已 经 由 IANA 公 布, 可 以 在 这 里 找 到 最 新 的 Root Trust Anchor 以 上 就 是 DNSSEC 的 大 致 原 理, 简 单 来 说 就 是 从 已 知 的 根 域 开 始, 一 级 级 对 下 级 签 名, 然 后 查 询 者 可 以 通 过 这 个 签 名 链 的 逆 过 程 验 证 每 一 个 数 据 是 否 真 实 4.4.5 DNSSEC 的 最 大 问 题, 是 域 名 签 名 部 署 的 缺 失 一 个 非 常 严 重 的 问 题 是, 整 个 数 据 验 证 过 程, 必 须 是 在 域 名 做 了 签 名, 并 且 向 上 级 NS 提 交 生 成 了 DS 的 情 况 下 才 可 能 实 现 ( 没 有 向 上 级 域 提 交 并 通 过 签 名 的 Key 是 无 法 验 证 的, 自 然 没 有 意 义 ) 那 么 现 在 又 多 少 域 名 做 了 这 样 的 签 名 呢? 千 分 之 三! 没 错, 一 个 害 得 老 子 都 不 知 道 怎 么 打 千 分 号 的 数 据 你 常 用 的 大 网 站, 什 么 google.com,twitter.com,youtube.com,facebook.com, 嗯 统 统 没 有 DNSSEC 签 名! 造 成 这 个 问 题 的 根 本 原 因 不 是 这 些 网 络 巨 头 不 知 道 域 名 安 全 的 重 要 性,Google 的 Public DNS 甚 至 是 全 球 最 早 支 持 DNSSEC 的 公 共 DNS 服 务 器 之 一 他 们 的 问 题 在 于 网 站 规 模 过 于 庞 大, 一 个 域 名 对 应 的 IP 数 目 多 得 难 以 想 象, 而 且 为 了 实 现 网 络 的 最 佳 优 化, 这 些 IP 记 录 经 常 会 变 动, 这 就 使 得 RRSIG 几 乎 不 可 能 在 他 们 上 面 实 现, 一 旦 记 录 出 错 造 成 用 户 无 法 访 问, 每 一 秒 的 损 失 都 难 以 估 量 目 前 来 说, 部 署 DNSSEC 的 网 站 主 要 是 Paypal 这 种 金 融 网 站 和 一 些 政 府 网 站, 因 为 这 些 网 站 的 特 殊 性 要 求 他 们 在 安 全 性 上 不 能 有 任 何 缺 失, 而 且 相 对 来 说 他 们 不 会 面 对 Google,facebook 这 些 网 站 的 IP 过 多 的 问 题 至 于 在 顶 级 域 名 与 以 下 的 各 个 域 名 TLD 的 支 持, 情 况 倒 还 算 理 想,ICANN 在 2010 年 的 时 候 忽 然 急 速 推 进 DNSSEC 的 部 署, 使 得 整 个 体 系 的 上 层 都 还 算 健 全 如 果 一 个 域 名 没 有 做 DNSSEC 签 名, 那 么 DNSSEC 还 能 保 护 它 吗? 4.4.6 对 未 签 名 的 域 名,DNSSEC 几 乎 不 能 提 供 任 何 保 护 我 们 说 了,DNSSEC 只 是 DNS 的 一 个 扩 展, 添 加 了 一 套 可 用 于 数 据 验 证 的 域 名 记 录, 并 没 有 对 DNS 协 议 的 数 据 传 输 方 式 和 报 文 格 式 做 任 何 改 进 修 改 就 好 像 加 入 DNS 原 来 没 有 CNAME 记 录, 现 在 添 加 了 CNAME 记 录 的 支 持, 但 是 你 并 没 有 去 用 它, 那 这 个 记 录 对 你 有 用 吗? 当 然 没 有 对 于 没 有 签 名 的 域 名, 不 管 你 用 什 么 样 的 解 析 器, 使 用 什 么 样 的 DNS 服 务 器, 你 所 查 询 到 的 DNS 记 录 和 之 前 都 没 有 发 生 任 何 变 化 只 是 在 你 向 一 个 支 持 DNSSEC 的 DNS 服 务 器 查 询 的 时 候, 他 的 返 回 包 里 会 多 一 个 DO 的 Flag, 表 示 他 知 道 你 的 解 析 器 支 持 DNSSEC 了, 可 是 域 名 本 身 并 没 有 提 供 DNSSEC 数 据 给 你 啊, 我 也 没 法 给 你 造 出 来

第 四 章 FREEROUTER V2 的 技 术 原 理 61 4.4.7 对 签 名 的 域 名, 中 间 人 攻 击 依 然 有 可 能 进 行 除 了 RRSIG,DS,DNSKEY 这 三 条 记 录 之 外, 支 持 DNSSEC 的 解 析 器 和 DNS 服 务 器 通 信 中, 还 会 增 加 两 个 标 签 位 : AD(authentic data) DNS 服 务 器 默 认 会 对 RRSIG 的 有 效 性 进 行 检 查, 检 查 确 认 签 名 有 效, 就 会 把 AD 位 置 1, 下 发 给 解 析 器 CD(Check Disable) 默 认 情 况 下, 如 果 DNS 服 务 器 返 回 的 AD 位 置 1 了, 客 户 端 就 会 接 受 服 务 器 的 检 查 结 果, 自 己 就 不 再 对 结 果 做 验 证 了 如 果 客 户 端 不 信 任 服 务 器 的 验 证 数 据, 就 在 请 求 包 中 把 CD 位 置 1, 告 诉 服 务 器 老 子 不 用 你 检 查, 签 名 有 没 有 用 我 自 己 来 看 这 种 情 况 下 服 务 器 返 回 的 数 据 包 中,AD 位 会 置 0 表 示 它 也 不 知 道 这 签 名 是 不 是 有 效, 因 为 你 都 告 诉 它 不 用 去 检 查 了 嘛, 那 他 干 嘛 还 犯 贱 虽 然 这 个 有 点 蛋 疼, 但 是 在 客 户 端 做 签 名 验 证, 才 是 最 安 全 的 做 法, 为 什 么 呢? 一 个 普 遍 的 问 题 就 是, 现 在 的 各 种 解 析 器 / 客 户 端 中, 很 多 都 没 有 完 善 自 己 的 签 名 检 查 部 分, 从 上 面 的 原 理 中 你 也 看 到 了, 这 个 签 名 检 查 其 实 是 个 很 蛋 疼 的 过 程, 几 乎 相 当 于 一 次 递 归 解 析 的 过 程 了, 耗 时 耗 力 所 以 要 么 是 因 为 自 己 没 有 验 证 签 名 的 能 力, 要 么 是 觉 得 这 个 验 证 过 程 太 消 耗 时 间 和 资 源, 当 前 的 各 种 解 析 器 / 客 户 端 默 认 都 不 会 发 送 这 个 自 作 多 情 的 CD(Check Disable) 对 于 Dnsmasq 来 说, 如 果 你 想 让 Dnsmasq 自 己 验 证 签 名 发 送 CD 位, 就 要 启 用 dnssec-debug 选 项,ManPage 中 的 建 议 直 接 就 是 should not be set in production 那 么 好 了, 既 然 客 户 端 不 检 查 签 名, 只 要 看 到 AD 位 置 1 就 相 信, 黑 客 就 太 高 兴 了 他 随 便 伪 造 个 符 合 DNSSEC 标 准 的 返 回 包 ( 反 正 猜 解 Transaction ID 什 么 的 早 就 不 是 问 题 了 ), 修 改 数 据, 把 AD 位 置 1, 搞 定! 前 面 这 么 多 服 务 器 的 DNSSEC 部 署 的 努 力, 在 最 后 一 站 全 部 化 作 泡 影 对 于 这 个 问 题, 可 能 的 办 法 是 通 过 TSIG(Transaction Signature) 来 实 现 数 据 传 输 中 的 数 据 完 整 性 验 证, 但 TSIG 的 问 题 是 解 析 器 和 Recursive DNS 服 务 器 之 间 也 要 部 署 类 似 https 加 密 那 样 的 一 套 共 享 密 钥, 这 个 部 署 工 作 会 是 个 噩 梦 关 于 这 个 方 法, 可 以 参 考 相 应 的 论 文 当 然, 目 前 来 说 更 实 际 的 做 法, 就 是 OpenDNS 提 出 的 DnsCurve, 也 就 是 你 们 可 能 用 过 的 DnsCrypt, 这 是 一 种 加 密 客 户 端 到 DNS 服 务 器 双 向 通 讯 数 据 的 做 法, 具 体 的 实 现 原 理 请 参 考 Dnscrypt 官 网 另 外, 就 实 用 性 而 言, 中 国 人 还 要 面 对 一 个 很 严 重 的 问 题 : 4.4.8 国 内 支 持 DNSSEC 的 DNS 服 务 器 极 度 缺 乏 你 所 知 道 的 几 乎 全 部 国 内 的 公 共 DNS 都 是 不 支 持 DNSSEC 的, 当 然, 把 国 内 换 成 国 外, 就 刚 好 反 过 来 了 但 使 用 国 外 DNS 的 问 题 除 了 速 度 慢, 就 是 我 们 上 面 提 到 了, 对 那 些 未 签 名 的 域 名 来 说, 传 输 的 最 后 一 站 中 的 域 名 劫 持 根 本 无 法 避 免, 在 客 户 端 没 有 验 证 签 名 能 力 或 者 默 认 不 做 本 地 签 名 验 证 的 情 况 下 ( 这

第 四 章 FREEROUTER V2 的 技 术 原 理 62 还 是 现 在 的 默 认 情 况 ), 就 算 是 签 名 的 域 名 也 躲 不 掉 被 劫 持 的 厄 运 总 结 下 来,DNSSEC 的 安 全 性, 数 据 完 整 性 保 障, 建 立 在 一 个 由 域 名 从 根 域 到 底 层 名 称 服 务 器 DNS 服 务 器 解 析 器 组 成 的 完 整 的 安 全 链 上, 这 个 链 上 的 任 何 一 个 环 节 出 问 题, 都 会 让 DNSSEC 的 安 全 性 荡 然 无 存 DNSSEC 作 为 现 有 DNS 系 统 的 增 补, 有 效 部 署 难 度 极 大 要 求 所 有 域 名 都 有 DNSSEC 签 名 这 一 项 就 无 法 通 过 任 何 策 略 来 推 进, 除 非 DNSSEC 签 名 全 部 免 费 (Godaddy 一 年 的 签 名 要 36 美 元 ), 并 作 为 强 制 标 准 要 求 所 有 域 名 注 册 商 和 NS 服 务 器 都 支 持, 否 则 DNSSEC 始 终 只 能 是 服 务 于 极 小 部 分 域 名 4.5 给 Dnsmasq 启 用 DNSSEC 4.5.1 域 名 这 是 一 切 开 始 的 前 提 域 名 本 身 必 须 有 DNSSEC 签 名, 对 于 没 有 DNSSEC 签 名 的 域 名 来 说,DNSSEC 几 乎 不 能 提 供 任 何 额 外 的 保 护 作 用 但 目 前 做 了 DNSSEC 签 名 的 域 名 极 其 稀 少, 我 们 要 访 问 的 绝 大 部 分 被 污 染 的 域 名 都 没 有 这 个 签 名 这 部 分 是 在 文 章 写 完 一 段 时 间 后 添 加 的, 现 在 来 看, 在 域 名 本 身 不 做 DNSSEC 签 名 的 情 况 下, 指 望 DNSSEC 解 决 任 何 问 题 都 是 妄 想 4.5.2 客 户 端 必 须 有 对 应 的 DNSSEC 支 持 工 具,OpenWRT 上 默 认 的 的 dnsmasq 是 没 有 的, 需 要 我 们 替 换 为 dnsmasq-full 才 可 以, 这 个 可 以 通 过 使 用 OpenWRT 的 Image Generator 的 PACKAGES 参 数 来 实 现, 移 除 默 认 的 dnsmasq, 添 加 dnsmasq-full PACKAGES="-dnsmasq dnsmasq -full" 4.5.3 服 务 器 必 须 是 一 个 支 持 DNSSEC 扩 展 的 DNS 服 务 器, 这 种 服 务 器 目 前 在 国 内 非 常 少, 但 国 外 非 常 多, 我 知 道 Google DNS 是 支 持 的, 而 OpenDNS 是 明 确 不 支 持 的, 这 个 还 一 度 给 我 添 加 了 一 些 麻 烦 4.5.4 Dnsmsq 的 配 置 : 在 /etc/dnsmasq.conf 中, 或 者 如 果 你 在 dnsmasq.conf 中 通 过 conf-dir 参 数 指 定 了 一 个 配 置 目 录 的 话, 就 在 那 个 目 录 下 添 加 一 个 *.conf 文 件, 写 入 以 下 参 数 :

第 四 章 FREEROUTER V2 的 技 术 原 理 63 dnssec 这 个 参 数 是 基 本 的 启 用 DNSSEC 的 基 本 参 数, 表 示 要 求 查 询 域 名 记 录 的 DNSSEC 扩 展 信 息 trust -anchor=.,19036,8,2,49aac11d7b6f6446702e54a1607371607a1a41855200fd2ce1cdde32f24e8fb5 这 个 参 数 是 配 置 默 认 的 trus-anchor, 是 使 用 dnssec 必 须 加 入 的 参 数, 具 体 说 明 参 考 dnsmasq man page, 配 置 内 容 可 以 从 IANA 网 站 获 得 这 个 相 当 于 数 据 加 密 解 密 中 的 公 钥 (public-key), 理 想 情 况 ( 所 有 子 域 名 都 部 署 了 DNSSEC) 下, 我 们 只 需 要 添 加 根 域 (root zone) 的 public-key 就 可 以 了, 现 在 常 用 的 各 个 顶 级 和 国 别 域 名 的 部 署 情 况 已 经 基 本 达 到 理 想 状 况 了 dnssec -check -unsigned 这 个 参 数 需 要 非 常 注 意! 因 为 DNSSEC 默 认 只 会 对 有 DNSSEC 签 名 的 返 回 结 果 去 做 验 证, 如 果 一 个 返 回 结 果 是 未 签 名 的,Dnsmasq 默 认 会 相 信 这 个 数 据 是 真 实 有 效 的, 并 不 会 去 管 这 个 域 名 是 不 是 真 的 没 有 签 名, 还 是 别 人 伪 造 了 数 据 包 如 果 启 用 下 面 这 个 选 项,Dnsmasq 会 对 未 签 名 的 返 回 数 据 做 检 查, 确 定 域 名 是 真 的 没 有 签 名, 而 不 是 一 个 有 签 名 的 域 名 被 人 伪 造 了 无 签 名 的 数 据 来 欺 骗 你 要 检 查 域 名 是 真 的 没 签 名 还 是 假 的 没 签 名, 就 要 求 DNS 服 务 器 必 须 支 持 DNSSEC, 否 则 一 切 工 作 都 无 法 进 行, 域 名 就 无 法 解 析 对 于 114 这 类 不 支 持 DNSSEC 的 DNS 来 说, 它 返 回 的 所 有 数 据 都 是 没 有 签 名 的, 而 Dnsmasq 又 无 法 通 过 114 DNS 去 验 证 无 签 名 的 真 实 性, 那 么 所 有 的 域 名 解 析 都 会 失 效 dnssec -no-timecheck DNSSEC 对 于 服 务 器 返 回 的 签 名 数 据 是 有 一 个 信 赖 时 间 窗 口 的, 过 了 这 个 时 间 窗 数 据 就 不 再 被 信 赖 但 对 于 一 些 没 有 RTC 的 机 器 来 说, 这 就 产 生 了 一 个 蛋 生 鸡 鸡 生 蛋 的 问 题, 因 为 他 们 需 要 通 过 NTP 服 务 器 来 获 取 时 间, 可 是 获 取 NTP 服 务 器 的 地 址 又 必 须 先 解 析 NTP 服 务 器 的 域 名, 可 是 现 在 机 器 没 有 正 确 的 时 间, 导 致 信 赖 时 间 窗 口 无 效, 又 解 析 不 了 正 确 的 域 名 地 址, 这 就 麻 烦 大 了 下 面 这 个 参 数 对 于 OpenWRT 这 样 的 路 由 来 说 都 应 该 默 认 启 用, 启 用 之 后, 在 系 统 获 得 正 确 的 时 间 之 前, 解 析 结 果 不 受 信 赖 时 间 窗 口 的 限 制, 等 系 统 获 得 正 确 的 系 统 时 间 之 后, 这 个 信 赖 时 间 窗 口 机 制 才 重 新 开 启 配 置 完 成 之 后 : /etc/init.d/dnsmasq restart 重 启 Dnsmasq 服 务 即 可 生 效 我 刚 说 OpenDNS 给 我 造 成 了 一 点 小 麻 烦, 就 是 我 在 OpenWRT 中, 同 时 设 置 了 GoogleDNS 和 OpenDNS 作 为 默 认 的 DNS, 没 有 设 定 严 格 按 顺 序 查 询, 也 许 是 OpenDNS 的 速 度 稍 微 快 一 点 ( 我 这 里 Google DNS 延 迟 400 多 毫 秒 ) 结 果 Dnsmasq 默 认 用 了 OpenDNS, 而 OpenDNS 又 不 支 持 DNSSEC, 结 果 就 是 我 上 面 对 dnssec-check-unsigned 的 解 释,DNS 解 析 服 务 完 全 失 效 了

第 四 章 FREEROUTER V2 的 技 术 原 理 64 在 注 释 掉 dnssec-check-unsigned 这 个 参 数 后 可 以 解 析 数 据 了, 但 你 用 DNSSEC 配 合 一 个 不 支 持 DNSSEC 的 服 务 器 解 析 数 据, 怎 么 可 能 避 免 污 染 呢, 这 让 我 一 度 以 为 是 Dnsmasq 的 DNSSEC 没 有 工 作 在 把 OpenDNS 从 WAN 和 VPN 接 口 的 设 置 中 都 删 除 之 后, 确 保 了 系 统 只 用 Google DNS, 现 在 DNSSEC 才 开 始 工 作 了 4.5.5 DNSSEC 的 效 果 : 首 先 各 种 有 效 性 测 试 你 必 须 在 路 由 后 面 的 设 备 上 进 行, 你 直 接 在 路 由 上 用 dig 或 者 nslookup 查 询 的 话, 这 个 结 果 是 不 完 全 依 赖 Dnsmasq 的 Dig 也 好,nslookup 也 好, 这 些 都 不 等 同 于 你 系 统 在 使 用 的 resolver(dnsmasq), 虽 然 他 们 可 以 帮 你 检 查 resolver 的 工 作 情 况, 但 这 二 者 本 质 上 是 不 同 的 东 西, 这 个 基 本 概 念 必 须 清 楚 因 为 Dnsmasq 作 为 resolver, 他 有 自 己 的 dnssec 验 证 机 制, 对 于 不 合 格 的 数 据 会 丢 弃, 但 dig 和 nslookup 只 是 个 程 序, 他 只 处 理 并 显 示 收 到 的 udp 或 tcp 包, 它 们 并 不 知 道 去 对 dnssec 的 数 据 做 验 证 和 丢 弃 被 GFW 劫 持 后 的 DNS, 会 从 一 个 没 有 配 置 DNSSEC 的 服 务 器 上 优 先 返 回 虚 假 的 数 据, 这 就 出 现 了 一 个 极 大 的 : 1. 如 果 我 们 不 启 用 dnssec-check-unsigned 这 个 选 项, 那 么 Dnsmasq 就 会 接 受 GFW 劫 持 后 的 数 据, 防 护 彻 底 丧 失 2. 如 果 我 们 启 用 dnssec-check-unsigned 这 个 选 项,GFW 伪 造 的 返 回 包 是 不 包 含 DNSSEC 支 持 信 息 的,Dnsmasq 会 认 为 这 是 一 个 不 支 持 DNSSEC 的 服 务 器 返 回 的 结 果, 从 而 丢 弃 这 个 数 据 但 是 114 之 类 的 国 内 DNS 也 都 是 没 有 DNSSEC 的, 他 们 的 解 析 结 果 也 同 样 会 被 丢 弃, 那 么 我 们 就 无 法 把 国 内 的 域 名 交 给 这 些 国 内 DNS 解 析 来 解 决 CDN 和 解 析 速 度 问 题 因 为 我 们 常 用 的, 被 污 染 的 域 名 几 乎 都 没 有 做 DNSSEC 签 名, 所 以 DNSSEC 几 乎 不 能 给 我 们 提 供 任 何 帮 助 现 在 能 起 作 用, 也 仅 仅 是 因 为 GFW 伪 造 的 数 据 包 是 一 个 不 支 持 DNSSEC 的 DNS 服 务 器 的 格 式, 在 开 启 dnssec-check-unsigned 这 个 选 线 的 时 候,Dnsmasq 会 像 丢 弃 114DNS 的 解 析 结 果 一 样 丢 弃 了 GFW 的 伪 造 包 如 果 哪 天 GFW 更 新, 同 时 发 送 无 DNSSEC 和 有 DNSSEC 的 伪 造 包, 那 DNSSEC 就 完 全 帮 不 上 忙 了, 除 非 那 些 域 名 本 身 有 DNSSEC 签 名

第 四 章 FREEROUTER V2 的 技 术 原 理 65 4.6 2015 年 后 的 DNS 污 染 对 应 策 略 4.6.1 背 景 和 策 略 众 所 周 知 的 背 景 是, 从 2015 年 年 初 开 始,GFW 用 于 DNS 污 染 的 投 毒 IP 暴 增 到 了 数 千 个, 而 且 完 全 不 知 道 这 个 IP 的 产 生 规 则, 如 果 这 个 IP 库 的 产 生 是 个 随 机 过 程, 那 么 我 们 寄 希 望 于 linux 防 火 墙 来 过 滤 投 毒 IP 就 完 全 不 靠 谱 了 很 无 奈 的, 我 把 FreeRouter V2 的 DNS 策 略 修 改 回 了 最 早 期 的 FreeRouter V1 上 的 策 略, 只 不 过 把 白 名 单 模 式 改 成 了 黑 名 单 模 式 在 FreeRouter V1 中, 默 认 所 有 的 DNS 查 询 都 通 过 VPN 访 问 Google DNS 这 些 国 外 纯 净 的 DNS 来 实 现, 只 对 国 内 Alex 排 名 几 百 位 的 域 名 和 全 部 的.cn 域 名 以 及 部 分 大 网 站 的 CDN 子 域 名 使 用 国 内 DNS 解 析 这 样 做 的 好 处 是, 你 永 远 不 用 担 心 有 哪 个 你 不 知 道 被 污 染 的 域 名 使 用 了 国 内 DNS 查 询, 因 为 使 用 国 内 DNS 的 域 名 全 部 是 你 自 己 指 定 的 但 这 样 做 的 缺 点 也 很 明 显, 因 为 这 个 国 内 域 名 的 列 表 实 在 太 大 了, 毕 竟 大 部 分 人 绝 大 部 分 时 间 访 问 的 网 站 90% 都 是 国 内 网 站, 专 业 人 士 可 能 直 接 就 开 全 局 VPN 了, 不 用 费 这 个 功 夫 因 为 列 表 大, 就 很 难 完 整, 难 免 会 碰 到 国 内 网 站 被 解 析 到 国 外 节 点 上 的 情 况 在 FreeRouter V2 中, 我 采 用 的 是 黑 名 单 模 式, 即 默 认 所 有 域 名 都 从 国 内 DNS 解 析, 但 所 有 我 们 要 翻 墙 的 域 名 都 通 过 VPN 走 Google DNS 解 析 因 为 被 污 染 域 名 的 网 站 始 终 是 少 数, 所 以 我 们 的 被 屏 蔽 域 名 列 表 是 被 污 染 域 名 列 表 的 超 集, 只 要 保 证 了 这 个 列 表 里 的 域 名 都 是 从 干 净 的 DNS 解 析 的, 那 基 本 就 没 有 问 题 了 但 这 种 方 式 也 不 是 没 有 问 题 的, 最 大 的 问 题 是 VPN 断 线 后 国 外 的 DNS 就 不 再 纯 净 了, 污 染 依 然 可 以 进 来, 这 也 是 为 什 么 之 前 我 这 么 倾 向 于 用 iptables 过 滤 的 原 因, 因 为 那 样, 嗯, 超 强 防 侧 漏 提 供 持 久 保 护 但 是 没 办 法, 谁 让 GFW 这 帮 小 伙 这 么 拼 呢, 我 现 在 是 真 没 时 间 跟 他 们 玩 了 所 以 你 能 做 的 就 是 找 个 靠 谱 点 的 VPN, 另 外 Dnsmasq 本 身 有 缓 存 机 制, 如 果 在 缓 存 时 间 失 效 之 前 VPN 能 重 新 连 上, 其 实 问 题 也 不 大, 至 少 我 用 了 这 段 时 间 来 看 还 真 没 什 么 问 题 4.6.2 实 际 操 作 实 际 操 作 也 很 简 单, 依 然 依 靠 我 们 伟 大 的 Dnsmasq, 例 如 google.com 被 封 了, 我 们 除 了 用 ipset 把 google.com 加 入 VPN 通 道 之 外, 还 要 加 一 句 让 google.com 通 过 8.8.8.8 来 解 析 : server=/google.com/8.8.8.8

第 四 章 FREEROUTER V2 的 技 术 原 理 66 同 时 我 们 早 就 说 过, 国 外 的 DNS 必 须 通 过 VPN 访 问 才 是 干 净 的, 所 以 我 们 在 /etc/ppp/ip-up.d/vpnup.sh 中 添 加 一 条 命 令, 让 8.8.8.8 走 VPN 通 道 route add -host 8.8.8.8 dev $VPN_DEV 至 于 为 什 么 选 Google DNS, 这 完 全 是 个 人 感 觉, 你 喜 欢 OpenDNS 其 实 也 是 差 不 多 的, 因 为 OpenDNS 也 早 就 宣 布 不 劫 持 错 误 域 名 到 任 何 广 告 页 面 了, 一 样 很 了 不 起 在 速 度 上, 其 实 当 你 通 过 VPN 访 问 这 些 DNS 服 务 器 之 后, 基 本 上 这 个 速 度 就 取 决 于 你 VPN 的 速 度 了, 国 外 的 VPN 服 务 器 到 这 些 DNS 服 务 器 的 耗 时 基 本 都 是 可 以 忽 略 不 计 的 同 时, 我 们 之 前 在 /etc/firewall.user 中 添 加 的 那 些 过 滤 规 则, 全 都 不 需 要 了, 删 掉 就 行 了 没 必 要 注 释 掉, 留 着 真 没 什 么 意 义, 这 么 多 年 来 我 只 见 过 墙 往 前 推, 还 没 见 过 墙 往 后 倒 4.6.3 一 个 小 脚 本 如 果 把 上 面 的 dnsmasq 配 置 项, 为 几 百 个 域 名 写 上 几 百 行, 其 实 也 是 挺 烦 人 的 所 以 我 写 了 个 小 脚 本, 代 码 如 下 : #!/bin/sh set -x ConfFile="./gfw.conf" TextFile="./GfwList.txt" if [ $1 = '--sort ' ] then cat $ConfFile sort grep ipset sed -e "s#^[^\/]*\/\([^\/]*\)\/.*\$#\1#g" >$TextFile fi rm -rf $ConfFile cat $TextFile while read SingleDomain do echo "ipset=/ $SingleDomain/vpn">>$ConfFile echo "server=/$singledomain /8.8.8.8">>$ConfFile done 功 能 很 简 单, 如 果 你 在 同 目 录 下 放 一 个 GfwList.txt 文 件, 里 面 一 行 一 个 写 入 需 要 翻 墙 的 域 名, 直 接 执 行 后 就 会 给 你 生 成 一 份 适 合 的 gfw.conf 文 件 用 于 dnsmasq 的 配 置 考 虑 到 一 些 处 女 座 强 迫 症 患 者 可 能 喜 欢 所 有 域 名 按 序 排 列, 我 加 了 个 sort 参 数, 如 果 你 在 同 目 录 下 有 一 个 gfw.conf 文 件, 配 合 这 个 参 数 运 行, 脚 本 就 会 把 gfw.conf 里 的 域 名 全 部 抽 取 出 来 排 序 好, 生 成 一 份 有 序 的 GfwList.txt, 然 后 再 生 成 一 份 有 序 的 gfw.conf 文 件 替 换 原 文 件

第 四 章 FREEROUTER V2 的 技 术 原 理 67 然 后 你 再 运 行./apply.sh 脚 本, 这 个 脚 本 会 自 动 把 同 目 录 下 的 gfw.conf 文 件 复 制 到 对 应 的 FreeRouter V2 项 目 的 目 录 下, 然 后 重 启 Dnsmasq 服 务 让 这 些 改 动 生 效 不 要 感 激 我, 这 是 情 怀

第 章 FreeRouter 实 战 如 果 没 有 爱, 一 个 故 事 怎 么 会 有 幸 福 的 结 局? 5.1 FreeRouter V2 的 工 作 流 程 程 : 我 们 前 面 已 经 把 FreeRouter V2 所 用 到 的 技 术 全 部 讲 完 了, 在 开 始 实 际 部 署 前 先 总 结 一 下 整 个 工 作 流 1. 客 户 端 发 起 访 问 Twitter.com 的 请 求, 同 时 发 出 DNS 解 析 请 求, 请 求 送 达 路 由 器 2. 路 由 器 上 的 Dnsmasq 向 所 有 DNS 服 务 器 发 起 解 析 请 求 3. GFW 抢 先 返 回 虚 假 解 析 结 果, 被 iptables 防 火 墙 拦 截 4. 真 正 的 DNS 服 务 器 返 回 的 数 据 随 后 到 达, 被 Dnsmasq 接 受 5. Dnsmasq 发 现 twitter.com 在 配 置 的 IPSET 列 表 里, 将 这 个 解 析 的 IP 加 入 IPSET 6. iptables 防 火 墙 把 目 标 地 址 属 于 这 个 IPSET 的 数 据 全 部 打 上 标 签 7. ip rule 规 则 把 打 上 标 签 的 数 据 全 部 加 入 一 个 table 8. ip route 把 这 个 table 里 的 数 据 全 部 转 发 到 VPN 接 口 9. 对 twitter.com 的 访 问 数 据 全 部 通 过 VPN 接 口 进 行, 绕 过 GFW 的 IP 阻 断 如 果 文 字 不 好 理 解, 看 图 吧 : 68

第 五 章 FREEROUTER 实 战 69 图 5.1: FreeRouter V2 工 作 流 程

第 五 章 FREEROUTER 实 战 70 5.2 OpenWRT 基 础 5.2.1 OpenWRT 是 什 么? OpenWRT 的 官 方 网 站 在 这 里 :https://openwrt.org/ 首 先 你 要 知 道 OpenWRT 是 什 么,OpenWRT 是 一 个 基 于 Linux 内 核 的 第 三 方 路 由 器 操 作 系 统, 和 一 般 的 桌 面 Linux 系 统 不 同, 路 由 器 的 操 作 系 统 是 实 时 系 统 1, 但 什 么 是 实 时 系 统 其 实 和 你 们 关 系 不 大, 不 用 管 它 了 你 要 知 道 的 是,OpenWRT 能 够 成 为 一 个 路 由 器 的 系 统, 除 了 内 核 之 外 主 要 依 靠 的 是 大 量 的 Linux 网 络 工 具 和 内 核 模 块, 是 这 些 工 具 和 模 块 提 供 了 OpenWRT 的 网 络 管 理 能 力, 要 使 用 特 定 的 功 能 就 必 须 在 OpenWRT 中 有 对 应 的 软 件 包 (Package) 支 持 所 谓 的 第 三 方, 指 的 是 一 般 的 路 由 器 在 出 厂 前 基 本 都 不 会 预 装 这 个 系 统, 如 果 你 要 使 用, 就 要 像 手 机 刷 机 一 样 自 己 把 OpenWRT 固 件 刷 进 你 的 路 由 如 果 你 缺 乏 OpenWRT 的 基 础 知 识, 请 去 阅 读 OpenWRT 的 官 方 Wiki, 我 不 会 去 帮 你 解 答 和 项 目 无 关 的 OpenWRT 的 问 题 5.2.2 我 的 路 由 能 刷 OpenWRT 吗? OpenWRT 提 供 另 一 个 支 持 OpenWRT 的 硬 件 Wiki 列 表, 注 意 ipad 上 的 safari 可 能 打 不 开 这 个 页 面, 换 chrome 或 者 用 桌 面 版 的 其 他 浏 览 器 当 然 这 个 wiki 的 更 新 有 时 候 并 不 及 时, 你 可 以 直 接 去 他 们 的 下 载 站 点, 根 据 自 己 路 由 器 的 CPU 型 号, 去 trunk 目 录 里, 选 择 对 应 的 目 录 查 看 是 否 有 自 己 的 路 由 器 对 应 的 固 件, 地 址 是 : http://downloads.openwrt.org/snapshots/trunk/ 最 新 的 代 码 和 最 新 添 加 的 硬 件 支 持 都 在 trunk 目 录 里, 但 trunk 目 录 也 意 味 着 这 是 开 发 中 的 代 码, 可 能 伴 随 着 一 些 未 知 的 bug 和 不 稳 定 性 一 般 来 说,OpenWRT 支 持 最 好 最 全 面 的 是 Atheros 的 AR71xx 系 列 的 CPU, 其 次 是 BroadCom 的 一 些 老 的 型 号 CPU 你 也 许 可 以 再 国 内 的 一 些 论 坛 找 到 一 些 没 被 OpenWRT 官 方 支 持 的 路 由 器 的 OpenWRT 固 件, 虽 然 他 们 提 供 了 固 件, 但 OpenWRT 官 方 未 必 提 供 了 对 应 芯 片 的 Package 支 持, 要 知 道 每 种 芯 片 对 应 的 Package 是 要 用 各 自 芯 片 的 SDK 重 新 编 译 才 能 用 的 所 以, 除 非 你 动 手 能 力 超 强 能 自 己 搞 定 所 有 的 package 编 译, 我 从 来 都 不 会 建 议 你 买 这 些 没 官 方 支 持 的 路 由 1 Real Time OS

第 五 章 FREEROUTER 实 战 71 5.2.3 我 的 路 由 需 要 多 大 ROM? 实 现 一 个 有 管 理 界 面 (luci), 能 安 装 完 FreeRouter V2 全 部 功 能 脚 本 的 路 由, 需 要 你 的 路 由 器 至 少 有 4M 的 Flash 空 间, 一 般 而 言 这 个 都 是 可 以 满 足 的 如 果 你 希 望 充 分 发 挥 路 由 的 功 能, 例 如 添 加 文 件 共 享, USB 共 享, 脱 机 下 载 这 些 额 外 的 功 能, 建 议 至 少 有 8MB 的 空 间, 这 些 东 西 和 本 项 目 无 关, 不 要 来 烦 我 如 果 你 有 兴 趣 研 究 GFW, 或 者 学 习 linux 的 网 络 管 理, 那 么 你 可 能 需 要 安 装 一 些 linux 的 调 试 跟 踪 工 具 在 路 由 上, 这 样 也 至 少 建 议 有 8MB 的 空 间 5.2.4 我 应 该 下 载 选 哪 个 版 本 的 固 件? 这 里 的 版 本 有 两 个 概 念, 一 个 是 真 正 的 版 本, 你 可 以 看 到 在 他 们 的 下 载 目 录 首 页, 有 backfire, attitude_adjustment, 这 些 目 录, 这 些 都 是 OpenWRT 的 重 大 版 本 更 新, 类 似 windows xp,windows 7 这 样 的 概 念, 当 前 最 新 的 正 式 发 布 的 版 本 是 attitude_adjustment, 正 在 开 发 中 的 barrier_breaker 已 经 发 布 了 RC2 版 本 目 前 barrier_breaker RC2 已 经 很 稳 定 了, 当 然 trunk 目 录 中 的 最 新 代 码 可 能 会 因 为 导 入 新 功 能 而 产 生 之 前 没 有 的 bug, 并 不 是 说 最 新 就 一 定 最 稳 定,RC 版 的 稳 定 性 一 般 来 说 比 trunk 版 要 高 另 外 一 个 版 本 概 念, 就 是 固 件 的 文 件 系 统 格 式 和 升 级 方 法 一 些 老 的 路 由 上 可 能 只 有 jffs 文 件 系 统 的 支 持, 而 新 的 一 般 都 支 持 suqashfs 你 不 需 要 知 道 这 两 者 的 具 体 内 容, 只 需 要 知 道 suqashfs 允 许 你 对 整 个 路 由 文 件 系 统 进 行 操 作, 而 jffs 文 件 系 统 只 允 许 你 对 一 个 叫 jffs 的 文 件 夹 的 内 容 进 行 修 改, 这 是 非 常 不 方 便 的, 本 书 的 讨 论 默 认 基 于 suqashfs 文 件 系 统 进 行 而 在 升 级 方 式 上, 如 果 你 路 由 现 在 的 固 件 还 是 出 厂 的 固 件, 就 应 该 选 择 文 件 名 后 面 带 factory 的, 表 示 从 原 厂 固 件 开 始 升 级, 升 级 之 后 就 是 OpenWRT 系 统 了 如 果 你 已 经 刷 成 OpenWRT 系 统 了, 只 需 要 下 载 sysupgrade 版 本 就 行 了 5.2.5 如 何 刷 固 件? 在 前 面 提 到 的 那 个 wiki 页 面 中, 点 击 进 入 每 个 支 持 OpenWRT 的 路 由 的 wiki 页 面 后, 一 般 都 会 有 很 详 细 的 刷 机 过 程 指 导, 大 部 分 情 况 下 你 只 需 要 下 载 factory 版 的 固 件, 然 后 从 原 厂 固 件 的 固 件 升 级 页 面 直 接 升 级 就 可 以 了 具 体 操 作, 请 自 行 阅 读 相 关 的 刷 机 说 明 5.2.6 为 什 么 刷 了 固 件 后 打 不 开 路 由 管 理 界 面? 第 一 次 刷 完 官 方 的 OpenWRT 固 件 后, 路 由 器 的 地 址 一 般 都 是 192.168.1.1, 如 果 不 确 定, 可 以 用 前 面 教 你 们 的 traceroute 命 令 查 看 第 一 个 路 由 节 点 是 什 么.openwRT 官 方 的 固 件 默 认 都 不 提 供 luci 管 理 界 面, 只

第 五 章 FREEROUTER 实 战 72 提 供 23 端 口 的 telnet 进 行 远 程 管 理 这 个 端 口 默 认 没 有 密 码, 用 telnet 登 录 上 之 后 你 可 以 自 己 安 装 luci 管 理 界 面 5.2.7 如 何 安 装 各 种 package? 在 OpenWRT 下 安 装 各 种 软 件 和 在 ubuntu 下 安 装 软 件 几 乎 是 一 样 的, 只 是 命 令 有 些 不 同, 以 安 装 luci web 管 理 界 面 package 为 例,telnet 登 录 到 路 由 之 后, 执 行 如 下 命 令 : opkg update 这 个 过 程 是 从 openwrt 官 方 更 新 源 列 表, 对 于 trunk 版 的 固 件, 经 常 会 因 为 trunk 目 录 里 的 代 码 更 新 导 致 版 本 需 求 和 你 现 有 的 固 件 不 匹 配, 所 以 你 最 好 能 学 会 后 面 自 己 打 包 固 件 的 方 法 opkg install luci 这 是 安 装 luci 管 理 界 面, 如 果 一 个 pacakge 有 什 么 其 他 依 赖 的 package, 也 会 一 并 被 安 装, 不 用 你 额 外 操 心 opkg install luci -ssl 如 果 你 需 要 的 话, 还 可 以 额 安 装 luci-ssl, 提 供 ssl 加 密 的 管 理 界 面 登 录 opkg install luci -i18n -chinese 如 果 你 需 要 中 文 界 面, 就 安 装 对 应 的 中 文 支 持 luci 管 理 界 面 本 身 的 运 行 需 要 一 个 http 服 务 器 组 件 叫 做 uhttpd, 在 你 安 装 luci 的 时 候 默 认 就 会 安 装 这 个 组 件, 但 它 不 会 自 己 启 动, 所 以 你 要 手 工 启 动 它 : /etc/init.d/uhttpd start 为 了 让 以 后 每 次 重 启 路 由 都 自 动 启 动 uhttpd 服 务, 需 要 使 能 这 个 服 务 : /etc/init.d/uhttpd enable 更 完 整 的 使 用 OPKG 命 令 安 装 package 的 指 导, 请 参 考 OpenWRT 官 方 页 面 介 绍

第 五 章 FREEROUTER 实 战 73 5.3 FreeRouter V2 需 要 的 组 件 FreeRouter V2 使 用 了 一 些 普 通 人 可 能 用 不 到 的 组 件, 依 次 介 绍 必 要 的 组 件 : luci, 可 选 项 目 :luci-ssl,luci-i18n-chinese,luci-app-upnp luci-app-qos luci-app-samba 这 是 路 由 的 管 理 界 面, 前 面 已 经 提 到 了, 可 以 方 便 我 们 添 加 管 理 各 种 接 口, 虽 然 不 是 必 须 的, 但 有 这 个 确 实 方 便 很 多 后 面 几 个 可 选 项 目, 分 别 是 管 理 页 面 的 ssl 支 持, 中 文 支 持,upnp 管 理,qos 管 理, 和 samba 共 享 管 理 ipset 用 于 创 建 ipset iptables-mod-ipopt 和 kmod-ipt-ipopt iptables 对 应 的 标 签 处 理 模 块 和 内 核 支 持 模 块, 用 于 实 现 让 iptables 给 数 据 添 加 标 签 (fwmark) ip 用 于 ip rule 添 加 和 ip route 路 由 表 管 理 iptables-mod-filter 和 kmod-ipt-filter iptables 的 string 模 块 和 对 应 的 内 核 支 持 模 块 iptables-mod-u32 和 kmod-ipt-u32 iptables 的 u32 模 块 和 对 应 的 内 核 支 持 模 块 ppp-mod-pptp 用 于 连 接 PPTP VPN 的 接 口 模 块, 当 且 仅 当 你 使 用 PPTP VPN 的 时 候 才 需 要 openvpn-ssl 用 于 连 接 Open VPN 的 接 口 模 块, 当 且 仅 当 你 使 用 Open VPN 的 时 候 才 需 要.PPTP 和 OpenVPN 两 种 接 口 方 案 你 只 能 选 择 一 种 使 用, 不 能 同 时 使 用. dnsmasq-full 这 个 需 要 特 别 注 意!OpenWRT 官 方 固 件 自 带 的 Dnsmasq 是 lite 版 本, 不 带 IPSET 功 能, 也 没 有 DNSSEC 支 持 ( 虽 然 这 个 没 什 么 太 大 用 处 ), 必 须 替 换 成 dnsmasq-full 版 本 才 可 以 使 用 dnsmasq-full 是 官 方 提 供 的 版 本, 不 需 要 自 己 重 新 编 译

第 五 章 FREEROUTER 实 战 74 以 下 都 是 可 选 项 目, 适 合 喜 欢 折 腾 的 人, 普 通 用 户 不 需 要 这 些 东 西 : bash 和 bash-completion OpenWRT 自 带 的 shell 是 Ash, 非 常 简 陋, 很 多 命 令 和 功 能 都 不 能 使 用, 限 制 也 很 多, 你 可 以 自 己 安 装 bash 如 果 需 要 把 默 认 的 shell 替 换 成 bash, 需 要 修 改 /etc/passwd 文 件, 把 里 面 的 /bin/ash 改 成 /bin/bash, 重 启 后 就 可 以 生 效 了 vim-full 和 vim-runtime vim 是 这 个 世 界 上 最 好 的 编 辑 器, 没 有 之 一,emacs 逆 党 速 速 退 散!SlickEdit 用 户 们, 跟 我 一 起 去 抗 议 SE 一 年 60 刀 的 维 护 费 吧, 太 黑 了 bind-dig 和 bind-libs 安 装 我 们 前 面 说 到 的 Dig 命 令 工 具 curl 我 的 某 些 脚 本 会 用 到 curl, 这 个 东 西 比 较 大, 大 概 有 1MB 5.4 部 署 FreeRouterV2 5.4.1 系 统 的 基 本 设 置 刷 好 固 件 后 首 先 从 luci 界 面 登 录 ( 假 定 你 已 经 安 装 好 了 所 有 必 需 的 package), 默 认 是 没 有 密 码 的 :

第 五 章 FREEROUTER 实 战 75 图 5.2: luci 登 录 界 面 登 录 后 按 提 示 跳 转 到 密 码 设 定 页 面, 设 定 路 由 器 管 理 密 码, 点 击 保 存 应 用 这 个 密 码 也 是 你 用 ssh 管 理 路 由, 和 用 winscp 部 署 文 件 时 用 的 密 码, 用 户 名 默 认 是 root 图 5.3: 密 码 设 定 页 面 第 一 次 设 定 密 码 后 稍 微 等 待 几 分 钟, 因 为 后 台 生 成 SSH Key 的 时 间 非 常 长, 然 后 就 可 以 用 你 习 惯 的 Shell 工 具 登 录 了,Cygwin 就 是 很 好 的 工 具, 文 件 管 理 在 Windows 下 推 荐 用 免 费 的 WinSCP

第 五 章 FREEROUTER 实 战 76 5.4.2 PPTP VPN 接 口 设 定 PPtP 依 次 点 击 管 理 页 面 上 方 的 网 络 接 口, 点 击 左 下 方 的 添 加 新 接 口, 接 口 名 称 随 便 填, 协 议 选 择 图 5.4: 开 始 建 立 VPN 接 口 按 照 你 自 己 的 VPN 服 务 器 信 息 和 用 户 名 密 码 填 写 :

第 五 章 FREEROUTER 实 战 77 图 5.5: 填 写 服 务 器 IP, 用 户 名 和 密 码 在 高 级 设 置 中, 取 消 勾 选 使 用 默 认 网 关 : 图 5.6: 不 要 选 使 用 默 认 网 关 防 火 墙 设 置 中, 把 VPN 接 口 设 置 在 和 WAN 接 口 同 一 个 区 域, 否 则 VPN 接 口 会 被 防 火 墙 限 制 在 内 网 :

第 五 章 FREEROUTER 实 战 78 图 5.7: 配 置 VPN 接 口 的 防 火 墙 区 域 全 部 设 置 完 之 后 点 击 保 存 应 用, 如 果 正 常 连 接 上 的 话, 应 该 可 以 看 到 这 个 接 口 有 数 据, 否 则 数 据 都 是 0. 通 过 SSH 登 录 后, 如 果 VPN 连 接 成 功, 使 用 ifconfig 命 令 应 该 可 以 看 到 我 们 自 己 刚 才 设 定 的 VPN 接 口, 名 称 应 该 是 pptp- 我 们 设 定 的 接 口 名 字 5.4.3 Open VPN 接 口 设 定 相 对 PPTP 而 言,OpenVPN 接 口 的 设 定 稍 微 麻 烦 一 点 点, 因 为 原 来 OpenWRT 官 方 提 供 的 luci-appopenvpn 这 个 luci 管 理 组 件 已 经 不 再 提 供 了 也 许 你 可 以 自 己 去 找 其 他 非 官 方 支 持 的 版 本, 但 这 不 在 我 们 考 虑 的 范 围,FreeRouter V2 只 使 用 OpenWRT 官 方 提 供 的 组 件 注 意, 本 节 的 内 容 可 以 完 全 独 立 于 FreeRouter V2 项 目 本 身, 只 作 为 OpenVPN 在 OpenWRT 上 的 连 接 指 南 来 看 这 也 意 味 着 你 在 这 节 碰 到 的 问 题 都 不 是 FreeRouter V2 项 目 本 身 的 问 题, 建 立 好 OpenVPN 连 接 是 你 自 己 要 负 责 的 工 作 这 里 我 们 假 定 你 用 的 OpenVPN 是 tunnel 形 式 而 不 是 Tap 形 式, 这 点 很 重 要, 否 则 接 口 名 是 匹 配 不 上 的 但 这 肯 定 不 是 选 tunner 形 式 接 口 的 原 因, 具 体 的 原 因 可 以 看 看 这 个 页 面 的 介 绍,tap 一 般 指 用 于 基 于 layer2 mode 的 VPN, 但 layer2 mode 的 OpenVPN 只 有 Windows 客 户 端 才 能 连 上. 所 以 一 般 来 说, 你 们 买 的 和 自 己 用 OpenVPN Access Server 搭 建 的 VPN 都 是 tunnel 类 型, 这 也 是 最 普 遍 的 OpenVPN 形 式. 如 果 你 不 确 定 这 一 点, 查 看 服 务 商 给 你 提 供 的 *.ovpn 或 者 *.conf 格 式 的 客 户 端 配 置 文 件, 看 到 如 下 字 样 就 说 明 是 tunnel 形 式 的 了 : dev tun dev-type tun 第 一 步 和 PPTP 是 一 样 的, 依 次 点 击 管 理 页 面 上 方 的 网 络 接 口, 点 击 左 下 方 的 添 加 新 接 口,

第 五 章 FREEROUTER 实 战 79 图 5.8: 添 加 一 个 新 接 口 但 是 这 里 我 们 选 不 配 置 协 议, 最 上 面 的 接 口 名 你 可 以 随 便 写, 但 下 方 包 括 以 下 接 口 部 分 我 们 必 须 手 工 填 入 tun0, 因 为 这 个 是 tunnel 形 式 的 OpenVPN 连 接 成 功 后 默 认 创 建 的 接 口 名 但 如 果 你 的 VPN 服 务 商 有 其 他 的 ifconfig 选 项 的 推 送, 也 许 会 导 致 你 的 openwrt 上 建 立 的 接 口 名 不 同 这 种 情 况 下, 你 需 要 先 连 接 openvpn, 查 看 连 接 后 建 立 的 接 口 名, 再 回 到 这 里 建 立 同 名 的 接 口