VPS 套 Warp 分流指定出口 IPv6
上周一个普通的下午,一直挂在后台沉寂许久的 Telegram 收到了一条推送:
定睛一看,电信 CN2 直连,2.5G 带宽,1T 流量,券后 36 刀一年,合 3 刀一个月
新的传家宝已经出现!
火速付款之余,立即呼朋唤友,忽悠了周围三四个同事都入手了
这个套餐是自带 IPv6 的,对于各种流媒体解锁都有好处。当然依然有很多 VPS 没有 IPv6 地址,并且中国有句古话叫狡兔三窟,出门在外还是得套个马甲的。这时候就需要用到大善人 Cloudflare 家的 Warp 了
此前使用的 warp 脚本是 scarmen/warp,直接启动全局模式,就会将整个 VPS 的全局出口都重定位到 warp。但是有两点问题:
- warp 降速,并非所有的出口流量都需要走 warp。通常只有一些如 Netflix、OpenAI 之类的对 IP 要求比较高的服务需要走 warp
 - warp 接管全局流量后,即使是双栈出口,但是有时出口会优先走 IPv4。由于 DNS 解析发生在 warp 内部(远程 DNS 解析),无法做干预
 
对于问题 1,warp 脚本可以开启非全局模式,并在本地开放一个 socks 代理,可以使用代理软件分流。对于问题 2,则可以通过代理软件让 DNS 解析发生在本地,完成解析后再将流量通过 warp 出口
非全局的 warp,可以在安装脚本时直接选择
wget -N https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh && bash menu.sh c也可以安装完成后在菜单中选择,WARP Linux Client 或 wireproxy 都可以
开启后 socks 默认会开放在本机 40000 端口
有了这个 socks 服务,添加 socks 出口,再根据需要分流即可。以 xray 为例,clash 和 sing-box 类似
{
  "outbounds": [
    {
      "tag": "warp",
      "protocol": "socks",
      "settings": {
        "servers": [
          {
            "address": "127.0.0.1",
            "port": 40000
          }
        ]
      }
    }
  ]
}直接设置代理软件的出口为 socks5 服务,就会触发远程 DNS 解析,导致出口 IPv4/IPv6 不稳定,这里可以通过本地 DNS 的方式解决
本地 dns 就需要代理软件开启 dns 模块
{
  "dns": {
    "servers": [
      "2606:4700:4700::1111",
      "1.1.1.1"
    ],
    "queryStrategy": "UseIP",
    "tag": "dns_inbound"
  }
}出口添加为一个链式代理
{
  "outbounds": [
    {
      "tag": "warp",
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "UseIPv6v4"
      },
      "proxySettings": {
        "tag": "warp-inner"
      }
    },
    {
      "tag": "warp-inner",
      "protocol": "socks",
      "settings": {
        "servers": [
          {
            "address": "127.0.0.1",
            "port": 40000
          }
        ]
      }
    }
  ]
{
  "outbounds": [
    {
      "tag": "warp",
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "UseIPv6v4"
      },
      "proxySettings": {
        "tag": "warp-inner"
      }
    },
    {
      "tag": "warp-inner",
      "protocol": "socks",
      "settings": {
        "servers": [
          {
            "address": "127.0.0.1",
            "port": 40000
          }
        ]
      }
    }
  ]
}先通过一个 freedom 出口解析域名,UseIPv6v4 表示优先使用解析出的 IPv6 地址,如果没有 IPv6 再使用 IPv4,再通过 proxySettings 将流量导入 warp-inner 出口,也就是之前设置的 socks,即 warp
这样如果访问的网站支持 IPv6,那么通过 warp tag 访问该网站就必然通过 IPv6 访问