# 让 NPC 通过 HTTP 或 SOCKS5 代理连接 NPS

> 在 NPC 无法直连外网时通过上游 HTTP 或 SOCKS5 代理建立 TCP 桥接

---

LLMS 索引： [llms.txt](/llms.txt)

---

当 NPC 所在网络只允许通过企业代理访问外部地址时，可以让 NPC 先连接上游 HTTP 或 SOCKS5 代理，再由代理连接 NPS 的桥接端口。

这里配置的是 **NPC 出站代理**，不是对外提供 HTTP 正向代理或 SOCKS5 隧道。

## 命令行启动

SOCKS5 代理：

```shell
./npc \
  -server=nps.example.com:8024 \
  -vkey=<客户端验证密钥> \
  -type=tcp \
  -proxy=socks5://proxy-user:proxy-password@127.0.0.1:1080
```

HTTP 代理：

```shell
./npc \
  -server=nps.example.com:8024 \
  -vkey=<客户端验证密钥> \
  -type=tcp \
  -proxy=http://proxy-user:proxy-password@127.0.0.1:3128
```

代理不需要认证时，可省略 `proxy-user:proxy-password@`。用户名或密码包含 `@`、`:`、`/` 等 URL 保留字符时，必须先做百分号编码。命令行参数可能被同一主机的其他用户从进程列表看到，长期运行时建议改用权限受限的配置文件。

## npc.conf 配置

在 `[common]` 中设置 `proxy_url`：

```ini
[common]
server_addr=nps.example.com:8024
vkey=<客户端验证密钥>
conn_type=tcp
proxy_url=socks5://proxy-user:proxy-password@127.0.0.1:1080
```

限制配置文件只能被运行 NPC 的账号读取。Linux 上可使用：

```shell
chmod 600 /etc/nps/npc.conf
```

## 代理端必须允许的连接

- HTTP 代理必须支持 `CONNECT nps.example.com:8024` 并返回 200。只允许浏览器访问 80/443 的代理可能拒绝 NPS 桥接端口。
- SOCKS5 代理必须允许连接 NPS 的主机名和 TCP 桥接端口。
- NPS 所在主机的安全组和防火墙仍需放通桥接端口，来源地址通常显示为上游代理的出口地址。

## 限制与安全边界

- 出站代理只用于 `conn_type=tcp` 或 `-type=tcp`。KCP 使用 UDP，不会经过这个 HTTP/SOCKS5 代理参数。
- 通过代理建立通道后，`tls_enable=true` 会继续执行到 NPS 的 TLS 握手和证书校验；应连接 TLS 桥接端口（通常为 `8025`），并按[桥接证书与身份验证](/extend/feature/bridge-tls-certificates.html)配置 CA 或公钥指纹。
- HTTP `CONNECT` 和普通 SOCKS5 连接本身不提供端到端加密。未启用 TLS 桥接时，代理能够读取桥接数据。
- 不支持 PAC 脚本或自动读取操作系统代理，必须显式填写代理 URL。

## 验证与排障

1. 先在 NPC 主机上验证代理端口可达，再启动 NPC。
2. 检查 NPC 日志是否出现 `Successful connection with server`，并在 Web 管理中确认客户端在线。
3. HTTP 代理返回 `proxy CONNECT failed: 403` 或类似错误时，请检查 `CONNECT` 目标端口策略和代理认证信息。
4. 代理连接成功但验证失败时，检查 NPS 地址、桥接端口和客户端验证密钥，不要将上游代理密码与 NPS `vkey` 混淆。

---

反链：

- [使用说明](/client/use.html)
- [桥接证书与身份验证](/extend/feature/bridge-tls-certificates.html)
