目录

Cloudflared代理SSH

昨天突然发现公司网络连不上我的 VPS,使用手机流量又可以连上,应该是被屏蔽了。既然Cloudflared可以代理容器的服务,为啥不用来代理SSH呢?问了一下AI,发现这是可行的,于是就有了这篇文章。

安装 Cloudflared

详细安装 Cloudflared 可以参考 Cloudflared反代容器服务。这里只说明容器中的 Cloudflared 反代宿主机 SSH 服务的一些配置。compose 文件如下:

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run
    volumes:
      - ./config:/etc/cloudflared
    environment:
      - TUNNEL_TOKEN=your_token
    networks:
      - tunnel
    extra_hosts:
      - "host.docker.internal:host-gateway"

networks:
  tunnel:
    external: true

其中多加了两个配置:

  • volumes: 增加了配置目录映射。
  • extra_hosts: 增加了 host.docker.internal,以便让 Cloudflared 可以访问到宿主机的 SSH 服务。

在config目录下创建一个 config.yaml 文件,内容如下:

tunnel: your-tunnel-id
credentials-file: /etc/cloudflared/your-tunnel-id.json
ingress:
  - hostname: ssh.your-domain
    service: ssh://host.docker.internal:22
  - service: http_status:404

然后启动 Cloudflared 容器:

docker compose up -d

配置 SSH 代理

回到 Zero Trust 隧道配置页面,添加一个到 SSH 的路由,具体参考Cloudflared反代容器服务

  • Subdomain: ssh
  • Domain: 选择自己托管的域名
  • Service Type: SSH
  • URL: host.docker.internal:22

如下图所示:

/images/2025/12/05/ssh.png

SSH 客户端登录

Cloudflare 隧道提供了一个 SSH 登录方式:使用 cloudflared 客户端作为 ProxyCommand。首先需要安装 cloudflared 程序到本地,具体安装方法参考官方文档。

安装完后,使用下面的命令即可登录:

ssh -o ProxyCommand="cloudflared access ssh --hostname %h" user@ssh.your-domain

PUTTY 配置(可选)

在 PuTTY → Proxy → Command to send to proxy 填入:

cloudflared access ssh --hostname %host

Proxy type 选择 Local。如下图所示:

/images/2025/12/05/putty.png

这样配置完后,就可以使用 Putty 登录了。

SSH 配置

如果不想每次命令行都输入 cloudflared 命令,可以在 ~/.ssh/config 中添加以下配置:

Host ssh.your-domain
  User user
  ProxyCommand cloudflared access ssh --hostname %h
  IdentityFile ~/.ssh/your-private-key (如果开启了公钥认证)
  Port 22

总结

使用 Cloudflared 可以非常轻松地代理 SSH,绕过公司对 SSH 的屏蔽。