You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP Curl使用SOCKS5代理调用API时遇版本无效错误求助

解决PHP Curl使用SSH隧道SOCKS5代理时的Received invalid version in initial SOCKS5 response错误

问题背景

尝试用PHP Curl通过SOCKS5代理获取API数据时,持续收到错误:Received invalid version in initial SOCKS5 response。已尝试多种常规方案均无效,但通过PuTTY建立SSH隧道连接同一远程服务器的SOCKS5代理却能正常工作。更换专用SOCKS5代理后问题解决,但希望了解SSH隧道方式失效的原因。

原代码如下:

<?php
function fetchContent($url) {
    $proxy = 'socks5h://domain.com:22';
    $proxyAuth = 'username:password';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_PROXY, $proxy);
    curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyAuth);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

    $response = curl_exec($ch);

    if (curl_errno($ch)) {
        echo 'Error:' . curl_error($ch);
    } else {
        echo $response;
    }

    curl_close($ch);
}

fetchContent('https://ipinfo.io/ip');
?>

核心原因

你混淆了SSH服务器端口和SSH隧道转发的本地SOCKS5代理端口:

  • PuTTY建立SSH隧道时,会在本地(比如127.0.0.1:1080)创建一个SOCKS5代理监听端口,所有通过这个本地端口的流量会被加密转发到远程SSH服务器,再由服务器向外请求。
  • 你的代码中直接指定domain.com:22作为SOCKS5代理地址,但22是SSH服务的默认端口,该端口运行的是SSH协议,而非SOCKS5协议。当Curl尝试用SOCKS5协议与SSH服务通信时,SSH服务返回的是SSH协议的版本信息(比如SSH-2.0-OpenSSH_8.2p1),而非Curl期望的SOCKS5版本数据,因此触发版本无效的错误。

另外,SSH隧道的认证是在PuTTY建立连接时完成的,不需要在Curl中再设置CURLOPT_PROXYUSERPWD,这部分配置也是多余的。

修正方案(继续使用SSH隧道)

如果要通过SSH隧道的SOCKS5代理访问API,需要将代理地址改为本地转发的SOCKS5端口,而非远程SSH服务器的22端口:

<?php
function fetchContent($url) {
    // 替换为PuTTY中设置的本地SOCKS5监听端口,通常是1080
    $proxy = 'socks5h://127.0.0.1:1080';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_PROXY, $proxy);
    // 移除多余的代理认证配置,因为SSH隧道已完成认证
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

    $response = curl_exec($ch);

    if (curl_errno($ch)) {
        echo 'Error:' . curl_error($ch);
    } else {
        echo $response;
    }

    curl_close($ch);
}

fetchContent('https://ipinfo.io/ip');
?>

验证要点

  1. 确保PuTTY的SSH隧道处于连接状态,本地SOCKS5监听端口正常运行。
  2. 本地端口未被其他程序占用,且防火墙允许Curl访问该端口。

内容的提问来源于stack exchange,提问作者HDIK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:21:13