librespeed-cli连接超时原因分析

现象

换上专网后,我的后端尝试调用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

确认修改成功,进行验证,成功!

相关推荐
Hi202402172 小时前
使用Smokeping监控公网服务器质量
运维·服务器·php·smokeping
码农水水3 小时前
京东Java面试被问:Spring Boot嵌入式容器的启动和端口绑定原理
java·开发语言·人工智能·spring boot·面试·职场和发展·php
运筹vivo@4 小时前
攻防世界: simple_php
android·php·android studio
BingoGo4 小时前
Livewire4 正式发布!PHP 也可以无需写一行 Javascript 代码就能实现 Vue 的功能
后端·php
catchadmin16 小时前
Laravel12 + Vue3 的免费可商用商业级管理后台 CatchAdmin V5 正式发布
开发语言·php
亚历山大海17 小时前
PHPword支持导出富文本网络图片,支持SVG导出
php
小李独爱秋18 小时前
计算机网络经典问题透视:TLS协议工作过程全景解析
运维·服务器·开发语言·网络协议·计算机网络·php
易营宝20 小时前
高效的跨境电商广告优化系统:易营宝广告投放实操指南
大数据·开发语言·人工智能·php
运维行者_1 天前
远程办公场景 NFA:从网络嗅探与局域网流量监控软件排查团队网络卡顿问题
运维·服务器·开发语言·网络·自动化·php
掘根1 天前
【仿Muduo库项目】HTTP模块4——HttpServer子模块
网络协议·http·php