跳到主要内容

开发工具链 proxy 配置指南

本文字数: 2556阅读需 8 分钟
沐晨

在工作中总是时不时需要配置 proxy, 资料散落在多处翻起来太麻烦了, 所以整理一份全一点的方便复制

下面将介绍如何在 linux 服务器上使用 Docker 部署 proxy 并提供给局域网内所有设备使用

准备工作

  • 安装 Docker, 参考官方文档
  • 安装 docker-compose, 参考官方文档
  • config.yaml 配置文件(含订阅节点、转发规则,一般由 🛫 提供或者参考 官方文档 自行配置)

配置参考

config.yaml
# http/s 代理端口
port: 7893
# socks5 代理端口
socks-port: 7891
# Linux 和 macOS 的 redir 代理端口
redir-port: 7892
# 混合代理端口, 会自动识别流量协议
mixed-port: 7890
# 允许来自局域网的连接
allow-lan: true
bind-address: '*'
# 代理模式: Global(全局代理)、 Rule(按规则转发) 、 Script(腳本) 、 Direct(全局直连)
mode: rule
# 日志输出级别 (默认级别: silent, 即不输出任何内容, 以避免因日志内容过大而导致程序内存溢出)。
# 其他级别: silent、 info、 warning、 error、 debug。级别越高日志输出量越大, 越倾向于调试, 在需要时开启。
log-level: silent
ipv6: false
# 提供 Restful Api 服务和 web dashboard 静态页面托管服务
external-controller: '0.0.0.0:9090'
# dashboard 静态网页资源文件夹路径
external-ui: /ui

# 访问 dashboard 时使用密码验证
secret: 'passwd'

# 链接 http、socks 端口需要输入的验证用户名、密码
authentication:
- "user:passwd"

# dns:
# rules:
# proxies:
# proxy-groups:

安装

🐈 的安装方式有很多种, 只要能提供 proxy 地址给客户端配置就可以, 为了方便管理和迁移, 下面介绍 docker 安装的方式

1.创建目录, 编辑文件 vim docker-compose.yaml 输入以下代码:

version: '3.8'
services:
clash:
image: dreamacro/clash-premium
container_name: clash-premium
volumes:
- /etc/localtime:/etc/localtime
- ./config.yaml:/root/.config/clash/config.yaml # 代理配置文件
- ./ui:/ui # web 管理程序目录
# Country.mmdb 下载失败时配置
#- ./Country.mmdb:/root/.config/clash/Country.mmdb
ports:
- "7890:7890" # port
- "7891:7891" # socks-port
- "9090:9090" # external controller
restart: unless-stopped
network_mode: "bridge"

这里 docker 的端口配置要和上面 config.yaml 的配置保持一致

提示

Country.mmdb 下载失败时可以去 github 手动下载然后挂载到容器

2.启动容器

docker-compose up -d

访问 http://ip:9090/ui 查看节点状态是否正常

使用

浏览器

使用浏览器插件 proxy-switchyomega 安装完之后会有使用引导

shell

方法一、使用 proxychains

proxychains 通过预加载的 DLL 在动态链接的程序中 Hook 与网络相关的 libc 函数,并通过 SOCKS4/5 或 HTTP 代理重定向连接。

该命令仅适用于使用动态链接的程序, 例如, Go 构建的应用程序无法被 proxychains hook

1.安装:

# MacOS
→ brew install proxychains

# linux
$ sudo apt install proxychains-ng

2.编辑 vim ~/.proxychains/proxychains.conf 然后输入下面的配置:

[ProxyList]
http 127.0.0.1 7890
# https 127.0.0.1 7890 不要写 https 协议, https 流量会使用 socks 来连接
socks5 127.0.0.1 7890

保存后立即生效

# 使用
→ proxychains curl https://google.com
省流

使用这个库的好处是只需要配置一次,后面使用 npm、git、curl 等调用系统 libc.so 库的命令程序都不需要再单独配置了, 节省时间摸鱼、早下班。

方法二、设置环境变量

将下面的代码配置到 .bashrc.zshrc

proxy_url="socks5://127.0.0.1:7890"
no_proxy="192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,127.0.0.1,localhost,*.local,::1"
# all_proxy 将代理所有协议,如 http,https,ftp
alias proxyon='export all_proxy=${proxy_url} no_proxy="${no_proxy}"'
alias proxyoff='unset all_proxy;'

如果想单独设置指定协议可以使用其他环境变量,如:

export http_proxy=127.0.0.1:7890
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
export dns_proxy=$http_proxy
export rsync_proxy=$http_proxy

然后执行 source ~/.zshrc 刷新到当前 shell

每打开一个新的 shell 后手动执行命令: proxyon 即可使用代理,执行命令 proxyoff 则会取消使用代理

如果想保持每次启动 shell 时自动配置代理可以去掉代码中的别名: alias proxyon='' 即可

# 检查环境变量是否设置成功
env | grep proxy
提示

使用 https_proxy 时填写 https 协议会导致使用 curl http(s) 访问时会超时报错, 因为 🐈 没有提供 https 通道, 与 http_proxy 使用相同的 http 协议配置即可, 例如: https_proxy=http://127.0.0.1:7890

方法三、graftcp

graftcp 通过 ptrace 可以跟踪或修改任何给定程序的连接方式,因此它适用于任何程序。 详情见工作原理

npm

执行命令:

npm config set proxy http://127.0.0.1:7890
# 注意:https 代理没有 https 协议,只需要设置 http://
npm config set https-proxy http://127.0.0.1:7890

# 查看当前配置
npm config list
# 删除配置
npm config delete proxy

git

执行命令:

git config --global http.proxy 'socks5://127.0.0.1:7890' 
git config --global https.proxy 'socks5://127.0.0.1:7890'

# 查看当前配置
git config --global --get http.proxy
# 删除配置
git config --global --unset http.proxy

curl

除了配置环境变量外还有两种方式使用代理

2.使用 ~/.curlrc 配置文件

~/.curlrc
# proxy = "[protocol://][host][:port]"
http_proxy = http://127.0.0.1:7890
https_proxy = http://127.0.0.1:7890
ftp_proxy = http://127.0.0.1:7890

3.使用命令行参数

curl -x 127.0.0.1:7890 https://google.com

三种配置方式优先级: env > curlrc > cmd params

wget

除了配置环境变量外还有两种方式使用代理

2.使用 ~/.wgetrc 配置文件

use_proxy = on
# proxy = "[protocol://][host][:port]"
http_proxy = http://127.0.0.1:7890
https_proxy = http://127.0.0.1:7890
ftp_proxy = http://127.0.0.1:7890

3.使用命令行参数

wget -e use_proxy=yes -e http_proxy=http://127.0.0.1:7890 https://google.com

三种配置方式优先级: env > curlrc > cmd params

docker

场景一、宿主机执行命令, 使用 docker login、logout

docker 环境变量 由于 Docker 是使用 Go 开发的,因此可以使用 Go 运行时使用的任何环境变量。如:

HTTP_PROXY
HTTPS_PROXY
NO_PROXY

场景二、容器内访问代理, docker build、run

  1. 编辑配置 vim ~/.docker/config.json
{
"proxies": {
"default": {
"httpProxy": "http://proxy.example.com:3128",
"httpsProxy": "https://proxy.example.com:3129",
"ftpProxy": "",
"allProxy": "",
"noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
}
}
}

保存文件后配置生效,无需重新启动 Docker。但是, 该配置仅适用于新容器和构建, 不会影响现有容器。

在 docker run 时会设置为容器内的环境变量 all_proxyno_proxy
在 docker build 时会设置为 --build-arg 参数

提示

注意,在 docker build、docker run 时因为容器网络和宿主机是隔离的,所以 proxy 不能使用 localhost 来访问,除非容器使用 host 启动

  1. 使用 cli 设置代理
$ docker build --build-arg HTTP_PROXY="http://proxy.example.com:3128" .
$ docker run --env HTTP_PROXY="http://proxy.example.com:3128" redis

场景三、dockerd 守护程序, docker pull、push

  1. 使用环境变量 HTTP_PROXYHTTPS_PROXYNO_PROXY

  2. 使用守护程序配置文件 (Docker Engine 23.0 或更高版本) vim /etc/docker/daemon.json

{
"proxies": {
"http-proxy": "http://proxy.example.com:80",
"https-proxy": "https://proxy.example.com:443",
"no-proxy": "*.test.example.com,.example.org",
}
}
  1. 使用--http-proxy--https-proxy--no-proxy命令行选项。(Docker Engine 23.0 或更高版本)。

  2. Docker Engine 23.0 以下版本 使用 systemd 配置守护进程

刷新更改并重新启动 Docker

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

验证配置是否已加载并与您所做的更改相匹配,例如:

sudo systemctl show --property=Environment docker

订阅转换工具

如果你的 🛫 没有提供 🐈 格式的配置,可以使用以下工具将你的订阅链接转换到 🐈 格式

web subconverter
subconverter

危险

安全须知:此类转换工具无法 100% 保证安全性,可能会产生个人信息泄露、被监听的风险
或者可以将代码 clone 到本地启动, 使用前请自行判断!!!

问题排查

1.ping google.com 不生效是正常的,具体原因可以了解 SOCKS 代理方式和 OSI 七层模型。

2.代理不生效时可以在 webui 查看日志(需要提前配置好 log-level 字段)是否有流量,没有的话继续排查是不是客户端配置的问题

3.curl google.com 无响应且等待一段时间后超时, 添加 -v 参数执行命令后报错:

* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to google.com:443

执行命令 env | grep proxy 检查你的环境变量是否正确, 详细配置查看 方法二、 设置环境变量

all_proxy=socks5://127.0.0.1:7890
https_proxy=http://127.0.0.1:7890
http_proxy=http://127.0.0.1:7890
  • 如果只配置了 all_proxy , 可能是socks5协议连接不稳定, 可以等待一段时间后再次尝试。
  • 也可以尝试补充 http_proxy, https_proxy 环境变量,
  • 或者在 all_proxy 直接填写 ip:端口即可,让程序自行判断协议 all_proxy=127.0.0.1:7890

参考

去广告ACL规则

Using Curl with a Proxy Server

Cntlm

(END)
Loading Comments...