composer不支持ssh隧道代理,因其网络请求依赖curl或stream扩展,不经过ssh协议栈;可行方案是用ssh -d创建socks5代理并配置composer config -g http-proxy socks5://127.0.0.1:1080。

Composer 本身不支持通过 SSH 隧道代理镜像请求——它没有 ssh-tunnel、--via-ssh 或类似参数,所有网络请求走的是 PHP 的 cURL 或 stream 扩展,底层依赖系统 DNS 和 TCP 连接,不经过 SSH 协议栈。
为什么有人想用 SSH 隧道?
常见动机是:公司内网无法直连公网镜像(如 mirrors.aliyun.com),但允许通过跳板机 SSH 出去;或本地网络被深度限制,仅开放 SSH 端口(22)。这时用户误以为“只要流量走 SSH,就能绕过封锁”,但实际 Composer 并不提供该能力路径。
真正可行的替代方案:本地 SOCKS 代理 + SSH 动态端口转发
SSH 支持动态端口转发(ssh -D),可创建一个本地 SOCKS5 代理,再让 Composer 的 HTTP 请求经此代理发出。前提是 PHP 的 cURL 编译时启用了 SOCKS5 支持(主流 Linux/macOS 发行版默认开启)。
- 启动隧道:
ssh -D 1080 -N user@jump-host.example.com(后台监听本地127.0.0.1:1080) - 配置 Composer 使用该代理:
composer config -g http-proxy socks5://127.0.0.1:1080 - 验证是否生效:
composer config -g http-proxy应输出socks5://127.0.0.1:1080 - 注意:必须用
socks5://(不是socks://),且不能带用户密码(cURL 不支持带认证的 SOCKS5 URL)
容易踩的坑
即使配了 SOCKS 代理,Composer 仍可能绕过它:
-
http-proxy只影响 HTTP/HTTPS 请求,不影响 Git 克隆(prefer-source场景)——若项目强制用 source,得额外配 Git 的core.sshCommand - 某些企业环境禁用 SOCKS5,或 PHP 的 cURL 被编译时禁用了
CURLPROTO_SOCKS5,运行php -r "print_r(curl_version());"查features位图中是否有0x00000008(代表 SOCKS 支持) - 阿里云等镜像站使用 CDN,部分节点可能对代理 IP 做限速或拦截,表现为
403或连接超时;此时换腾讯云或华为云镜像更稳定 - Windows 上需确保 OpenSSH 客户端可用(Win10 1809+ 自带),PowerShell 中
ssh命令可能指向旧版 PuTTY 工具,行为不一致
最常被忽略的一点:SSH 隧道只是传输层通道,Composer 是否真走它,得靠 -vvv 日志确认——执行 composer show monolog/monolog -vvv 2>&1 | grep "Downloading",看到的域名必须是镜像地址,且无 packagist.org 字样,才算真正生效。











