在工作中总是时不时需要配置 proxy, 资料散落在多处翻起来太麻烦了, 所以整理一份全一点的方便复制
下面将介绍如何在 linux 服务器上使用 Docker 部署 proxy 并提供给局域网内所有设备使用
准备工作
配置参考
# 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
配置文件
# 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
- 编辑配置
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_proxy
、no_proxy
在 docker build 时会设置为 --build-arg
参数
注意,在 docker build、docker run 时因为容器网络和宿主机是隔离的,所以 proxy 不能使用 localhost 来访问,除非容器使用 host
启动
$ 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
使用环境变量
HTTP_PROXY
、HTTPS_PROXY
和NO_PROXY
。使用守护程序配置文件 (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",
}
}
使用
--http-proxy
、--https-proxy
和--no-proxy
命令行选项。(Docker Engine 23.0 或更高版本)。Docker Engine 23.0 以下版本 使用 systemd 配置守护进程
刷新更改并重新启动 Docker
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
验证配置是否已加载并与您所做的更改相匹配,例如:
sudo systemctl show --property=Environment docker
订阅转换工具
如果你的 🛫 没有提供 🐈 格式的配置,可以使用以下工具将你的订阅链接转换到 🐈 格式
安全须知:此类转换工具无法 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
。