为 Chrome OS 设置代理 - tplate

⚠ 文章未完成

Chrome OS 因为安全原因逐步隔离了用户空间和 crosh 终端

这导致了原本固定映射至用户下载文件夹的 /home/chronos/Downloads 目录已经消失了

于是现在找不到一个稳定的目录可以直接将 sing-box 的二进制文件转移到 crosh 中的 /usr/local/bin/ 目录中(可能有,但我心灰意冷懒得找了)

而如果在 crosh 中直接使用 curl 从 GitHub 上下载文件,大概率会因为 DNS 污染等原因下载失败,没有一个好用的办法...

想要在 Chrome OS 上简单方便的代理设备的流量,那就只能在 Android 环境下安装软件,再由系统设定好的本机通道自动在 Chrome、Android 与 Linux 虚拟机之间共享,好处自然是方便且稳定,代价嘛...

在某一天调式程序时,我发现请求的 API 似乎迟迟没有响应,想着是不是节点出问题了?当我尝试打开 Android 上的代理软件时,我意识到并不是网络问题,而是这个 Android 虚拟机,在只跑了一个代理软件的情况下,卡死了...

保存代码进度再重启设备后,Android 虚拟机正常了,继续写代码调程序,但那天晚上我意识到,我似乎启用这个 Android 虚拟机,为的只是跑一个代理软件?于是在第二天我备份好 Android 虚拟机中的必要数据后就把它删掉了。然后我在诊断程序里看到设备的空闲内存从日常的 2GB 变为了... 12GB

剩下的就不多说了,现在 Chrome OS 夺回了属于它的内存,只需要解决网络代理问题就可以了

如果你的网络情况还不能在脱离了 Android 环境中的代理软件下访问网络,那请先不要着急删掉它

删掉了 Android 容器后,就得考虑选择替代的代理方式了,目前大概有四类设置代理的方式,在下方表格中按配置难易度从低到高排序,还有能代理到的范围和优缺点

非侵入式(不修改 Chrome OS)

我们有两种不需要安装任何软件就能添加代理的方式,它们就是 Chrome OS 自带的 WireGuard 和比较差劲的 Wi-Fi 代理

1. WireGuard

通过 WireGuard 设置代理可以覆盖到浏览器、Linux 虚拟机和 crosh,还有系统 UI 控件,方便又好用。

但是系统自带的图形化 WireGuard 配置添加工具有 bug,必须要在 crosh 中通过命令来添加配置,这代表你必须要清除所有数据,开启开发者模式后才能添加 WireGuard 配置 似乎并不需要,请手动试试能不能通过下方的快捷键打开 crosh,如果可以的话就不需要

此教程来自 ChromeOS Flex: Can’t save Wireguard config (FIX) – Tech Blog (Web Archive link)

由于 Cloudflare 的 Warp 现在被 ban 的厉害,比较推荐自建服务端

首先确保你已经为你的 Chrome OS 设备启用了开发者模式,之后按 Ctrl + Alt + T 来打开 crosh,再逐行运行以下命令,注意根据你的 WireGuard 配置替换掉对应的内容:

wireguard new <名称>
wireguard set <名称> local-ip 10.8.0.9
wireguard set <名称> private-key # 运行这行命令后粘贴密钥,回车保存
wireguard set <名称> peer <公钥> preshared-key # 同上,但如果没有预共享密钥则不用运行此行
wireguard set <名称> peer <公钥> allowed-ips 0.0.0.0/0
wireguard set <名称> peer <公钥> endpoint <端点 IP:端口>
wireguard set <名称> peer <公钥> persistent-keepalive 0
wireguard show # 查看添加完成的配置

添加完配置后,你应该会得到类似以下的输出:

name: wireguard-profile
  local ip: 10.8.0.9
  public key: iJbPYu1dCc1VVU7o6OS5uWhnni9iXCi1nuGkwdsIPn0=
  private key: (hidden)
  name servers: 8.8.8.8, 8.8.4.4

  peer: QiTfo+u2brfoTh5BHQKbU/Rt/OJ7MAQMO0+pMEYNxRg=
    preshared key: (hidden or not set)
    endpoint: 127.1:5300
    allowed ips: 0.0.0.0/0
    persistent keepalive: 0

其中的 public key、peer 以及 endpoint 可能会与上方显示的不同,因为这几个参数取决于你的 WireGuard 配置,然后你就可以到设置的网络板块里启用刚刚添加的配置,试试能不能正常代理流量了

2. Wi-Fi 代理

Wi-Fi 代理更适合只用浏览器上网的用户,因为代理不到 Linux 虚拟机,可以应急用用,长期使用还是推荐选择其他方式

Wi-Fi 代理配置方法不算难,只需要在设置中依次点击 网络 > Wi-Fi,找到目前已连接的 Wi-Fi 名称并点击它就可以查看网络详情信息,再点击最下方的 代理 选项,把连接选项改为 手动配置代理,就可以配置 Wi-Fi 代理了

接下来就是填入 HTTP/S 或 SOCKS 代理主机的 IP 以及端口了,如果你的代理软件支持在一个端口上使用多个协议,还可以把 对所有协议使用同一代理 打开,那样只需要填一个主机的 IP 和端口就足够了,至于下面的 不要对以下主机和域使用代理设置 直接留空,如果你知道这方面的知识,就看你想怎么来了,填完信息记得点击保存

只要你填入的 IP 和端口正确,且对应的设备上运行着负责代理流量的服务,那么这个时候 Wi-Fi 代理就已经生效了,去测试一下吧

侵入式(在 Chrome OS 中安装代理软件)

如果要像 Linux 发行版那样在 Chrome OS 里安装代理软件,那么首先你得给你的 Chrome OS 设备启用开发者模式

注意不是修改 设置 > 关于系统 > 版本 里的开发者版本

具体怎么启用开发者模式我这里就不写了,只讲启用开发者模式后如何将代理软件安装到 Chrome OS 中

如果你选择安装侵入式的代理软件,你就可以选择多种方式来将 Chrome OS 连接到代理,这里首要推荐的是支持 Tun 模式的 sing-box

sing-box

折腾了许久,在 Chrome OS 中似乎只有 sing-box 能使用 Tun 模式来代理设备的全部流量,根本原因大概有两个:

  1. 似乎 Chrome OS 的系统网络栈不支持执行 L3 到 L4 转换,只有在 sing-box 入站(inbounds) 配置中将 Tun 的 stack 参数手动设定为 gVisor 才可以正常转发流量
  2. 同时需要将 sing-box 路由(route) 配置中的 default_interface 参数设定为 wlan0,这个值对应的是给机器提供网络的网卡设备,我的 Pixelbook Go 没有网线接口,我也没有能插网线的拓展坞,没法测试连接网线后是否需要修改。有能力的话请自己到 crosh 里运行 ifconfig 命令判断是否要修改

下方是一份针对 Chrome OS 的 sing-box 配置,配置好了 Tun TProxy 和 HTTP 代理入站,Yacd Web UI 控制台,DNS 和去广告规则集,使用时请手动替换掉出站(outbounds) 中的示例节点:

{
  "log": { "level": "info", "timestamp": false },
  "experimental": {
    "clash_api": { "default_mode": "rule", "external_controller": "127.0.0.1:9090",
      "external_ui": "ui", "secret": "", "external_ui_download_detour": "",
      "external_ui_download_url": "https://github.com/MetaCubeX/Yacd-meta/archive/gh-pages.zip"
  },
  "cache_file": { "enabled": true, "store_fakeip": false } },
  "dns": {
    "servers": [
      { "tag": "proxyDns", "detour": "proxy", "address": "https://1.1.1.1/dns-query" },
      { "tag": "localDns", "detour": "direct", "address": "tls://120.53.53.53" },
      { "tag": "block", "address": "rcode://success" }
    ],
    "rules": [
      { "rule_set": "geosite-category-ads-all", "server": "block" },
      { "outbound": "any", "server": "localDns", "disable_cache": true },
      { "clash_mode": "direct", "server": "localDns" },
      { "clash_mode": "global", "server": "proxyDns" }
    ],
    "strategy": "prefer_ipv4"
  },
  "inbounds": [
    { "type": "tun", "stack": "gvisor",
      "auto_route": true, "strict_route": true,
      "domain_strategy": "prefer_ipv4", "mtu": 9000,
      "inet4_address": "172.114.0.1/30", "inet6_address": "2001::1/64",
      "sniff": true, "sniff_override_destination": true,
      "inet4_route_exclude_address": [ "0.0.0.0/8", "10.0.0.0/8", "127.0.0.0/8", "169.254.0.0/16", "172.16.0.0/12", "192.168.0.0/16", "224.0.0.0/4", "240.0.0.0/4" ]
    },
    { "type": "tproxy", "tag": "TPROXY-IN", "listen": "0.0.0.0", "listen_port": 7895, "sniff": true, "sniff_override_destination": true },
    { "type": "mixed", "listen": "127.0.0.1", "listen_port": 2080, "sniff": true, "users": [] }
  ],
  "outbounds": [
    { "tag":"proxy", "type":"selector", "outbounds":[ "auto", "direct", "outbound_hy2" ] },
    { "tag":"auto", "type":"urltest", "url": "http://www.gstatic.com/generate_204", "interval": "10m", "tolerance": 50, "outbounds":[ "outbound_hy2" ] },
    {
      "type": "hysteria2", "tag": "outbound_hy2",
      "server": "114.51.4.191", "server_port": 9810,
      "password": "example_password",
      "tls": { "enabled": true, "server_name": "exmaple.com", "insecure": true }
    },
    { "type": "direct", "tag": "direct" },
    { "type": "dns", "tag": "dns-out" },
    { "type": "block", "tag": "block" }
  ],
  "route": {
    "default_interface": "wlan0",
    "final": "proxy",
    "rules": [
      { "protocol": "dns", "outbound": "dns-out" },
      { "rule_set": "geosite-category-ads-all", "outbound": "block" },
      { "clash_mode": "direct", "outbound": "direct" },
      { "clash_mode": "global", "outbound": "proxy" },
      { "domain": [ "clash.razord.top", "yacd.metacubex.one", "yacd.haishan.me", "d.metacubex.one" ], "outbound": "direct" }
    ],
    "rule_set": [
      { "tag": "geosite-category-ads-all", "type": "remote", "format": "binary", "download_detour": "direct",
        "url": "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/sing/geo/geosite/category-ads-all.srs"
      }
    ]
  }
}

配置文件有了,你可以决定是否要继续操作,接下来的步骤如果操作不当可能会炸掉你的系统

首先判断一下你的 Chrome OS 设备的架构,按 Ctrl + Alt + T 打开 crosh,使用 uname -m 命令来查看硬件架构:

crosh> uname -m
x86_64

由于我的 Pixelbook Go 使用的是英特尔(Intel) 的处理器,所以这里显示的是 x86_64,如果是 AMD(超威半导体) 的处理器,那应该也是 x86_64,也有可能是 amd64

如果你的 Chromebook 使用了高通(Qualcomm) 或者联发科(MediaTek) 的处理器,那可能会显示 arm64 或者 aarch64

接着前往 SagerNet/sing-box 的最新发布页面,根据你的设备架构来拿到最新的 sing-box 的下载链接

如果设备架构是 x86_64 或 amd64,那就选 sing-box-<版本号>-linux-amd64.tar.gz

如果设备架构是 aarch64 或 arm64,那就选 sing-box-<版本号>-linux-arm64.tar.gz

建议打开网站后按 Ctrl + F 进行搜索,先搜 linux-,然后根据你的设备架构接着输入 amd64 或 arm64,最后唯一高亮的那个就是你需要的,右键那一行字,再点击复制链接地址

注意是点击 复制链接地址,不是 复制,否则你复制到的链接地址是错误的

接下来按下按 Ctrl + Alt + T 打开 crosh,逐行输入以下命令并回车,将其作为一个命令脚本保存到文件中

shell
cd /tmp
# 这篇文章完成时,最新的版本是 1.11.7
echo 'curl "https://github.com/SagerNet/sing-box/releases/download/v1.11.7/sing-box-1.11.7-linux-amd64.tar.gz" > sing-box.tar.gz' > download_sing-box.sh
sh download_sing-box.sh && tar xzf sing-box.tar.gz &&