VPN 到底做了什么——以及大多数解释都会跳过的那句话
VPN 把你的流量加密后发给一台服务器,由这台服务器解密后再转发出去。其结果并不是你的流量变得不可见,而是能看到它的那批人变了。之前:咖啡馆的 Wi-Fi、酒店、移动运营商、你家里的 ISP,以及凌驾于它们之上的任何国家级中间设备——这些人都能看到你访问了哪些网站,大致做了多少事。之后:他们只能看到一条流向单一地址、长期存在的加密流量,看不到里面装的是什么。作为交换,你服务器所在的网络,如今占据了他们让出的这个位置。
这就是全部的原理,值得说得直白一些,因为营销话术里的「在线隐身」会让人期待一种这套设计根本给不了的保护。VPN 改变的是观察位置。它是否有用,完全取决于对你所担心的那个具体问题而言,新的观察位置是否比旧的更好。把观察者从一个你从未听说过的酒店网络,换成你自己选定国家、自己选定的数据中心、运行着你自己配置的软件的地方,通常是一笔很划算的交易。而把它从你家的 ISP 换成一家在播客里打广告的公司,则是另一笔交易,好坏没那么容易看清。
自建只改变这句话的后半段,其他什么都不会变。加密算法完全相同——WireGuard 的设计文档描述的握手过程,无论对端是你自己还是某个服务商,都是同一套。真正改变的是:谁在隧道另一端持有私钥、谁想记录日志时能不能做到、是否存在一个客户数据库、还有谁在和你共用同一个出口地址。这四点差异,就是自建 VPN 利与弊的全部所在,而它们指向的结论并不总是一致的。
自建出口还是商业出口:你实际在做的那笔交易
人的直觉是把自建当作绝对更私密的选项,对大多数威胁模型来说确实如此。这里没有服务商持有你的账户记录,没有可能因别人的账户而被查封的共享基础设施,没有需要你去盲目相信的隐私政策,也不存在你毫不知情就被悄悄改变的日志策略。密钥在你自己手里。没有谁需要被信任,因为没有谁处在能够背叛你的位置上。
但有一个维度商业 VPN 完胜,而且差距不小。它们的出口地址同时被成百上千人共用,网站看到一个来自该地址的请求,几乎无法判断到底是这群人中的谁发出的。而你的出口地址只被你一个人共用——也就是没有共用。它是固定的,只属于一个客户,你通过它访问的每一个网站看到的都是同一个标识符——和家庭 IP 地址一模一样,只不过换了个国家。如果你想要的是隐没在人群之中,一个人的人群做不到这一点。
| 维度 | 自建 VPS | 商业 VPN | 谁更胜一筹 |
|---|---|---|---|
| 谁在使用你的出口 IP | 没有别人——只属于你一个人 | 成百上千人,持续轮换 | 商业 VPN 明显胜出 |
| 谁可能记录你的流量 | 只有你自己,且仅在你主动配置的情况下 | 服务商,依据一份你无法验证的政策 | 自建更优 |
| 需要多少信任 | 不需要——私钥在你手中 | 完全信任,仅靠第三方审计缓解 | 自建更优 |
| 向运营方索取信息能得到什么 | 取决于你的主机商掌握了你账户的哪些信息 | 一个账户、一条支付记录、会话元数据 | 取决于两者各自的购买方式 |
| 每月成本 | $8.50 即可获得一整台服务器,设备数量不限 | 每份订阅 $5–13,且限制设备数 | 使用设备数超过一台时自建更划算 |
| 选择出口国家 | 只有一个,即你部署的那个 | 数十个,点击即可切换 | 商业 VPN 胜出 |
| 流媒体与地区限制服务 | 作为数据中心 IP 被封锁 | 作为已知 VPN 地址段被封锁 | 老实说,两者都不行 |
| 能否挺过国家级防火墙 | 你的地址未知且未被收录 | 服务商地址段已被收录并封锁 | 自建明显胜出 |
请把这张表当成两个不同的问题来看,而不是一个总分。如果你的对手是你此刻所在的网络——出售浏览数据的 ISP、检查 TLS 的公司、咖啡馆、酒店、实施审查的防火墙——自建在每一项关键指标上都会胜出,因为你要躲开的对象处于隧道上游,根本看不穿它。如果你的对手是你访问的那个网站,它想把你今天的会话和上个月的会话关联起来,那么这时候人群才是真正的保护,私有出口反而比什么都不用还糟。真正处于第二种情形的人非常少,而这少数人多半应该去读一读Tor,而不是 VPN。
人们之所以把这两者混为一谈,是因为这个行业一直在用两种说法推销同一个产品。商业 VPN 唯一站得住脚的卖点就是人群效应。宣传里的其他一切——无日志承诺、审计、注册地——都是在设法弥补一个事实:你把流量交给了一家公司。自建去掉了这家公司,但它没法凭空造出一个人群。
什么时候自建才是正确答案
最典型的情形,是你既无法掌控、也无法信任的网络:会议现场的 Wi-Fi、酒店、机场、房东提供的共享网络,还有在合法监听手段强硬的国家漫游上网。在这些场景里,威胁都是本地的、被动的,只要把隧道通向别处,威胁就能被彻底消除。这是最不起眼的一种用例,但不起眼不代表不重要——它几乎适用于每一个人,几乎每周都会用到。
第二种情形是司法管辖区。一条在苏黎世出口的隧道,意味着离开它的流量受瑞士法律管辖,经由瑞士的传输运营商承载,处于管辖你原本那条连接的任何政权触及范围之外。对于那些身处法律强制 ISP 留存并移交浏览记录的国家的人来说,这绝不是什么抽象概念。刻意选择出口国家,是少数几个效果清晰可见的隐私决策之一,值得在部署之前而不是之后,读一读司法管辖区对比指南。
第三种情形是审查。国家级防火墙封锁商业 VPN 的办法是逐一收录它们的地址段,这并不难,因为这些地址段本身是公开的、被出售的、被大量使用的。而托管网络里的一个单独 VPS 地址不在任何这样的名单上——不是因为它多聪明,只是因为没人有理由去把它收录进去。这正是最可靠的规避审查方案向来都是小规模、个人化的,而不是大规模、商业化的原因,也是唯一一个人群效应反而成为负担的地方。
第四种情形是你需要一个稳定、干净、可控的出口去做浏览之外的事情:从外部访问家庭实验室、让一个小团队访问内部服务而不必对外暴露、运行一个需要固定源地址的服务,或者在一个不会被悄悄换掉的地址上保持一个长期存活的会话。这些都是商业 VPN 完全解决不了的网络工程问题,而一台 $8.50 的 VPS 一个下午就能搞定。VPN 工作负载页面介绍了具体的规格选择和网络细节。
反过来说:如果你没办法持续给服务器打补丁,那就别自建。一台疏于维护、开着 SSH 端口的 VPS,隐私结果比任何商业 VPN 都糟糕,因为一个被攻陷的出口会看到一切,还听命于别人。自建是用一个信任问题换来一个运维问题,只有在你真的会去做这些运维工作时,这笔交易才划算——而本指南的最后一节会告诉你,这份运维工作每月大约只需要十分钟。
十分钟搞定 WireGuard:完整配置详解
WireGuard 小到可以通读全部源码。它运行在 Linux 内核里,只使用单一 UDP 端口,采用一套固定的现代密码学原语,没有协商过程,整个配置也只涉及两类模块:一个描述本机的 [Interface],以及每台允许连接的设备各一个 [Peer]。这里没有证书颁发机构,没有可能选错的密码套件,也没有需要调优的守护进程。正是这种极简设计,让它很难被配置出危险的错误,也是它几乎在所有场合都取代了其他方案的原因。
先安装软件包,再生成密钥对。先执行 umask 077,确保私钥不会以全局可读的权限写入——如果真的这样,wg-quick 会大声抱怨,而且它这么做是对的。wg genkey 生成私钥,wg pubkey 从中推导出公钥。每个客户端都要照做一遍。公钥需要互相交换;私钥则永远不离开生成它的那台机器。
接着编写 /etc/wireguard/wg0.conf。下表就是一份可用服务器配置的完整内容——没有为了简洁而省略任何部分。
| 配置指令 | 作用 | 配置错误会出什么问题 |
|---|---|---|
[Interface] | 开启描述本机的配置块 | — |
Address = 10.66.66.1/24, fd42:42:42::1/64 | 服务器在隧道内的地址,同时覆盖两个协议族 | 省略 v6 这一行,客户端在隧道内就没有 v6 地址,隧道外则可能用回真实地址 |
ListenPort = 51820 | 服务器监听的唯一 UDP 端口 | 被上游防火墙拦截后什么都连不上;没有 TCP 回退方案 |
PrivateKey = <server.key> | 服务器私钥,直接粘贴在配置内 | 文件全局可读,wg-quick 会拒绝启动 |
PostUp = ...masquerade... | 配置源 NAT,让隧道数据包能通过公网接口离开 | 缺少此项,数据包到达服务器后即被丢弃——隧道能连上,但什么都加载不出来 |
PostDown = ...delete... | 接口关闭时移除同一条规则 | 重启多次后残留 NAT 规则不断累积 |
[Peer] | 为一台客户端设备开启配置块 | — |
PublicKey = <client.pub> | 识别并验证该设备身份 | 这就是整套访问控制模型——密钥即是账户本身 |
AllowedIPs = 10.66.66.2/32, fd42:42:42::2/128 | 在服务器上,指该 peer 可使用的地址 | 范围过宽会让一个客户端冒充另一个;在客户端配置中它的含义则完全不同 |
配置文件之外,还有两件事必须做对。内核必须愿意转发:设置 net.ipv4.ip_forward=1 和 net.ipv6.conf.all.forwarding=1,并写入 /etc/sysctl.d/,让它们在重启后依然生效。另外,PostUp 中的 NAT 规则必须指向真实的公网接口——大多数云镜像上是 eth0,但不要想当然,用 ip route get 1.1.1.1 确认一下。接口名写错,是第一次搭建 WireGuard 时连上了却什么都到不了的头号原因。
用 wg-quick up wg0 启动它,用 wg show 确认接口已经存在并列出了你的 peer,再执行 systemctl enable --now wg-quick@wg0,确保重启后它能自动恢复。客户端的配置文件几乎一样,但有三处关键差异:AllowedIPs 要改成 0.0.0.0/0, ::/0——它的含义是把所有流量都路由到这里,而不是只接受来自这些地址的流量;一行 Endpoint 指向服务器的公网地址和端口;PersistentKeepalive = 25 则让这条映射在家用路由器背后也不会因超时而断开。手机端可以把客户端配置通过 qrencode -t ansiutf8 生成二维码,再从终端里扫描导入。不要通过聊天软件发送配置文件,私钥就在里面。
会绕开隧道的四个泄露点
一条能承载流量的隧道,不等于一条能承载全部流量的隧道,而现实世界里几乎所有 VPN 失效的情形,都藏在这两者之间的落差里。下面这四种情况,隧道本身都运行得完美无缺,但你的流量却在绕开它走,而且没有一个会主动告诉你。你必须自己去查。
DNS。如果客户端一直沿用本地网络分配的解析器,那么隧道确实在承载你的流量,但咖啡馆的 DHCP 服务器仍在实时接收你查询的每一个域名。光是域名列表,就已经差不多能拼出你的完整画像了。解决办法是在客户端配置里明确写一行 DNS =,或者更好的做法是在 VPS 上运行一个绑定隧道地址的解析器,让客户端指向它——这样查询也会经过隧道,并终结在一台你自己掌控的机器上。请在客户端而不是服务器上,用任意一款 DNS 泄露测试工具验证:应该只看到一个解析器,且必须是你自己的那个。
IPv6。这是最典型的静默失败。如果客户端的 AllowedIPs 只写了 0.0.0.0/0,你其实只告诉了操作系统把 IPv4 流量路由进隧道,对 IPv6 只字未提。在双栈网络下——如今大多数家庭和移动网络都是双栈——任何带有 AAAA 记录的网站,都会经由你的真实地址在隧道之外被访问到,而一个只检查 v4 的泄露测试会告诉你一切正常。要么加上 ::/0 并在隧道内分配 v6 地址,要么干脆在客户端彻底禁用 IPv6。两者都不做才是默认状态,而这个默认状态本身就是坏的。
没有断网保护机制。当隧道断开时——笔记本休眠、手机在基站之间切换、服务器因内核更新而重启——操作系统会很「贴心」地自动回退到本地网络。你以为走了隧道的流量其实没走,而且没有任何提示告诉你。在 Linux 上,使用默认路由表的 wg-quick 对大多数流量已经能做到失效即断开,但真正可靠的做法,是显式加一条防火墙规则,丢弃所有不经由 wg0 离开的流量。在 Android 和 iOS 上,请开启始终开启 VPN以及阻止无 VPN 的连接。桌面客户端则要先确认这个选项是否存在,而不是想当然地认为它一定有。
MTU。这不是隐私泄露问题,而是让人直接放弃的原因。WireGuard 的封装在 IPv4 上会占用 60 字节,在 IPv6 上占用 80 字节,因此默认的 1420 接口 MTU 刚好能塞进正常的 1500 字节路径里。但在 PPPoE、部分移动网络,或者叠加了第二层隧道的情况下,实际路径会更小,症状也很怪异:ping 能通,小页面能加载,大的 TLS 握手却会一直卡住。如果你遇到的正是这种情况,把客户端的 MTU 调低到 1380 或 1280,问题就会直接消失。
| 检查项 | 如何验证 | 通过时应该是什么样子 |
|---|---|---|
| IPv4 出口 | 通过任意回显服务查询你的公网地址 | 显示服务器的地址,而不是你自己的 |
| IPv6 出口 | 再显式地通过 IPv6 查询一次 | 显示服务器的 v6 地址——或者干脆没有 v6 路由 |
| DNS | 在客户端运行任意 DNS 泄露测试 | 只有一个解析器,且是你自己配置的那个 |
| 失效即断开 | 停止隧道后重新加载页面 | 页面加载失败,而不是悄悄加载成功 |
| MTU | 在你用过的最差网络上通过 TLS 加载一个大页面 | 能够加载完成,而不是卡住不动 |
| 握手新鲜度 | 在服务器上执行 wg show | 每个预期的 peer 都有近期的握手记录 |
有一件事 VPN 无论如何也解决不了,值得说清楚,免得你对它抱有不切实际的期待:一个能同时监视两端的观察者,无论有没有隧道,都可以通过时序和流量大小把两端关联起来。加密隐藏的是内容,不是通信的形态。要防御这种对手,需要把你的流量和其他人的流量在多个中继之间混合,这正是 Tor 存在的意义,也正是单跳 VPN 在结构上做不到的事。如果这就是你的威胁模型,那么自建 VPN 从一开始就是用错了工具,再怎么调配置也变不成对的。
让出口地址在真实网络环境中表现良好
你隧道的出口地址属于某个托管网络,而如今相当一部分互联网服务在决定如何对待你之前,都会先把地址分成住宅和数据中心两类。流媒体片库、部分银行、票务网站,以及大量反欺诈工具,默认就会把来自托管网络的一切都当成可疑对象。这不是靠改改配置就能解决的问题——它是服务器所在位置本身的属性,无论是自建隧道还是市面上任何一款商业 VPN,都同样适用。谁要是承诺能绕开这一点,说的其实是一场他们正在输掉的猫鼠游戏。
真正有差别的,是你的地址会出现在哪些名单上。商业 VPN 的地址段之所以会被逐一收录、公开、打包出售,恰恰是因为它们规模大、固定不变、被许多人共用;想封锁 VPN 的网站直接买下这份名单就行。而普通托管网络里的一个单独地址不在这份名单上。这在实践中意味着,自建出口能顺利通过相当一部分会直接封锁商业服务商的普通网站,却仍然会在那些封锁所有数据中心流量的特定服务面前碰壁。预期之内的代价,最多就是偶尔多弹出一次 CAPTCHA,仅此而已。
有几件事值得一次性做好。给地址设置一条朴素、平淡的反向 DNS 记录,而不是沿用服务商的默认值——许多信誉评分系统会读取 PTR,一个普通的主机名,得分会比那种一看就是基础设施的名字更高。让隧道彻底远离 25 端口;一个新的托管地址发出的邮件,无论你怎么做都会先落进垃圾箱,送达率问题本身就是一个要花好几周才能搞定的独立项目。如果地址最终还是被污染了——不管是从上一位租户手里继承来的,还是因为你自己某个 peer 干的事——直接申请更换 IP,而不是继续纠缠。我们可以免费把客户迁移到同一前缀内的全新地址;在面板里提交一个工单,一天之内就能搞定。
最后要考虑的是,隧道背后还有谁。因为所有 peer 共用同一个出口地址,一个人的行为就会变成所有人的声誉。一个家庭没问题。但一群二十个相识的人,其中一半人在做什么你都不知道,这正是一个干净的地址变成被封地址的原因,也是滥用举报最终带着你账户名字找上门的原因。如果你要分配 peer 给那些你并不能为其担保的人,不如干脆给他们单独开一台实例——每月 $8.50,比另一种选择便宜得多。
没人会去配置的那一层:你是怎么付的钱
这里有一个会让前面一切努力都白费的失败点,而它跟 WireGuard 毫无关系。流量从你的出口地址发出。这个地址属于一台服务器。这台服务器属于一个账户。这个账户是用一个邮箱地址开的,用你自己名下的一张卡付的钱。到这一步,从流量追回到你本人只需要四跳,全程留有完整记录,静静躺在服务商的账单数据库里,等着某个人来问一句。你并没有消除一个观察者,你只是把它挪到了一个记录做得更好的地方。
这就是「改变网络位置的 VPN」和「改变你暴露程度的 VPN」之间的区别,而这个区别是在下单付款时决定的,不是在配置文件里决定的。如果你想要一个私有出口的理由,是不想让 ISP 或政府掌握你的浏览记录,而服务器又是用你的真实身份、用银行卡租下来的,这套方案依然能起作用——ISP 确实看不穿这条隧道。但这只是针对某一个特定观察者的隐私改善,对一个铁了心要查你的对手没有用。想清楚自己买的到底是哪一种。
要补上这个缺口,就得让账户认不出你,付款方式也认不出你。这意味着注册时不做任何身份核验——只用一个一次性邮箱地址,仅此而已,这正是无 KYC 主机服务在实践中真正的含义——并且用一条不携带你姓名的支付渠道来付款。Monero 是最干净的答案,因为金额和交易双方压根就不上公开账本;操作教程全程大约五分钟。Bitcoin 也能用,但它是一份永久的公开记录,其隐私程度取决于转入的币本身干不干净,值得在你觉得「无所谓」之前先读一读两者的对比。
然后是司法管辖区,它决定的是即便有人真的开口要求,又能强制到什么程度。一家注册在14-Eyes 情报联盟范围之外、数据中心又位于不强制留存流量记录的国家的服务商,在结构上根本没办法交出一份它从未收集过的浏览记录。这比一句「我们保证不看」要可靠得多。关于这个论点的完整版本——一台租来的服务器到底哪些部分真能被追溯、哪些不能——诚实的答案在这里,包括那些远没有宣传语听起来那么让人安心的部分。
选型:一条隧道实际上需要多小的服务器
WireGuard 的运行开销小得惊人。它运行在内核里,数据包根本不需要被复制到用户空间;它使用 ChaCha20-Poly1305,在任何 CPU 上都很快,不需要依赖 AES 硬件加速也能保持高速;每个 peer 只占用几 KB 的状态,仅此而已。一颗现代单核就能跑出大约 1 Gbps 的加密吞吐量,内存几乎从来都不是瓶颈。VPS 隧道真正的实际限制在于上行带宽,而不是处理器。
这也就意味着,大多数人选套餐的理由其实都错了。一个五台设备全天浏览、看流媒体、视频通话的家庭,远远够不到最低套餐的上限——CPU 基本闲着,带宽也不限量。真正该升级套餐的时机,是你有大量 peer 同时在跑真实流量,或者你想在上行带宽上多留一些余量,而不是单纯觉得「一条隧道应该很吃资源」。
| 你的使用场景 | 并发 peer 数 | 套餐等级 | 真正的限制因素 |
|---|---|---|---|
| 个人使用——笔记本、手机、平板 | 1–5 | Starter,$8.50/月 | 没有限制。CPU 空闲,1 Gbps 不限流量。 |
| 一个家庭或小团队 | 5–20 | Starter 或 Growth,$13.50/月 | 峰值并发带宽,从来不是 CPU。 |
| 更大的群体,持续流量 | 20–80 | Growth 或 Business,$20/月 | 上行带宽 2.5–5 Gbps;CPU 仍有余量。 |
| 面向社区的出口即服务 | 80–250 | Business 或 Pro,$27.50/月 | 此时 CPU 开始成为问题,某一个 peer 的行为也会变成所有人的声誉。 |
| 面向单一用途的线速加密 | 不限 | Scale,$34.50/月 | 10 Gbps 不限流量,多核心可分摊加密运算。 |
就隧道的实际体验而言,位置比硬件更重要。你发出的每一个数据包都要绕道经过服务器,因此你到任何地方的延迟,都变成了你到服务器的延迟,再加上服务器到目的地的延迟。如果隧道要一直开着、你在意响应速度,就选一个离你近的数据中心;如果不是,就选一个离你要访问的目标更近的。阿姆斯特丹是回到欧洲大部分地区的最短路径,苏黎世和雷克雅未克则是用多几毫秒的延迟,换来隐私法律更强的司法管辖区,而布加勒斯特在这两方面都介于两者之间。
在你做选择之前,还有一点值得了解:WireGuard 的握手在链路上有着可被识别的特征,一个做深度包检测的防火墙,完全不需要知道目的地是什么,就能识别并丢弃它。在世界上大多数地方,这个问题根本不会出现。但在少数网络环境里,这意味着单靠 WireGuard 连不上,你需要在它前面再加一层混淆传输——Shadowsocks、xray 或 v2ray 这类方案,或者某个会对握手做填充处理的 WireGuard 分支版本。这些都能运行在同一台实例上,只是在上面多加一层,并不需要换一个套餐。
让它运行多年而不必再操心
一个私人 WireGuard 端点的运维负担接近于零,但并不是真正的零,而这一点点差距,正是私有出口和被攻陷出口之间的分界线。下面这些内容除了最后一项之外都是一次性设置,最后一项则大约每月花费十分钟。
首先锁好大门。SSH 只允许密钥登录——PasswordAuthentication no、PermitRootLogin prohibit-password——防火墙只放行来自公网的两样东西:WireGuard 的 UDP 端口和 SSH。如果想做得更彻底,可以把 SSH 迁移到只监听隧道地址,这样公网接口上唯一能被访问到的服务就只剩 WireGuard 本身,而 WireGuard 对未经身份验证的数据包完全不予理会。这样一来,对这台机器做端口扫描什么都扫不出来——对一台面向公网的服务器来说,这确实是个不同寻常的特性。
开启无人值守安全更新,让它自己运行。内核在这里的重要性比在大多数服务器上更高,因为 WireGuard 的实现本身就是内核的一部分。内核更新落地时就重启;systemd 下的 wg-quick@wg0 会自动把隧道拉起来,配置了 PersistentKeepalive 的客户端也会在几秒内自动重新连接,不需要任何人插手。
把密钥当账户来对待,因为它们本质上就是账户。每台设备一个密钥对,绝不在两台设备之间共用。撤销某个人的访问权限,就是删掉对应的 [Peer] 块,再执行 wg syncconf wg0 <(wg-quick strip wg0),这样改动会立刻生效,且不会中断其他任何人的会话。把 /etc/wireguard/ 加密备份到这台机器之外的地方——一旦丢失,就得手动给每台设备重新配置。如果这台服务器上还有你在意的其他东西,全盘加密是个合理的补充,不过对于一条纯粹的隧道而言,除了那一个目录之外,磁盘上几乎没什么值得加密的内容。
只监控,不记日志。wg show 会给出每个 peer 最近一次握手的时间,这足以回答你实际会遇到的所有运维问题——服务是不是在跑、这台设备有没有连上、它上次是什么时候接入的。请克制住给流量记账或添加连接日志的冲动:你搭这套系统的初衷,就是不让任何人留下你的流量去向记录,而现在最有可能亲手创造这份记录的人,恰恰是你自己。在我们这一侧,没有什么需要额外关闭的——没有 netflow,没有端口镜像,不做任何形式的流量捕获,ARP 表 24 小时后自动老化清除,这些都写在隐私页面上,而不是藏在页脚里的一句空话。
全部工作到此为止。十五行配置、一条防火墙规则、定时安全更新,外加每月扫一眼 wg show。自建 VPN 真正难的地方从来都不是 VPN 本身,而是要一直记住:隧道只是把观察者换了个位置,而这次转移到底值不值,全都取决于上面那四个泄露点有没有堵上,以及它背后的账户会不会把人重新指回你自己。