在管理 Linux headless(无桌面)服务器时,我们经常需要拉取海外的开发依赖,比如使用 git clone 托管在 GitHub 上的私有仓库,使用 curl 下载国外开源包,或者为 docker pull 配置代理。然而,Linux 终端默认不走任何代理,即使你的网关已经开启了服务,命令行程序也往往会超时(Timeout)。
在 Linux 终端配置代理的黄金方案是:首先,在系统后台以 Systemd 守护进程(Daemon)形式部署并托管轻量级代理核心(如 Mihomo 或 Sing-box);其次,在用户的 ~/.bashrc 或 ~/.zshrc 配置文件中写入快捷导入 http_proxy 与 https_proxy 环境变量的 Shell 脚本,实现代理的一键开启与关闭;最后,针对不读取环境变量的特殊工具(如 Git、Docker 容器守护进程),通过修改其专属配置文件写入静态代理,从而打通服务器的全场景极速拉取。
第一步:使用 Systemd 托管运行代理核心(以 Mihomo/Clash 为例)
为了让代理服务在 Linux 开机时自动在后台启动,我们需要将其注册为 Systemd 系统服务。
1. 下载核心并准备目录
- 访问官方 Release 页面下载对应 CPU 架构(如
amd64或arm64)的二进制文件,重命名为mihomo。 - 将二进制文件移动到系统可执行目录,并赋予执行权限:
BASH
sudo mv mihomo /usr/local/bin/mihomo sudo chmod +x /usr/local/bin/mihomosudo mv mihomo /usr/local/bin/mihomo sudo chmod +x /usr/local/bin/mihomo - 创建配置目录并上传您的
.yaml订阅配置文件(命名为config.yaml):BASHsudo mkdir -p /etc/mihomo # 将你的订阅文件移动到该目录下 sudo mv config.yaml /etc/mihomo/config.yamlsudo mkdir -p /etc/mihomo # 将你的订阅文件移动到该目录下 sudo mv config.yaml /etc/mihomo/config.yaml
2. 编写 Systemd 服务配置文件
创建服务定义文件 /etc/systemd/system/mihomo.service:
[Unit]
Description=Mihomo (Clash Meta) Daemon Daemon Service
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=on-failure
LimitNPROC=500
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target3. 启动服务并配置开机自启
执行以下命令载入并启动服务:
sudo systemctl daemon-reload
sudo systemctl start mihomo
sudo systemctl enable mihomo使用 sudo systemctl status mihomo 确认服务运行正常,且默认在本地监听了 7890(HTTP)或 7893(Socks5)端口。
第二步:配置终端环境变量(一键开关脚本)
绝大多数命令行工具(如 curl、wget、apt 等)都会主动读取系统环境变量中的代理设置。
1. 编写 Shell 快捷脚本
编辑当前用户的 Shell 配置文件,例如 ~/.bashrc(如果是 Zsh,则编辑 ~/.zshrc):
nano ~/.bashrc在文件末尾追加以下内容:
# 一键开启终端代理函数
function proxy_on() {
# 替换为你的本地代理端口,默认 Clash 是 7890
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
export ftp_proxy="http://127.0.0.1:7890"
export rs_proxy="http://127.0.0.1:7890"
export all_proxy="socks5://127.0.0.1:7893"
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
echo -e "\033[32m[✔] Terminal proxy enabled.\033[0m"
# 测试网络连通性
curl -I https://www.google.com
}
# 一键关闭终端代理函数
function proxy_off() {
unset http_proxy
unset https_proxy
unset ftp_proxy
unset rs_proxy
unset all_proxy
echo -e "\033[31m[✘] Terminal proxy disabled.\033[0m"
}2. 生效并测试
- 执行
source ~/.bashrc使配置生效。 - 在终端中输入
proxy_on启动代理。系统会输出启用提示,并使用curl请求 Google 头信息以测试代理延迟。 - 不需要代理时,输入
proxy_off即可恢复默认的直连网络。
第三步:特殊开发工具的专属代理配置
有些底层的系统工具不读取常规的 shell 环境变量,需要单独进行配置。
1. Git 代理设置
当你在终端执行 git clone 遇到报错时,可以通过以下全局命令直接为 Git 配置代理:
# 开启 Git 全局代理(走 SOCKS5 通道速度更快)
git config --global http.proxy 'socks5://127.0.0.1:7893'
git config --global https.proxy 'socks5://127.0.0.1:7893'
# 取消 Git 全局代理
git config --global --unset http.proxy
git config --global --unset https.proxy2. Docker Daemon 镜像拉取代理
如果你的服务器在拉取 Docker 镜像(如 docker pull)时卡死,这需要为 Docker 守护进程配置代理(环境变量只影响容器内,不影响容器拉取本身):
- 创建服务配置文件目录:
BASH
sudo mkdir -p /etc/systemd/system/docker.service.dsudo mkdir -p /etc/systemd/system/docker.service.d - 新建配置文件
/etc/systemd/system/docker.service.d/http-proxy.conf:INI[Service] Environment="HTTP_PROXY=http://127.0.0.1:7890" Environment="HTTPS_PROXY=http://127.0.0.1:7890" Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"[Service] Environment="HTTP_PROXY=http://127.0.0.1:7890" Environment="HTTPS_PROXY=http://127.0.0.1:7890" Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com" - 重新加载并重启 Docker:
BASH
sudo systemctl daemon-reload sudo systemctl restart dockersudo systemctl daemon-reload sudo systemctl restart docker
常见疑问解答 (FAQ)
Q1:为什么执行 proxy_on 后,ping google.com 依然没有反应?
因为 ping 命令使用的是 ICMP 协议,而普通的 HTTP/SOCKS5 代理只支持 TCP 和 UDP 协议。 开启代理后,ping 依然会走直连网络。验证终端代理是否成功的唯一标准是使用类似 curl -I https://www.google.com 这样基于 TCP 请求的工具。
Q2:如何配置代理仅对特定域名生效,避免本地局域网(如 NAS、内网测试站)也被代理?
这需要设置 no_proxy 环境变量(我们在快捷脚本中已包含)。在 no_proxy 中写入逗号分隔的 IP 范围或域名后缀(如 localhost,127.0.0.1,.internal.net),这能确保访问这些地址时自动绕过代理。
Q3:为什么命令行代理报错 SOCKS5 protocol error?
通常是因为代理端口不匹配。比如,你把 Socks5 代理(如 127.0.0.1:7893)写成了 HTTP 代理。如果在 http_proxy 中使用 socks5 协议,部分旧版命令行工具(如旧版 curl)可能无法正确解析握手,建议严格对齐协议与端口。