在VPS上部署WARP来进行流量加密并解锁Netflix和Google验证码(无损实现IPv4/IPv6双栈)

目前常见的 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.htmlhttps://luotianyi.vc/5252.html 中均提出了让 WireGuard 只接管系统 IPv6 或者 IPv4 路由表以避免服务器上运行服务遭到影响的实现方案,但这个方案仍旧不够完美,不能实现 WARP 的 v6 和 v4 双栈共存

本文于 2021-01 提出的 “大陆白名单” 双栈实现方法也存在一定不足,例如如果使用境外中转机或者 CDN 时,难以进行配置

这里补充一种不使用任何白名单,而且可以不影响 VPS 上原本部署的网站、SSH 等所有服务的无损实现方式

注意,由于这里没有讲解 WireGuard 的一些基本操作方法,因此最好读完后面的内容后再进行具体操作

  1. 使用 ifconfig 命令查看 VPS 出口网卡 IP 地址,这里的 IP 地址不一定是你 VPS 的公网 IP 地址,例如在腾讯云主机中,就是该主机的内网 IP 地址
  2. 在 WireGuard 配置文件中 [Interface] 部分的最后,添加下面的内容
    
    PostUp = ip rule add from 上面获取的IP地址 lookup main
    PostDown = ip rule delete from 上面获取的IP地址 lookup main
  3. 最后重启 WireGuard 即可

[2021-03 更新] IPv4 不通的解决方案

经过在一些 VPS 上实验发现,有一些 VPS 连接 CloudFlare 的 WARP 后,存在 IPv4 不通,但是 IPv6 通的情况,如果只是用来解锁流媒体或者避免 Google 验证码或是使用 Google 学术搜索,这样的情况其实没有太大影响

我们只需要让 WireGuard 只接管我们的 IPv6 路由,并在代理软件中使用 Freenom 设置使用 IPv6 进行优先请求即可

    1. 首先删除 WireGuard 配置文件中的下述内容,让 WireGuard 只接管 IPv6 请求
      AllowedIPs = 0.0.0.0/0
    2. 接下来在代理软件中修改 Outbounds 部分配置如下
      "outbounds": [
          {
              "sendThrough": "::",
              "protocol": "freedom",
              "settings": {
                  "domainStrategy": "UseIP"
              }
          }
      ]

      这里 domainStrategy 中的 UseIP 表示使用代理软件的内建 DNS 服务器,并根据上面的 sendThrough 指定的 IP 协议类型进行域名解析,我们这里将 sendThrough 设定为任意 IPv6 地址,即::,如果想要优先使用 IPv4,可以对应设置为 0.0.0.0

 

    1. 重启代理软件即可

 

准备 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 架构的预编译版本使用:

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

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 文件,实现路由表的自动更改

具体方法就是在配置文件中添加上述 PostUpPostDown 字段,同理其实还可以有 PreUpPreDown

接下来如果直接运行命令启动,由于在启动过程中 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

上一篇
下一篇