Arch Linux 软件下载网络问题

本章系统讲解 Arch Linux 上软件下载(pacman/yay/pikaur/makepkg 等)遇到网络问题的原理、排查思路和解决方法。以 Clash 为例演示代理配置,最后以 Q&A 形式覆盖其他疑难场景。


1. 为什么 Arch Linux 下载软件会出问题

1.1 DNS 解析失败

pacman -Sy 报错 Could not resolve host: mirrors.xxx.com,本质是 DNS 查询被污染或超时。

原理:你的电脑需要先从 DNS 服务器拿到 mirror 的 IP 地址,才能发起 HTTP 下载。如果 DNS 被劫持(返回假 IP)或查询超时(服务器无响应),下载就无法开始。

# 验证 DNS 是否正常
nslookup mirrors.aliyun.com
dig mirrors.aliyun.com
 
# 如果返回不到 IP,说明 DNS 有问题

1.2 连接被重置 / Connection refused

pacman -Sy 报错 error: failed retrieving file ... Connection reset by peerConnection refused

原理:TCP 连接在建立阶段(三次握手)或数据传输阶段被中间设备(防火墙、运营商、GFW)主动中断。常见原因:

  • Mirror IP 被封锁
  • 运营商 QoS 限速
  • GFW 干扰(针对特定域名/IP)

1.3 连接超时

pacman -Sy 报错 error: timed outCould not connect to ...

原理:TCP SYN 包发出去但没有收到 SYN-ACK 回包。可能原因:

  • Mirror 服务器宕机或负载过高
  • 本地网络路由不通
  • 防火墙规则阻止出站

1.4 下载速度极慢

能连上但速度只有几 KB/s。

原因

  • Mirror 在海外,物理距离远导致 RTT 高
  • 运营商对国际带宽限速
  • Mirror 本身带宽不足(非高峰期也慢)
  • TCP 拥塞控制算法在高延迟链路上表现差

1.5 SSL/TLS 证书错误

pacman -Sy 报错 SSL certificate problem: unable to get local issuer certificate

原理

  • 系统时间不正确(证书验证失败)
  • CA 证书包过旧
  • 中间人攻击(不常见但需排除)

2. 解决方案总览

问题首选方案备选方案
DNS 解析失败换公共 DNS(/etc/resolv.conf使用 DoH/DoT
连接被重置代理(Clash/v2ray)换 mirror
连接超时代理 或 换 mirror检查防火墙
速度极慢换国内 mirror代理加速
SSL 证书错误timedatectl set-ntp true更新 ca-certificates

2.1 换 Mirror(最简单的方案)

编辑 /etc/pacman.d/mirrorlist,将国内 mirror 放到最前面:

# 备份
sudo cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
 
# 使用 reflector 自动选最快的 mirror
sudo pacman -S reflector
sudo reflector --country China --age 12 --protocol https --sort rate --save /etc/pacman.d/mirrorlist

或者手动编辑,把清华/阿里/中科大等放到第一行:

## China
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.aliyun.com/archlinux/$repo/os/$arch
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch

2.2 换 DNS

# 临时换
sudo vim /etc/resolv.conf
# 加入:
nameserver 223.5.5.5
nameserver 8.8.8.8
 
# 永久换(使用 systemd-resolved)
sudo systemctl enable --now systemd-resolved
sudo vim /etc/systemd/resolved.conf
# 加入:
[Resolve]
DNS=223.5.5.5 8.8.8.8
DNSOverTLS=yes

2.3 使用代理(根本解决国际线路问题)

当 mirror 在海外、或需要访问 GitHub(yay/AUR)时,代理是唯一可靠方案。下一节详细讲解。


3. 以 Clash 为例配置代理

3.1 Clash 的三个端口

端口类型用途
7890HTTP 代理给 curl/wget/git/yay/pacman 用
7891SOCKS5 代理给 Telegram 等支持 SOCKS5 的软件用
9090API 控制面板Clash Dashboard 管理界面

3.2 启动 Clash

cd ~/clash && ./clash -d ~/clash &

验证是否启动:

ss -tlnp | grep 7890
# 应看到 clash 进程监听 7890

3.3 让 pacman 走代理

pacman 不读环境变量的 http_proxy,需要在 /etc/pacman.conf 中配置:

sudo vim /etc/pacman.conf

在文件末尾加入:

XferCommand = /usr/bin/curl -x http://127.0.0.1:7890 -o %o %u

这样 pacman 下载时会自动走 7890 代理端口。

注意:XferCommand 会覆盖 pacman 默认的下载方式。如果代理不通,所有下载都会失败。临时恢复:注释掉这行即可。

3.4 让 yay/AUR 走代理

yay 底层调用 makepkg → curl,需要设置环境变量:

export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
yay -S <>

永久生效,写入 ~/.bashrc

export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7891
export no_proxy=localhost,127.0.0.1,::1

3.5 让 git 走代理

# 只对 GitHub
git config --global http.https://github.com.proxy http://127.0.0.1:7890
 
# 全局
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

3.6 验证代理是否工作

# 测试 Google
curl -x http://127.0.0.1:7890 https://www.google.com -I
# 应返回 HTTP/2 200
 
# 测试 GitHub
curl -x http://127.0.0.1:7890 https://github.com -I
 
# 查看出口 IP(应为代理节点的 IP)
curl -x http://127.0.0.1:7890 https://ipinfo.io/ip

3.7 Clash 开机自启

mkdir -p ~/.config/systemd/user
 
cat > ~/.config/systemd/user/clash.service << 'EOF'
[Unit]
Description=Clash Proxy Service
After=network.target
 
[Service]
Type=simple
ExecStart=/home/%u/clash/clash -d /home/%u/clash
Restart=on-failure
RestartSec=5
 
[Install]
WantedBy=default.target
EOF
 
systemctl --user enable clash.service
systemctl --user start clash.service
sudo loginctl enable-linger $(whoami)

3.8 Clash 规则配置

~/clash/config.yamlrules 段,可以配置哪些流量走代理、哪些直连:

rules:
  # 国外走代理
  - DOMAIN-SUFFIX,github.com,Proxy
  - DOMAIN-SUFFIX,google.com,Proxy
  - DOMAIN-SUFFIX,archlinux.org,Proxy
 
  # 国内直连
  - DOMAIN-SUFFIX,baidu.com,DIRECT
  - DOMAIN-SUFFIX,bilibili.com,DIRECT
 
  # 兜底
  - MATCH,Proxy

4. 安全注意事项

  • 信任代理服务商:你的流量经过他们的服务器,HTTPS 请求只能看到域名,看不到具体内容
  • DNS 泄露:确保 DNS 也走代理(Clash 配置 dns 段)
  • WebRTC 泄露:Firefox 中 about:configmedia.peerconnection.enabledfalse

5. 其他一些问题

以下为零碎、不好系统归类的问题,以 Q&A 形式覆盖。

Q: “SSL certificate problem” 怎么办?

sudo timedatectl set-ntp true
# 或换个节点

Q: Clash 能用但浏览器不能?

  • Mullvad Browser:确认 Clash 已启动
  • Firefox:手动设置代理 127.0.0.1:7890
  • Chrome:用 --proxy-server=http://127.0.0.1:7890 参数启动

Q: 多个代理软件冲突?

同一时间只能有一个代理软件监听 7890 端口。

ss -tlnp | grep 7890
# 停止其他代理后再启动 Clash

Q: 代理设置了但 git clone 还是慢?

env | grep proxy
git config --global --get http.proxy
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

Q: 怎么查看当前哪些端口被占用了?

ss -tlnp
# 输出示例:
# LISTEN  0  128  127.0.0.1:7890  users:(("clash",pid=1234,fd=6))
# LISTEN  0  128  127.0.0.1:7891  users:(("clash",pid=1234,fd=7))
# LISTEN  0  128  127.0.0.1:9090  users:(("clash",pid=1234,fd=8))
# LISTEN  0  128  0.0.0.0:22      users:(("sshd",pid=567,fd=3))

查看特定端口:

ss -tlnp | grep 7890
ss -tlnp | grep -E '789[0-9]|909[0-9]'

Q: 不同 VPN/代理工具的默认端口?

工具HTTP 代理SOCKS5 代理管理面板
Clash789078919090
v2ray108081080-
sing-box108081080-
Trojan108081080-
Shadowsocks-1080-

Q: 怎么判断当前系统用的是哪个代理工具?

ps aux | grep -E 'clash|v2ray|sing-box|trojan|ss-local|sslocal'
ss -tlnp | grep 7890
# 输出中的进程名就是当前代理工具

Q: 怎么找到代理工具的配置文件?

工具默认配置路径
Clash~/clash/config.yaml
Clash Meta~/.config/clash-meta/config.yaml
v2ray~/.config/v2ray/config.json
sing-box~/.config/sing-box/config.json
Trojan~/.config/trojan/config.json
Shadowsocks~/.config/shadowsocks/config.json

通用查找:

find ~ -name "config.yaml" -o -name "config.json" 2>/dev/null | head -20

Q: 我不知道代理的端口号,怎么找出来?

# 查看配置文件
cat ~/clash/config.yaml | grep -E 'port:|socks-port:|external-controller:'
 
# 查看所有监听端口
ss -tlnp | grep -v "127.0.0.53" | grep -v "sshd"
 
# 查看环境变量
env | grep -i proxy
 
# 用 lsof 查看
sudo lsof -i -P -n | grep LISTEN | grep -E '789[0-9]|1080|9090'

Q: 除了 Clash 还有什么代理工具?

工具特点适用
Clash规则丰富、节点管理好日常使用
Clash MetaClash 的增强版需要更多功能
v2ray功能全面高级用户
sing-box现代化、性能好新项目
Trojan隐蔽性好特殊环境
yay -S clash-meta
# 或
yay -S sing-box

5.5 新版:日常用机「默认直连 + 需要时才加速」模式

这一批问题是针对”普通日用浏览器/软件走默认网络,只有 Clash 运行时才加速”这一套用法的新增问答,接着上面继续往下排。

Q: 现在想只让”当前这一个终端”走代理、其它不受影响,用什么指令?

fish直接在终端里输入:

proxyon        # 默认 127.0.0.1:7890(HTTP+SOCKS5 同一混合端口)
proxyon 7891   # 或指定其它端口
proxyoff       # 关闭当前终端代理,恢复默认网络
proxycheck     # 查看当前终端代理状态

bash/zsh 里用标准 export:

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7890
# 只对"当前这个终端"生效,关闭终端即失效
unset http_proxy https_proxy all_proxy   # 取消

关键点export 只影响当前 shell 及其启动的子进程,不影响其它终端、不影响从应用菜单打开的 GUI 程序。

Q: 想只让”某一个软件/某一条命令”走代理、其它不动?

env 前缀,只对这一次命令生效:

# 只让这一条 git clone 走 clash
env https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 \
    git clone https://github.com/xxx/xxx
 
# 只让 yay 这一次走代理
env https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 yay -S 软件名
 
# 命令行程序通用写法(HTTP代理)
env ALL_PROXY=socks5://127.0.0.1:7890 curl https://www.google.com

给 GUI 程序(浏览器等)单独走代理则要看它自己的参数:

google-chrome-stable --proxy-server="http://127.0.0.1:7890"
# Firefox 不走命令行代理,需在 设置→网络设置 里手动填

Q: 终端能不能做到”Clash 开着就自动加速,Clash 关了就正常上网”?

可以,fish 里已内置自动检测(config.fish 里的 __proxy_auto,每次按回车前自动执行一次):

  • 检测到本机有 127.0.0.1:7890 端口在监听 → 自动 export 终端代理变量;
  • 没检测到 → 自动 unset,走默认网络。

所以:不开 Clash 时 git/AUR/脚本都能正常连国内;clash 一开,新敲的命令自动就走代理了。用 proxycheck 可随时查看当前是”自动/手动/默认网络”哪种模式。

如果开了自动还想锁死某端口,用 proxyon <端口>(会置为手动模式,自动检测不再覆盖);proxyoff 退回自动。

Q: 现在 clash 命令怎么用?为什么以前一输入就显示”已在运行”?

现在把 clash 做成了一个管理命令,默认就是启动:

clash             # 启动(后台),等价 clash start
clash status      # 查看运行状态、监听端口
clash restart     # 重启
clash stop        # 停止

以前的 bug:脚本里用 pgrep -x clash 判断是否在运行,而脚本自己文件名也叫 clash,于是”自己查到自己”,永远显示已在运行。新版改成查 9090 API 是否健康 + PID 文件,不再自误判。

Q: 为什么以前 Clash 明明开着、端口也设了,浏览器/Steam 还是没加速?

两个常见坑,现已修:

  1. 加载了错误的配置:直接 cd ~/clash && ./clash(不带 -d)会去读 ~/.config/clash/config.yaml(一个只有 mixed-port: 7890、没有任何节点/规则的残缺文件),当然不加速。现在统一用 clash 命令,它强制 -d ~/clash 加载真正的 ~/clash/config.yaml(含节点和规则)。
  2. 端口协议对不上:旧配置里 HTTP 是 7890、SOCKS5 是 7891,两码事。很多软件按”SOCKS5 填 7890”去填,就连不上。现在改成单一 mixed-port 7890,同一个端口同时支持 HTTP 和 SOCKS5,任何软件填 127.0.0.1:7890 都能通。

Q: 现在的浏览器/软件网络策略到底是怎么分工的?

对象行为说明
Chrome / Firefox默认直连,不绑任何端口日用浏览器,出问题也从应用菜单启动
终端里的 git/yay/脚本Clash 开→自动加速;关→默认网络fish 自动检测,见上文
Mullvad Browser自动绑定 127.0.0.1:7890启动脚本自动写入 profile 的 SOCKS5 代理
Steam想加速就用专门命令启动,平时直接开见下一条

Q: Steam 想走 Clash 加速,终端输入什么?

不要改 Steam 本身,启动时手动带代理即可(需先 clash 开着):

# 方式一:项目自带的加速启动脚本
steamd
 
# 方式二:或手动等效命令(直接在终端跑)
env http_proxy=http://127.0.0.1:7890 https_proxy=http://127.0.0.1:7890 steam

直接点桌面图标开 Steam 就是默认网络、不加速;想要加速每次在终端跑上面任一条即可。

Q: 怎么确认现在 clash 真在加速(而不是白开)?

clash status                     # 应显示 7890 在监听
curl -x http://127.0.0.1:7890 -s -m 8 https://www.google.com -o /dev/null -w "%{http_code}\n"   # 期望 200
curl -x socks5://127.0.0.1:7890 -s -m 8 https://www.google.com -o /dev/null -w "%{http_code}\n" # 期望 200
# 出口 IP(应为代理节点所在地区)
curl -x http://127.0.0.1:7890 -s https://ipinfo.io/ip

5.6 AUR 构建出错(编译/打包阶段)

下载、代理都没问题,但 yay 卡在 makepkg 的 build()/package() 阶段报错。以下问答接着上面往下排。

Q: yay 装 Python 包时报 ModuleNotFoundError: No module named 'pkg_resources',怎么解决?

现象(以 yay -S dirsearch 为例):

File "/home/a/.cache/yay/dirsearch/src/dirsearch-0.4.3/lib/core/installation.py", line 22, in <module>
    import pkg_resources
ModuleNotFoundError: No module named 'pkg_resources'
==> 错误: 在 build() 中发生一个错误。

原因pkg_resources 是 setuptools 自带的旧模块。python-setuptoolsv81 开始弃用、v82+ 已彻底移除 它(本机是 84.0.0)。很多 2023 年前写的、后续没人维护的 AUR Python 包(如 dirsearch 0.4.3)还在 setup.py/入口脚本里 import pkg_resources,于是 build 直接炸。

# 确认是不是这个原因
python -c "import pkg_resources"   # ModuleNotFoundError = 就是这个原因
python -c "import setuptools; print(setuptools.__version__)"  # 通常 >= 82

解决方案(临时绕过,不降级系统 setuptools):手改该包 PKGBUILD 的 prepare(),把源码里的 pkg_resources 用法打掉或改成可选,再重装:

# 1. 编辑 yay 缓存里的 PKGBUILD(改完保存)
nano ~/.cache/yay/dirsearch/PKGBUILD
 
# 2. 在 prepare() 里追加(以 dirsearch 为例;每个包改法略不同)
#    让 pkg_resources import 失败时降级为普通 Exception,并跳过依赖自检
#    sed -i '23c\...' dirsearch.py  # 把 import 行替换成 try/except
#    sed -i '/^import pkg_resources$/d' lib/core/installation.py
#    sed -i 's/.*pkg_resources.require.*/    return  # deps by distro/' lib/core/installation.py
 
# 3. 重新打包并安装
cd ~/.cache/yay/dirsearch
makepkg -f --noconfirm
sudo pacman -U dirsearch-*.pkg.tar.zst

原则:AUR 包的本意是”依赖由 Arch 官方包显式提供”,所以把 pkg_resources 那套运行时自检删掉是安全的——缺失的依赖本应由 PKGBUILD 的 depends 装好。

根治:这类老包通常上游早已停更。可优先找是否有人维护的 fork/更新版(如 dirsearch-git),或给上游发 PR 改用 importlib.metadata 替代 pkg_resources

Q: 装 Python AUR 包遇到 pkg_resources 相关问题,有没有通用一键办法?

如果经常碰到老包 import pkg_resources,可给当前用户装一个兼容 shim,让 import pkg_resources 不再报错(仅作临时兜底,不推荐用于生产):

# 法一:装一个旧版 setuptools 的用户级副本,仅提供 pkg_resources
pip install --user "setuptools<81"   # 但会与系统 python-setuptools 同时存在,慎用

更推荐:逐包在 PKGBUILD 里打补丁(见上一条),而不是动全系统的 setuptools。


6. 速查卡片

常用命令

需求命令
启动 Clashcd ~/clash && ./clash -d ~/clash &
停止 Clashpkill clash
检查端口ss -tlnp | grep 7890
设置代理export https_proxy=http://127.0.0.1:7890
取消代理unset https_proxy http_proxy all_proxy
测试代理curl -x http://127.0.0.1:7890 https://google.com -I
查看出口 IPcurl -x http://127.0.0.1:7890 https://ipinfo.io/ip
git 代理git config --global http.proxy http://127.0.0.1:7890
取消 git 代理git config --global --unset http.proxy
更新订阅curl -o ~/clash/config.yaml "订阅链接"
Dashboard浏览器访问 http://127.0.0.1:9090

端口速查

端口用途配置位置
7890HTTP 代理config.yaml → port
7891SOCKS5 代理config.yaml → socks-port
9090Dashboard APIconfig.yaml → external-controller