13 KiB
author, title, date, summary, category, tags
| author | title | date | summary | category | tags | |
|---|---|---|---|---|---|---|
| Hubert Chen | 为 Chrome OS 设置代理 | 2024-08-06 | 想要在 Chrome OS 上简单方便的代理设备的流量,那就只能在 Android 环境下安装软件,再由系统设定好的本机通道自动在 Chrome、Android 与 Linux 虚拟机之间共享,好处自然是方便且稳定,代价嘛... | post |
|
⚠ 文章未完成
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 (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 模式来代理设备的全部流量,根本原因大概有两个:
- 似乎 Chrome OS 的系统网络栈不支持执行 L3 到 L4 转换,只有在 sing-box 入站(inbounds) 配置中将 Tun 的
stack参数手动设定为gVisor才可以正常转发流量 - 同时需要将 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 &&