Docker 容器使用 Cloudflare Warp 网络

在某些情况下,我们不希望直接暴露 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 应用无视环境变量设置的代理,那就需要单独查阅相关文档查看如何设置代理了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注