Arch安装教程:
📡安装篇 - 🖥️桌面篇 - ✈️代理篇 - ⚙️显卡驱动篇

代理篇

本节描述如何在 linux 下进行科学上网。不论你是否是程序员,你肯定需要这个东西。如果没有配置好科学上网,那么你在日常使用中会遇到各种问题,因为只要是境外或者被墙的资源或代码等,你都有可能都无法下载下来,或者下载速度慢的让人难以接受。所有人必须配置好科学上网再继续。

不要使用 Xray
Xray 是 V2ray 社区分裂的产物,其主要开发者在各个渠道发表过众多令人不适的言论。很明显其并不认可自由软件运动所倡导的理念,同时其在 Qv2ray 主要开发者退出开发后,Xray 的 Telegram 频道发布的公告明显带有严重的主观感情色彩,没有客观的描述事件本身,顺便借题发挥式的中伤开源软件。即使 Xray-core 是开源的,但这并不能说明什么。Xray 最新的客户端已经宣布为闭源软件。


已有科学上网的节点的情况

不论你是从机场处获得节点或者任何其他地方获得,如果你已经有了形如vmess://ss://前缀的节点,那么可以直接使用 linux 上非常好用的 Qv2ray 进行科学上网。它是跨平台的,你在 Windows 与 macOS 上均可使用。安装如下几个包:

1
sudo pacman -S qv2ray-dev-git v2ray

你需要按照官方文档导入已有的链接,其余细节请详细阅读 Qv2ray 的文档。

需要注意的是,最新的 qv2ray 已经将机场的默认订阅类型改为规范:SIP008。如果你的机场订阅类型为 base64,则需要在分组->订阅设置->订阅类型 中,将 SIP008 改为 base64,否则你将拿不到任何订阅链接中的节点。

如果你不使用原生 shadowsocks/v2ray 而是其余方式,请在 AUR 搜索关键字 qv2ray-plugin,在结果中选取你所需要的对应插件进行安装。

在节点链接后,Qv2ray 会自行为你设置系统代理。注意,系统设置中的代理配置在 KDE 桌面环境中并不是所有应用都会遵守,经过测试,chrome/chromium 浏览器与 steam 会遵循 KDE 的系统代理设置。没有遵循系统设置代理的应用还需要单独进行代理配置。下面说明几种常用的软件中配置代理的方式。

  • Firefox 浏览器
    火狐浏览器自身的设置选项中存在代理配置,进行配置即可。

  • 终端
    可以通过 export 命令设置当前终端的代理方式。比如使用 tldr 或 github raw 等资源需要设置 https 代理。

    1
    2
    3
    export https_proxy=http://127.0.0.1:8889
    export http_proxy=http://127.0.0.1:8889
    export all_proxy=http://127.0.0.1:8889

    不同终端命令所识别的环境变量名不同,如 all_proxy 对 curl 生效,而对 wget 则不生效,具体可查看各个命令的 man page。

  • code OSS
    File => Preference => Settings
    搜索 proxy,在其中填入 http 代理地址即可

  • proxychains-ng
    如果对于一个应用,KDE 的全局代理不生效,在终端 export 了 ALL_PROXY 变量再用终端启动此应用代理也不生效,并且这个应用自身也没有配置代理的选项,此时可以尝试使用 proxychains-ng,它可以为单行命令配置代理。它是一个预加载的 hook,允许通过一个或多个 SOCKS 或 HTTP 代理重定向现有动态链接程序的 TCP 流量。

    1
    2
    sudo pacman -S proxychains-ng
    sudo vim /etc/proxychains.conf

    把配置文件中最后一行改为本地代理的 ip 和端口,如socks5 127.0.0.1 1089
    同时搜索proxy_dns, 在这一行前添加#注释掉此行,否则使用 proxychains 启动 yay 会报错
    使用代理方式为在单一命令前添加 proxychains

    1
    proxychains yay -S crossover

    拓展链接: windows 版本 proxychains 的自述文档

没有节点,需要自建的节点的情况

这种情况下,你则需要自行购买服务器进行节点搭建,本节不进行教学,仅提供三篇 GFW Report 的高质量文章作为参考。

备用手段:建议自建备用,或持有多个机场。不想花钱的或者自备一下lantern这类软件以防万一。还有一些电报群组有共享的链接资源,如这个或者这个


有关 qv2ray 的替代

2021 年 4 月 28 日,qv2ray 迄今为止的代码量最大贡献者 gcc 宣布退出开发。

起因在于其意在取消对 xray 的支持,并在检测到错误配置的 xray 时导致程序崩溃。xray 从诞生起始终在社区中存在争议。而社区中另外一位仓库 owner 认为这种处理方式太过偏激,不同意这种举措。在交流无果后此 owner 取消了其仓库权限,并将其移除 qv2ray workgroup。这种做法显然是其在感情上无法接受的,随后其注销了 github 帐号并宣布退出开发。而随后 xray 频道发表的公告明显带有严重的主观感情色彩,没有客观的描述事件本身,顺便借题发挥式的中伤开源软件。此公告没有任何实际意义,只会加剧误解的程度。

这种结果是任何一个 linux 用户都不愿看到的,希望 qv2ray 开发组可以重新开启交流,得出一个折中的方案。以防万一,这里也记录一种 qv2ray 的替代方案。

V2rayA 是一个浏览器客户端,在 linux 下支持全局代理,非常方便。可以直接在 AUR 进行安装。安装后需启动服务

1
2
yay -S v2raya v2ray
sudo systemctl enable --now v2raya

随后在菜单中搜索 v2raya,点击即可打开浏览器页面。在其中加入订阅即可使用。在设置中建议开启全局透明代理,同时开始防止 DNS 劫持功能,否则可能会拿不到被 dns 污染的资源(如 github raw)。

更多使用方法请看官方文档项目地址

更新:

在五月,Qv2ray 原主要开发者在 Shadowsocks-NET 组织下开始了新的 Qv2ray 分支并继续维护,至于哪个分支后续的维护更佳,可以静观其变。在七月,最新开发已转至一个个人分支



编译安装 QvPersonal3.0

最新 3.0 版本的 Qv2ray pre release 已经发布,可以编译安装。由于其为 pre release,请谨慎酌情使用。编译前先按照 readme 安装好所需依赖。

首先删除旧版 qv2ray 以及不兼容的配置

1
2
rm -rf ~/.config/qv2ray
sudo pacman -R qv2ray-dev-git

接下来进行编译安装

1
2
3
4
5
6
7
git clone git@github.com:moodyhunter/QvPersonal.git --recursive
cd QvPersonal
mkdir build
cd build/
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
cmake --build . --parallel 8
sudo cmake --install .

在 Plugins 中,选择 V2ray Core Plugin,并进行 V2ray 的设置。现在你已经可以使用。

在 Qv2ray3.0 中 VMESS MD5 与非 0 的 AlterID 的形式已不被支持,若你的机场或节点下发的 AlterID 是非 0 是无法使用的。如果服务端支持,你可将 AlterID 改为 0 来使用 VMessAEAD 形式。

卸载 Qv 3.0

1
2
cd QvPersonal/build
sudo xargs rm < install_manifest.txt

更加全面的系统级全局代理

使用 Qv2ray+cgproxy 配置透明代理

全局代理,也即透明代理。本节所述为真正的系统级别的代理,而不是仅仅针对浏览器中全部网址的”全局代理”。

本文原本收集自 Qv2ray 用户组非群主书写,群主仅在其基础上进行更新与修正。项目源地址


安装与设置

  1. 在 Qv2ray 的“首选项-入站设置”的下方启用任意门设置选项。

    • 监听 ipv4 地址可填127.0.0.10.0.0.0,建议前者。若需双栈代理,则在监听 ipv6 地址填上::1(如果监听 ipv4 填了 0.0.0.0 则可不填)。
    • 在“网络选项”中勾选需要透明代理的协议。
    • 模式选择“tproxy”。
    • 如果希望在透明代理环境里让 v2ray 的内置 dns 接管本地 dns,则勾选连接设置选项卡下的“dns 拦截”。这里建议勾选,因为你的网络环境很大可能性需要正确的 dns 解析,比如 github raw 在多数地区均不可访问。注意,在透明代理环境下,如果系统 dns 或 v2ray 的内置 dns 配置不当,可能导致系统无法解析域名从而无法正常上网。详见后文说明。

    如果是复杂配置,则需要手动添加相应的 dokodemo-door 入站。由于目前版本复杂配置并没有提供 tproxy 选项,因此 tproxy 模式需要通过编辑 json 来实现。

  2. 安装cgproxy软件

    • cgproxy软件已在 archlinux, fedora 32, ubuntu 18.04, ubuntu 20.04, deepin 15.11, deepin v20 beta 发行版中测试过。
    • Archlinux 用户可直接在 AUR 上安装,deb 或 rpm 系发行版用户可从github上下载安装包。非以上发行版用户,可自行从github上获取代码自行编译。
  3. 配置cgproxy,编辑/etc/cgproxy/config.json

    • cgroup_proxy中括号里加上”/“(包含引号),port改为 Qv2ray 首选项里的透明代理的端口。
    • cgproxy默认配置是代理所有 tcp 和 udp,ipv4 和 ipv6 的流量,如果不希望代理其中的某种(些)流量,则将对应的enable_xxx改为 false。注意这里的配置要和 Qv2ray 选项里的配置一致(如,Qv2ray 选项里没有勾选 udp,则这里务必把enable_udp改为 false)。
    • 如果希望当本机作为网关设备时为连接到本机网关的其他设备(如连接到本机开设的 wifi 热点的设备)也提供透明代理,则把enable_gateway改为 true。
  4. (重要)透明代理的基本原理是拦截系统发出的所有流量,并将这些流量转到代理工具里,从而实现让系统所有流量都走代理的目的。此时,为了避免流量出现死循环(即代理工具发出的流量又转回到代理工具里),需要将代理工具排除在透明代理环境外面。有两种方式可以实现这一点:

    • 通过execsnoop监控代理工具的启动,并自动将其移至透明代理环境外面:

      • cgproxy软件自带execsnoop支持,以上cgproxy测试过的发行版均可支持。
      • 编辑/etc/cgproxy/config.json,在program_noproxy中括号里加上”v2ray”,”qv2ray”(包含引号和逗号),以使qv2rayv2ray发出的流量不经过透明代理。如果你的v2rayqv2ray不在PATH里,则需要填写它们的绝对路径。
    • 在每次连接代理节点时,让qv2ray自己把自己移到透明代理环境外面:

      • 安装 Qvplugin-Command 插件,在插件设置里的“pre-connection”栏里加上一句

        1
        sh -c "cgnoproxy --pid $(pgrep -x qv2ray)"

        即可。

  5. (重要)如果启用了 udp 的透明代理(dns 也是 udp),则给 v2ray 二进制文件加上相应的特权:

    1
    sudo setcap "cap_net_admin,cap_net_bind_service=ep" /usr/bin/v2ray

    否则 udp 的透明代理可能会出问题。

    如果每次更新了 v2ray 二进制文件,都需要重新执行此命令。

  6. 启动透明代理服务:systemctl start cgproxy.servicesystemctl enable --now cgproxy.service

以上步骤完成后,透明代理应该能正常使用了。


dns 配置说明

如果勾选了“dns 拦截”,且启用了 dns 和 udp 的透明代理,则 v2ray 会拦截对系统 dns 的请求,并将其转发到 v2ray 的内置 dns 里,即让 v2ray 内置 dns 接管系统 dns。但 v2ray 内置 dns 是会遵循路由规则的。

如果没勾选“dns 拦截”,则 v2ray 虽然不会让内置 dns 接管系统 dns,但如果启用了 dns 和 udp 的透明代理,则系统 dns 也会走透明代理进 v2ray,并遵循 v2ray 的路由规则。

因此,在启用了 dns 和 udp 的透明代理时,若系统 dns 或 v2ray 的内置 dns 配置不当,可能导致 dns 请求发不出去,从而影响正常上网。

由于 qv2ray 默认的路由规则是绕过国内 ip,国外 ip 均走代理。在这个情形中,以下两个配置是典型的有问题的 dns 配置方式:

  • 配置了国外普通 dns 作为首选,但代理本身不支持 udp(此时 dns 查询的 udp 流量出不去,dns 无法查询)
  • 配置了使用域名的 doh 作为首选(此时 doh 的域名无法解析,从而 doh 也无法使用)

一般而言,如果并不在意将 dns 查询发给谁,那么,在绕过国内 ip 的情况下,只需要配置一个国内普通 dns 作为首选即可保证不会出问题。若代理本身不支持 udp,又希望使用国外 dns,则可以考虑使用使用 ip 的 doh(如https://1.1.1.1/dns-query等)。

如果需要更复杂的 dns 配置,建议参考上游文档,并选择合适的不会影响正常上网的 dns 配置。


常见问题

  • 启用透明代理后无法访问任何外网,且 v2ray 的 cpu 占用率飙升

    可能是流量陷入死循环了,检查第 4 步有没有正确配置。如果配置没问题,执行systemctl status cgproxy.service看下有没有诸如info: process noproxy pid msg: xxx之类的输出。如果没有,则说明 cgproxy 软件或 execsnoop 没有正常工作。注意 cgproxy 软件需要 cgroup v2。

    尝试退出 qv2ray,随后在终端里执行cgnoproxy qv2ray看是否恢复正常,如恢复正常,说明 cgproxy 正常工作,只是 execsnoop 没有正常工作。由于 execsnoop 一定程度上依赖于内核,非上述 cgproxy 测试过的发行版用户,建议使用第 4 步中的第 2 种方法。另外,对 kde 用户,5.19+版的 plasma 会给从 krunner 里启动的程序额外设置 cgroup,尽管 cgproxy 软件考虑到了这一点,但仍有极少数场合可能出现 plasma 设置的 cgroup 覆盖掉了 cgproxy 设置的 cgroup 的情况,此时通常重启一下 qv2ray 即可。

  • 启用透明代理后,无法访问(部分)域名

    可能是 dns 无法解析(部分)域名。一般这种故障只发生在启用了 dns 及 udp 透明代理的时候。

    终端里执行dig 无法访问的域名看下报什么错:

    • 若出现类似reply from unexpected source: 192.168.0.100#42050, expected 8.8.8.8#53的报错,则检查第 5 步的有没有正确配置。

    • 若出现类似connection timed out; no servers could be reache的报错,则说明 dns 查询的流量出不去,此时往往是系统 dns 或 v2ray 内置 dns 配置不当。请检查是否出现了前文提到的几种不当配置。如果没有勾选“dns 拦截”,则此时 v2ray 虽然不会用内置 dns 接管系统 dns,但它仍然会让系统 dns 走透明代理,从而遵循 v2ray 的路由规则,此时需要检查系统 dns 是否是前文提到的那几种不当配置。

  • 能不能分应用代理(如,下载 BT 时不能走代理)

    对于本机的程序,可以,可通过两种方式实现:

    • 通过cgnoproxy实现:如,在命令行中执行cgnoproxy qbittorrent,启动的 qbittorrent 程序就不会走透明代理。又如,在命令行中执行cgnoproxy --pid 12345,执行之后 pid 为 12345 的程序就不再走透明代理。这种方式可支持任何应用。
    • 通过/etc/cgproxy/config.json实现:在配置里的program_noproxy中括号里加上相应的应用即可。这种方式只支持可执行文件,不支持各种脚本。如希望把 clash 与 kde connect 加入 noproxy 规则,则在把此字段补全成[“v2ray”, “qv2ray”, “clash”, “/usr/lib/kdeconnectd”]即可。注意修改config.json之后,需要重启 cgproxy 服务才能生效,执行systemctl restart cgproxy.service即可。

    对于当本机作为网关设备时为连接到本机网关的其他设备,不行,那些设备的所有流量(到本机的流量除外)都必然会走代理。

  • 透明代理环境中响应速度变慢

    由于 iptables 是在域名解析成 ip 之后,才对相应的流量进行重定向。因此,在透明代理环境中,访问一个域名 s 可能会需要解析至少 2 次 dns(系统解析一次,重定向到 v2ray 之后 v2ray 分流模块再解析一次)。因此,响应理论上是会变慢一点的,变慢的幅度取决于系统 dns 及 v2ray 的 dns 的响应速度。

  • 开启 UDP 支持后报错too many open files

    核心问题是,Linux 系统定义了一系列限制,其中一种限制是最大打开文件数,并且有软限制和硬限制,具体的限制结果可以通过ulimit -Saulimit -Ha查看。一般来说 arch 默认的软限制 open files 的值为 1024,这个数值太小。硬限制的 open files 的值为 524288,这个数值够大了。打开网页过多,或者开启 udp 加速的时候,连接数(打开的文件数)很容易超过 1024 这个数,所以就被限制住了。解决办法很简单,只需要修改系统级别的关于这个限制的配置文件,在/etc/security/limits.conf 文件的最末尾,加上下面这行,然后重启即可:

    1
    *   soft    nofile  8192  #不要落下了最前面的星号
  • 终端 wget/curl/npm/yarn 访问被墙的 https 资源(如 github raw)报错 443
    DNS 的问题,打开 Qv2ray 的 DNS 拦截和 cgproxy 的 dns 选项。或者 export https_proxy 环境变量。