目前常见的 VPN 协议都有可靠的密码学加密,可以保证我们访问的网站等信息不被他人窃取
但我们的访问请求会被 VPN 服务器进一步转发,转发出去的流量如果是 HTTP 请求就会暴露请求内容,如果是 HTTPS 请求则会泄露 SNI,同时还会暴露访问的目标 IP 地址,DNS 的明文查询也不可避免暴露我们的访问网站
为了实现对这一流程的进一步保护,我们可以使用 CloudFlare 对个人用户免费提供的 WARP 服务
同时使用 WARP 服务后,还会增加对 IPv6 的完整支持,降低网络延时
除此之外,WARP 的出口 IP 目前能解锁 Netflix 等流媒体,但由于目前该方法的广泛使用,难以保证长期的有效性
[2021-03 更新] 实现无损双栈
这篇文章发出大概 2 个月后,在自己的 VPS 上套 WARP 实现 IPv4/IPv6 双栈支持,并解锁流媒体的用法在网上开始广泛流传
例如在文章:https://p3terx.com/archives/use-cloudflare-warp-to-add-extra-ipv4-or-ipv6-network-support-to-vps-servers-for-free.html 和 https://luotianyi.vc/5252.html 中均提出了让 WireGuard 只接管系统 IPv6 或者 IPv4 路由表以避免服务器上运行服务遭到影响的实现方案,但这个方案仍旧不够完美,不能实现 WARP 的 v6 和 v4 双栈共存
本文于 2021-01 提出的 “大陆白名单” 双栈实现方法也存在一定不足,例如如果使用境外中转机或者 CDN 时,难以进行配置
这里补充一种不使用任何白名单,而且可以不影响 VPS 上原本部署的网站、SSH 等所有服务的无损实现方式
注意,由于这里没有讲解 WireGuard 的一些基本操作方法,因此最好读完后面的内容后再进行具体操作
- 使用
ifconfig
命令查看 VPS 出口网卡 IP 地址,这里的 IP 地址不一定是你 VPS 的公网 IP 地址,例如在腾讯云主机中,就是该主机的内网 IP 地址 - 在 WireGuard 配置文件中
[Interface]
部分的最后,添加下面的内容PostUp = ip rule add from 上面获取的IP地址 lookup main PostDown = ip rule delete from 上面获取的IP地址 lookup main
- 最后重启 WireGuard 即可
[2021-03 更新] IPv4 不通的解决方案
经过在一些 VPS 上实验发现,有一些 VPS 连接 CloudFlare 的 WARP 后,存在 IPv4 不通,但是 IPv6 通的情况,如果只是用来解锁流媒体或者避免 Google 验证码或是使用 Google 学术搜索,这样的情况其实没有太大影响
我们只需要让 WireGuard 只接管我们的 IPv6 路由,并在代理软件中使用 Freenom
设置使用 IPv6 进行优先请求即可
- 首先删除 WireGuard 配置文件中的下述内容,让 WireGuard 只接管 IPv6 请求
AllowedIPs = 0.0.0.0/0
- 接下来在代理软件中修改
Outbounds
部分配置如下"outbounds": [ { "sendThrough": "::", "protocol": "freedom", "settings": { "domainStrategy": "UseIP" } } ]
这里
domainStrategy
中的UseIP
表示使用代理软件的内建 DNS 服务器,并根据上面的sendThrough
指定的 IP 协议类型进行域名解析,我们这里将sendThrough
设定为任意 IPv6 地址,即::
,如果想要优先使用 IPv4,可以对应设置为0.0.0.0
- 首先删除 WireGuard 配置文件中的下述内容,让 WireGuard 只接管 IPv6 请求
准备 WARP 账号
WARP 是由 CloudFlare 向个人用户免费提供的 VPN 代理服务,其基于 WireGuard 协议,官网为:https://1.1.1.1/ WARP 的旨在保护移动设备的通信流量不被监听,只需要在手机上安装 WARP 的 APP,就可以将全部流量通过 CloudFlare 的服务器进行中转,当然,WARP 服务在中国大陆并不可用 为了能在我们的 VPS 上部署 WARP,我们需要用到 Github 上的一个开源项目 wgcf:https://github.com/ViRb3/wgcf 从该项目的 Release 页面,可以下载对应系统和 CPU 架构的预编译版本使用:
wgcf register
注册过程中需要首先同意 CloudFlare 的用户协议,注册成功会在当前目录下生成一个 wgcf-account.toml
的用户信息文件
接下来将 WARP 的账号信息转换为 WireGuard 的标准配置文件
wgcf generate
生成完毕后会输出 wgcf-profile.conf
文件,该文件将用于后续 WireGuard 的启动
配置 WireGuard
WireGuard 在各个系统下安装的方法各有不同,具体可以参照 WireGuard 的官方教程:https://www.wireguard.com/install/
在 Linux 下安装好 wireguard-tools 后,会默认创建 /etc/wireguard
目录,用于存放配置文件
直接将刚刚生成的 wgcf-profile.conf
文件复制到该目录下即可
接下来使用下面的命令启动代理即可
wg-quick up <conf文件名>
例如我将 wgcf-profile.conf
文件重命名为 warp.conf
文件拷贝到对应目录下,则启动命令如下
wg-quick up warp
关闭命令如下
wg-quick down warp
但!如果你使用远程方式连接到 VPS,切勿直接启动,因为启动后会导致 SSH 连接中断,所有通向服务器的连接均会中断
这是因为开启 VPN 后 WireGuard 会修改系统的路由表,将所有出站流量都导向 CloudFlare 的服务器造成的
配置路由表
WireGuard 的 quick 配置工具默认不会去修改 route 命令控制的系统路由表,我们可以通过观察其启动日志发现其配置原理
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip address add 192.168.128.254/24 dev wg0
[#] ip link set mtu 1420 dev wg0
[#] ip link set wg0 up
[#] wg set wg0 fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
从启动日志可以发现,WireGuard 创建了一张编号为 51820 的路由表,并通过添加 rule 将所有的数据包通过 51820 的路由表进行路由,从而避开了系统默认路由表
为了避免在我们通过国内 IP 连接到 VPS 时也被通过这张路由表进行路由,我们可以在上述命令执行完成后在继续添加 rule,将所有的国内 IP 通过系统的默认 main 路由表进行路由
其实添加方法非常简单,只需要用 CIDR 表示法将要例外的 IP 地址表示一下就可以,例如我想让 223.255.252.0/23
这个 IP 段不通过代理返回数据,则执行命令如下
ip -4 rule add to 223.255.252.0/23 priority 1
其中 to
表示目的地址筛选,priority
表示规则优先级,数字越小则优先级越高,如果不指定优先级,则系统默认会设定为目前最小的数字,因而该命令必须放在 WireGuard 启动后执行
同时,该命令还可使用 table
指定路由表,如果不指定,则是系统默认的 main 路由表,main 路由表可以使用 route -n
看到
为了将所有的中国 IP 都包括在内,我们需要将 APNIC Delegated List 的中国 IP 数据库信息转换为我们对应的配置命令,这里我们可以用到 Github 项目:https://github.com/fivesheep/chnroutes
但需要注意的是,上述项目的输出命令不能直接使用,需要通过简单的文本替换转换为下面的形式
同样准备对应的清除规则的命令,由于规则添加时会默认以最高优先级添加,因而如果停止时不清除规则,下次启动 WireGuard 时规则就无法生效,停止的方法很简单,直接将 add
替换为 delete
即可
接下来在配置文件中使用 WireGuard 给我们提供的钩子,直接在启动后和停止后执行这两个 sh 文件,实现路由表的自动更改
具体方法就是在配置文件中添加上述 PostUp
和 PostDown
字段,同理其实还可以有 PreUp
和 PreDown
接下来如果直接运行命令启动,由于在启动过程中 SSH 会发生阻断,可能会出现启动不成功的问题,可以使用 screen 或者将命令添加到 rc.local
文件中实现开机自启动
测试
如果路由表配置正确,则我们应该可以正常连接到服务器,同时服务器可以正常连接到外网,可以看到,服务器的 IP 已经变为了 CloudFlare Warp 服务的 IP 地址
服务器访问一些网站的网络延迟也明显降低(上:启动前,下:启动后)
IPv6 可正常使用
WARP 服务可以正常使用 Netflix,经过测试,不论是在晚高峰时段还是白天,均可以跑满服务器带宽,还会明显降低在访问一些网站时的延迟。如果有 IPLC 专线可用,还可以直接转发 CloudFlare 的 EndPoint,在本地直接使用 WireGuard 客户端,甚至无需境外落地机器。
与此同时,从服务器发出的所有的网络流量(包括 DNS 请求)都会加密,并发往 CloudFlare 的节点,不会直接发往目标服务器,主机商无法从任何途径得知你访问的网站和对应内容,非常安全。
参考资料
[1] WireGuard 配置和上网流量优化 https://blog.mozcp.com/wireguard-usage/
[2] 策略路由以及使用 ip route , ip rule , iptables 配置策略路由实例 https://blog.csdn.net/bytxl/article/details/9850803