---
author: Hubert Chen
title: 为 Chrome OS 设置代理
date: '2024-08-06'
summary: 想要在 Chrome OS 上简单方便的代理设备的流量,那就只能在 Android 环境下安装软件,再由系统设定好的本机通道自动在 Chrome、Android 与 Linux 虚拟机之间共享,好处自然是方便且稳定,代价嘛...
category: post
tags:
- Chrome OS
---
> **⚠ 文章未完成**
>
> Chrome OS 因为安全原因逐步隔离了用户空间和 crosh 终端
>
> 这导致了原本固定映射至用户下载文件夹的 `/home/chronos/Downloads` 目录已经消失了
>
> 于是现在找不到一个稳定的目录可以直接将 sing-box 的二进制文件转移到 crosh 中的 `/usr/local/bin/` 目录中(可能有,但我心灰意冷懒得找了)
>
> 而如果在 crosh 中直接使用 curl 从 GitHub 上下载文件,大概率会因为 DNS 污染等原因下载失败,没有一个好用的办法...
想要在 Chrome OS 上简单方便的代理设备的流量,那就只能在 Android 环境下安装软件,再由系统设定好的本机通道自动在 Chrome、Android 与 Linux 虚拟机之间共享,好处自然是方便且稳定,代价嘛...
点击来帮助 Chrome OS 夺回属于它的内存
在某一天调式程序时,我发现请求的 API 似乎迟迟没有响应,想着是不是节点出问题了?当我尝试打开 Android 上的代理软件时,我意识到并不是网络问题,而是这个 Android 虚拟机,在只跑了一个代理软件的情况下,卡死了...
保存代码进度再重启设备后,Android 虚拟机正常了,继续写代码调程序,但那天晚上我意识到,我似乎启用这个 Android 虚拟机,为的只是跑一个代理软件?于是在第二天我备份好 Android 虚拟机中的必要数据后就把它删掉了。然后我在诊断程序里看到设备的空闲内存从日常的 2GB 变为了... 12GB
剩下的就不多说了,现在 Chrome OS 夺回了属于它的内存,只需要解决网络代理问题就可以了
> 如果你的网络情况还不能在脱离了 Android 环境中的代理软件下访问网络,那请先不要着急删掉它
删掉了 Android 容器后,就得考虑选择替代的代理方式了,目前大概有四类设置代理的方式,在下方表格中按配置难易度从低到高排序,还有能代理到的范围和优缺点
| 代理类型 | Chrome | crostini | crosh | 优点 | 缺点 |
| :--- | :---: | :---: | :---: | :--- | :--- |
| Wi-Fi 代理 | ✅ | ❌ | ❌ | 简单方便,可连本机或其他设备 | 代理范围过小,Linux 虚拟机吃不上,每个 Wi-Fi 都需要单独配置 |
| WireGuard | ✅ | ✅ | ✅ | 代理范围广,有系统 UI 控件可快捷切换 | 需要进入 crosh 添加配置,协议因素有速度劣势 |
| Tun | ✅ | ✅ | ✅ | 代理范围广 | 需要在 crosh 中配置代理软件,可能还会有些奇怪问题 |
| TProxy | ✅ | ❌ | ✅ | 暂时想不到 | 代理范围一般,Linux 虚拟机会直接没网(不只是没代理) |
### 非侵入式(不修改 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](https://web.archive.org/web/20221003175242/https://tech.davidfield.co.uk/2022/07/20/chromeos-flex-cant-save-wireguard-config-fix/) (Web Archive link)**
> 由于 Cloudflare 的 Warp 现在被 ban 的厉害,比较推荐自建服务端
首先确保你已经为你的 Chrome OS 设备启用了开发者模式,之后按 Ctrl + Alt + T 来打开 crosh,再**逐行运行以下命令**,注意根据你的 WireGuard 配置替换掉对应的内容:
```bash
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 # 查看添加完成的配置
```
添加完配置后,你应该会得到类似以下的输出:
```bash
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](https://github.com/MetaCubeX/Yacd-meta) Web UI 控制台,DNS 和去广告规则集,使用时请手动替换掉出站(outbounds) 中的示例节点:
点击查看配置
```json
{
"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` 命令来查看硬件架构:
```bash
crosh> uname -m
x86_64
```
由于我的 Pixelbook Go 使用的是英特尔(Intel) 的处理器,所以这里显示的是 `x86_64`,如果是 AMD(超威半导体) 的处理器,那应该也是 `x86_64`,也有可能是 `amd64`
如果你的 Chromebook 使用了高通(Qualcomm) 或者联发科(MediaTek) 的处理器,那可能会显示 `arm64` 或者 `aarch64`
接着前往 [SagerNet/sing-box](https://github.com/SagerNet/sing-box/releases/latest) 的最新发布页面,根据你的设备架构来拿到最新的 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,逐行输入以下命令并回车,将其作为一个命令脚本保存到文件中
```bash
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 &&
```