现象
换上专网后,我的后端尝试调用librespeed失败,使用终端命令行连接远端服务器接口显示连接超时。100%复现。

换回原来的网络就可以正常通讯:

解决
使用curl测试,发现立刻返回链路正常,一直找不到原因(这里埋了个坑❗)。

换不同德网络现象不一样,curl能通但librespeed不可以,那么先研究一下curl和librespeed有什么区别,发现librespeed可以自动优化网络策略。
怀疑是这个问题,后面强制让librespeed使用ipv4,固定网卡,有50%的几率可以成功,换一套网络访问相同的服务器就可以。
./out/librespeed-cli-linux-arm64 \
--ipv4 \
--interface usb0 \
--timeout 30 \
--local-json new.json
回到原来的起点,使用curl指令,怀疑curl只执行了部分链接,加个""(记住了之后用curl要加"")。
curl "http://10.230.12.28/backend/getIP.php?distance=km\&isp=true"
这回现象和librespeed一模一样,改成
curl "http://10.230.12.28/backend/getIP.php?distance=km"
可以立刻返回,说明"isp=true"有问题。
进到服务器:
docker ps
CONTAINER ID IMAGE NAMES
f6565ba48d49 librespeed librespeed-server
docker exec -it librespeed-server /bin/bash
cat /var/www/html/backend/getIP.php
找到相关代码:
php
if (is_string($ipInfo)) {
$processedString .= ' - '.$ipInfo;
}
if (
is_array($rawIspInfo)
&& array_key_exists('country', $rawIspInfo)
) {
$processedString .= ', '.$rawIspInfo['country'];
}
if (is_string($distance)) {
$processedString .= ' ('.$distance.')';
}
sendHeaders();
echo json_encode([
'processedString' => $processedString,
'rawIspInfo' => $rawIspInfo ?: '',
]);
}
$ip = getClientIp();
$localIpInfo = getLocalOrPrivateIpInfo($ip);
// local ip, no need to fetch further information
if (is_string($localIpInfo)) {
sendResponse($ip, $localIpInfo);
exit;
}
if (!isset($_GET['isp'])) {
sendResponse($ip);
exit;
}
$rawIspInfo = getIspInfo($ip);
$isp = getIsp($rawIspInfo);
$distance = getDistance($rawIspInfo);
sendResponse($ip, $isp, $distance, $rawIspInfo);
这段代码里,只有带了isp,就会执行
php
$rawIspInfo = getIspInfo($ip);
$isp = getIsp($rawIspInfo);
$distance = getDistance($rawIspInfo);
而 getIspInfo($ip) 正是:
-
反向 DNS
-
whois
-
第三方 API
-
GeoIP
这些在专网/内网/NAT环境下极容易卡死或超时,于是 CLI 就等不到 header,直接报错。
把下面这段:
php
if (!isset($_GET['isp'])) {
sendResponse($ip);
exit;
}
$rawIspInfo = getIspInfo($ip);
$isp = getIsp($rawIspInfo);
$distance = getDistance($rawIspInfo);
sendResponse($ip, $isp, $distance, $rawIspInfo);
改成:
php
if (!isset($_GET['isp'])) {
sendResponse($ip);
exit;
}
// === 专网 / 内网环境:禁用 ISP 查询,防止阻塞 ===
sendResponse($ip, null, null, null);
exit;
-
保留
isp参数兼容性 -
但不再调用
getIspInfo() -
直接返回一个"没有 ISP 的正常 JSON"
-
不再进入任何 ISP / whois / DNS / 外部查询
大概率会返回:
php
{
"processedString": "172.170.11.47",
"rawIspInfo": ""
}
修改指令:
php
sed -i '/\$rawIspInfo = getIspInfo/,+4c\sendResponse($ip);\nexit;' /var/www/html/backend/getIP.php
确认修改成功,进行验证,成功!