在某些情况下,我们不希望直接暴露 VPS 直接暴露 IP。在某些场景下,可以使用 P3TERX 提供的 Cloudflare WARP 一键安装脚本 来实现 WARP 网络出站。直接使用这个脚本会导致 VPS 全局都使用 WARP 出站,这可能不是我们想要的,使用代理模式让需要使用 WARP 的场景下再使用 WARP 会比较合适点。还有些场景,比如你想让 Docker 容器中的应用也使用 WARP 网络出站,也需要给 Docker 配置代理。好在 Cloudflare 官方客户端有 Proxy 模式,能比较方便的实现代理。
但 WARP 官方客户端只提供 Socks 代理,Docker 需要 HTTP 代理,所以我们还需要使用另外的软件来将 Socks 代理转换成 HTTP 代理。
1、安装 Cloudflare WARP 并配置为代理模式
以 Debian 为例。也可以去 Cloudflare 官方源 查看对应系统的安装方法。
添加 Cloudflare GPG Key:
curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg
添加 Cloudflare 官方源:
echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list
安装 Cloudflare WARP:
sudo apt-get update && sudo apt-get install cloudflare-warp
WARP 安装好后,就可以配置并启动了。这里参考 Cloudflare WARP 官方使用说明。需要注意:官方说明中注册完了之后就直接 connect 了,这样很可能导致你的 SSH 连接被中断,并且无法再连上,只能使用 VNC 连接进去,非常麻烦。建议 SSH 连接到 VPS 的时候,按本文档的说明,先设置为 PROXY 模式,再用 connect 连接。
注册 Cloudflare WARP:
warp-cli registration new
设置 WARP 模式为 PROXY:
warp-cli mode proxy
启动 WARP 连接:
warp-cli connect
验证是否生效:
curl -x socks5://127.0.0.1:40000 ip.fm
如果返回的信息中显示是 Cloudflare 的 IP 地址就说明代理已经成功启动。
2、安装并配置 Privoxy
Privoxy 可以将 Socks 代理转换成 HTTP 代理。
安装 Privoxy:
sudo apt update && sudo apt install privoxy
备份 Privoxy 原配置文件:
cp /etc/privoxy/config /etc/privoxy/config.bak
我们需要将 Cloudflare 在 127.0.0.1:4000 端口的 Socks 代理转换成在 Docker 默认网络接口上 8118 端口的 HTTP 代理,如果你的 Docker 网络不是使用的默认配置,配置 Privoxy:
cat > /etc/privoxy/config << EOF
forward-socks5 / 127.0.0.1:40000 .
listen-address 172.17.0.1:8118
EOF
重启 Privoxy 服务:
sudo systemctl restart privoxy
验证是否生效:
curl -x http://172.17.0.1:8118 ip.fm
如果返回的信息中显示是 Cloudflare 的 IP 地址就说明 HTTP 代理配置无误。
3、配置 Docker 代理
Docker 代理使用 ~/.docker/config 文件配置。
创建 .docker 目录:
mkdir -p ~/.docker && chmod 700 ~/.docker
创建 config 文件并写入配置:
cat > ~/.docker/config.json << EOF
{
"proxies": {
"default": {
"httpProxy": "http://172.17.0.1:8118",
"httpsProxy": "http://172.17.0.1:8118",
"noProxy": "localhost,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,127.0.0.0/8"
}
}
}
EOF
修改 config 文件的权限:
chmod 600 ~/.docker/config.json
使用以上配置,所有的 Docker 实例都会使用这个 HTTP 代理。如果只有特定的实例使用,那就需要为需要使用代理的实例单独配置。例如:
docker run -e HTTP_PROXY="http://172.17.0.1:8118" \
-e HTTPS_PROXY="http://172.17.0.1:8118" \
-e NO_PROXY="localhost,127.0.0.1" \
my-special-image
或者,如果你使用 Docker Compose:
services:
special-service:
image: my-special-image
environment:
HTTP_PROXY: "http://172.17.0.1:8118"
HTTPS_PROXY: "http://172.17.0.1:8118"
NO_PROXY: "localhost,127.0.0.1"
如果你的 Docker 应用无视环境变量设置的代理,那就需要单独查阅相关文档查看如何设置代理了。