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'); ?>
验证要点
- 确保PuTTY的SSH隧道处于连接状态,本地SOCKS5监听端口正常运行。
- 本地端口未被其他程序占用,且防火墙允许Curl访问该端口。
内容的提问来源于stack exchange,提问作者HDIK
相关产品推荐
相关产品推荐

