# 10.1 系统代理

系统代理是指通过配置环境变量或应用程序参数，使网络请求通过指定的代理服务器转发的机制。在 V2Ray 或 Clash 等代理软件开启允许局域网连接后，即可按照下文进行配置。

配置系统代理前，首先需要查看当前用户正在使用的 Shell 类型，因为不同 Shell 对环境变量的设置方式存在差异。执行以下命令可查看当前 Shell：

```sh
$ echo $SHELL
```

## HTTP\_PROXY 代理

本节介绍通过环境变量配置系统代理的方法。多数命令行工具会读取 HTTP\_PROXY、HTTPS\_PROXY、ALL\_PROXY 等环境变量来确定是否使用代理。

### 若使用 sh、bash 或 zsh

> **注意**
>
> 在 sh、bash 或 zsh 中，环境变量 `HTTP_PROXY` 必须使用大写形式，小写形式不会生效。

设置 HTTP 代理环境变量，该变量将被当前 Shell 及其子进程继承：

```sh
# export HTTP_PROXY=http://192.168.X.X:7890
```

> **警告**
>
> 本文中的 `192.168.X.X:7890` 仅为示例，请根据实际情况填写，直接复制粘贴不会生效。IP 地址与端口号须与实际代理服务监听的端点一致。

取消已设置的 HTTP 代理环境变量：

```sh
# unset HTTP_PROXY
```

### 若使用 csh

> **注意**
>
> 在 csh 或 tcsh 中，环境变量 `http_proxy` 必须使用小写形式，大写形式不会生效。

在 csh 或 tcsh 中设置 HTTP 代理环境变量，需使用该 Shell 特有的 `setenv` 命令：

```sh
# setenv http_proxy http://192.168.X.X:7890
```

在 csh 或 tcsh 中取消已设置的 HTTP 代理环境变量，使用对应的 `unsetenv` 命令：

```sh
# unsetenv http_proxy
```

## Git 代理

Git 的代理配置方法，请参见本书其他章节。

## 浏览器配置代理

本节介绍 Chromium 和 Firefox 浏览器的代理配置方法。

Chromium 浏览器在 `~/.config` 等目录下没有专门的代理配置文件，也不支持通过环境变量指定默认代理服务器，但可以通过启动参数设置代理。

为支持此参数的应用程序指定代理服务器和端口：

```sh
--proxy-server="<IP 地址>:<端口>"
```

启动 Chrome 并使用指定的本地代理服务器：

```sh
$ chrome --proxy-server="127.0.0.1:1234"
```

默认使用 HTTP 协议，为支持此参数的应用程序指定 SOCKS 代理服务器和端口：

```sh
--proxy-server="socks://<IP 地址>:<端口>"
```

为支持此参数的应用程序指定 SOCKS4 代理服务器和端口：

```sh
--proxy-server="socksv4://<IP 地址>:<端口>"
```

在图形界面下让 Chromium 默认使用代理打开，可通过修改桌面启动文件实现持久化配置。

首先，找到桌面环境为 Chromium 创建的桌面（desktop）文件，通常位于 `~/.local/share/applications/` 目录下。

```sh
~/
└── .local/
    └── share/
        └── applications/
            └── chromium-browser.desktop # Chromium 桌面启动文件
```

使用编辑器打开上述目录下的 Chromium desktop 文件 `chromium-browser.desktop`，找到 `Exec=chrome %U` 这一行，并在其后添加所需参数：

```ini
Comment[zh_CN]=Google web browser based on WebKit
Comment=Google web browser based on WebKit
Encoding=UTF-8
Exec=chrome %U
GenericName[zh_CN]=
......
```

启动 Chrome 并使用指定的代理服务器：

```sh
Exec=chrome %U --proxy-server="192.168.2.163:20172"
```

### 为 Firefox 单独配置代理

Firefox 浏览器在设置页面的网络设置选项卡提供了图形化代理配置模块。

![Firefox 代理设置](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-153a6a41d4ca66eead7a7f9699a92d588185450d%2FFF-Proxy.png?alt=media\&token=44e10278-82a9-49c3-b397-4dd94874b8fc)

### 参考资料

* The Chromium team. chromium(1) USER COMMANDS chromium(1) NAME chromium - the web browser from Google\[EB/OL]. \[2026-03-25]. <https://man.freebsd.org/cgi/man.cgi?query=chrome> 系统阐述 Chromium 命令行代理参数配置，为本章节提供技术依据。
* Owynn, graudeejs, rjohn, olli@, Sevendogsbsd, kpedersen. chromium proxy settings page doesn't exist\[EB/OL]. \[2026-03-25]. <https://forums.freebsd.org/threads/chromium-proxy-settings-page-doesnt-exist.31927/>. 提供了 FreeBSD 下 Chromium 代理配置的实践解决方案。

## 课后习题

1. 修改 Chromium 的 desktop 文件，使其默认使用 SOCKS5 代理启动，验证其 DNS 查询是否也通过代理转发，并将其方法贡献至本文。
2. 为 csh 编写一个代理开关脚本，在设置代理后验证 git、fetch 等命令的实际网络流量路径，思考为何不同 Shell 对环境变量大小写有不同约定，究竟是哪个文件规定的。
3. 为 Firefox 编写一个 shell 脚本，通过修改其配置文件实现代理自动切换，并对比与 Chromium 参数配置方式在用户可控性上的差异。最终尝试将其贡献到 Firefox 项目。
