看到一篇好文,加密WARP流量

https://hiram.wang/cloudflare-wrap-vps/

目前常见的 VPN 协议都有可靠的密码学加密,可以保证我们访问的网站等信息不被他人窃取

但我们的访问请求会被 VPN 服务器进一步转发,转发出去的流量如果是 HTTP 请求就会暴露请求内容,如果是 HTTPS 请求则会泄露 SNI,同时还会暴露访问的目标 IP 地址,DNS 的明文查询也不可避免暴露我们的访问网站

为了实现对这一流程的进一步保护,我们可以使用 CloudFlare 对个人用户免费提供的 WARP 服务

同时使用 WARP 服务后,还会增加对 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 架构的预编译版本使用:

image-20210116105805899

下载好后,首先注册 WARP 账号CODE

wgcf register

注册过程中需要首先同意 CloudFlare 的用户协议,注册成功会在当前目录下生成一个 wgcf-account.toml 的用户信息文件

接下来将 WARP 的账号信息转换为 WireGuard 的标准配置文件CODE

wgcf generate

生成完毕后会输出 wgcf-profile.conf 文件,该文件将用于后续 WireGuard 的启动

配置 WireGuard

WireGuard 在各个系统下安装的方法各有不同,具体可以参照 WireGuard 的官方教程:https://www.wireguard.com/install/

在 Linux 下安装好 wireguard-tools 后,会默认创建 /etc/wireguard 目录,用于存放配置文件

直接将刚刚生成的 wgcf-profile.conf 文件复制到该目录下即可

接下来使用下面的命令启动代理即可CODE

wg-quick up <conf文件名>

例如我将 wgcf-profile.conf 文件重命名为 warp.conf 文件拷贝到对应目录下,则启动命令如下CODE

wg-quick up warp

关闭命令如下CODE

wg-quick down warp

但!如果你使用远程方式连接到 VPS,切勿直接启动,因为启动后会导致 SSH 连接中断,所有通向服务器的连接均会中断

这是因为开启 VPN 后 WireGuard 会修改系统的路由表,将所有出站流量都导向 CloudFlare 的服务器造成的

配置路由表

WireGuard 的 quick 配置工具默认不会去修改 route 命令控制的系统路由表,我们可以通过观察其启动日志发现其配置原理CODE

[#] 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 段不通过代理返回数据,则执行命令如下CODE

ip -4 rule add to 223.255.252.0/23 priority 1

其中 to 表示目的地址筛选,priority 表示规则优先级,数字越小则优先级越高,如果不指定优先级,则系统默认会设定为目前最小的数字,因而该命令必须放在 WireGuard 启动后执行

同时,该命令还可使用 table 指定路由表,如果不指定,则是系统默认的 main 路由表,main 路由表可以使用 route -n 看到

image-20210116113802785

为了将所有的中国 IP 都包括在内,我们需要将 APNIC Delegated List 的中国 IP 数据库信息转换为我们对应的配置命令,这里我们可以用到 Github 项目:https://github.com/fivesheep/chnroutes

但需要注意的是,上述项目的输出命令不能直接使用,需要通过简单的文本替换转换为下面的形式

image-20210116114021934

同样准备对应的清除规则的命令,由于规则添加时会默认以最高优先级添加,因而如果停止时不清除规则,下次启动 WireGuard 时规则就无法生效,停止的方法很简单,直接将 add 替换为 delete 即可

image-20210116114142353

接下来在配置文件中使用 WireGuard 给我们提供的钩子,直接在启动后和停止后执行这两个 sh 文件,实现路由表的自动更改

image-20210116114259857

具体方法就是在配置文件中添加上述 PostUp 和 PostDown 字段,同理其实还可以有 PreUp 和 PreDown

接下来如果直接运行命令启动,由于在启动过程中 SSH 会发生阻断,可能会出现启动不成功的问题,可以使用 screen 或者将命令添加到 rc.local 文件中实现开机自启动

测试

如果路由表配置正确,则我们应该可以正常连接到服务器,同时服务器可以正常连接到外网,可以看到,服务器的 IP 已经变为了 CloudFlare Warp 服务的 IP 地址

image-20210116114558251
image-20210116114619475

服务器访问一些网站的网络延迟也明显降低(上:启动前,下:启动后)

image-20210116115117852
image-20210116114649662

IPv6 可正常使用

image-20210116114725726

WARP 服务可以正常使用 Netflix,经过测试,不论是在晚高峰时段还是白天,均可以跑满服务器带宽,还会明显降低在访问一些网站时的延迟。如果有 IPLC 专线可用,还可以直接转发 CloudFlare 的 EndPoint,在本地直接使用 WireGuard 客户端,甚至无需境外落地机器。

与此同时,从服务器发出的所有的网络流量(包括 DNS 请求)都会加密,并发往 CloudFlare 的节点,不会直接发往目标服务器,主机商无法从任何途径得知你访问的网站和对应内容,非常安全。

按照架构平台

# Openvz

wget https://git.io/wireguard -O wireguard-install.sh && bash wireguard-install.sh

# kvm

# another one, only kvm
# its kernal based
#
https://github.com/angristan/wireguard-install

curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh
chmod +x wireguard-install.sh
./wireguard-install.sh

参考资料

[1] WireGuard 配置和上网流量优化

[2] 策略路由以及使用 ip route , ip rule , iptables 配置策略路由实例