lidar 使用指南

nettools · TCP SYN 网络可达性探测工具

Usage Guide — 涵盖原理、安装、命令行参数、配置文件及典型使用场景。

← 返回首页

目录

1. 概述

Client lidar 是百度系统部物理网络黑盒监控团队开发的 TCP SYN 可达性探测工具。它通过发送原始 TCP SYN 报文并分析响应来判定目标主机和端口的网络状态,无需在远端部署任何服务端程序。

核心特性:

零部署

  • 无需远端安装软件
  • 只需目标 IP + 端口
  • 任意 TCP 端口可探测
  • 即时启动,即时出结果

精准分类

  • SYN-ACK = 端口开放
  • RST = 端口关闭/拒绝
  • Timeout = 不可达/丢包
  • 区分网络层和应用层故障

多目标并行

  • 支持逗号分隔多 IP
  • 同一速率限制下轮询
  • 每个目标独立统计
  • 适合批量探测场景

2. 工作原理

lidar 基于 TCP 三次握手的前两步来判断网络可达性:

# 正常流程(三次握手前两步)
Client                          Server
  |-- SYN (seq=N) ------------>|    # lidar 发送 SYN
  |<-- SYN-ACK (ack=N+1) ------|    # 端口开放 → 可达

# 端口关闭
Client                          Server
  |-- SYN (seq=N) ------------>|    # lidar 发送 SYN
  |<-- RST --------------------|    # 端口关闭 → 拒绝

# 不可达
Client                          Server
  |-- SYN (seq=N) ------------>|    # lidar 发送 SYN
  |   (无响应)                  |    # 超时 → 不可达/丢包

lidar 构造原始 IP + TCP SYN 报文,通过 raw socket 发送,并通过 BPF 设备(macOS)或 raw socket(Linux)接收响应。内核 TCP 协议栈不会处理这些报文,因此不会影响系统已有的 TCP 连接。

Note:在 macOS 上,raw socket(IPPROTO_TCP)无法接收 TCP 响应报文,因为内核 TCP 栈会优先处理。lidar 使用 BPF(/dev/bpf*)设备绕过此限制,直接从链路层捕获响应。

3. 使用场景

lidar 适用于以下网络可达性探测场景:

机房内网络探测

  • 机房内部服务器间网络可达性验证
  • 快速发现网络设备故障或配置错误
  • 批量探测多个目标 IP

海外机房探测

  • 跨地域/跨国网络质量监测
  • 高延迟链路丢包率评估
  • 专线/公网路径质量对比

LCC 机房探测

  • LCC 机房间链路连通性验证
  • 机房间网络链路持续监测
  • 网络割接前后质量对比

故障排查

  • 区分网络不可达与端口关闭
  • 定位丢包发生在哪个网络段
  • 配合 verbose 模式定位丢包端口

防火墙验证

  • 验证防火墙规则是否生效
  • 区分 DROP(timeout)和 REJECT(RST)
  • 多端口探测验证端口策略

上线前验证

  • 新服务器上线前网络可达性检查
  • 服务端口是否正常监听
  • 批量验证一批新机器的连通性

4. 与 bitflip / baize 的区别

nettools 工具集内的三个工具各有侧重:

特性bitflipbaizelidar
探测协议UDPUDPTCP SYN
是否需要服务端需要(bitflip server)需要(baize server)不需要
探测内容丢包 + bitflip丢包 + bitflip可达性(SYN-ACK/RST/Timeout)
配置方式命令行参数JSON 配置文件命令行参数 / JSON 配置文件
适用场景UDP 质量监控长期持续监控快速可达性探测
运行平台Linux / macOSLinux / macOSLinux / macOS
Tip:如果需要 UDP 层面的丢包和 bitflip 检测,使用 bitflip 或 baize;如果只需确认目标是否可达(无需部署服务端),使用 lidar。

5. 安装

从源码编译

# 克隆仓库
git clone https://github.com/baidu/nettools.git
cd nettools

# 编译全部工具
make compile

# 或单独编译 lidar
go build -o lidar ./cmd/lidar/

运行要求

要求说明
root 权限需要 sudo 运行,因为 raw socket 和 BPF 设备需要特权
macOS / LinuxmacOS 通过 BPF 设备接收,Linux 通过 raw socket 接收
网络连通需要能向目标 IP 发送原始 IP 报文
Note:lidar 必须 sudo 运行。raw socket(SOCK_RAW)和 BPF 设备(/dev/bpf*)都需要 root 权限。

6. 快速开始

1. 单目标探测

# 探测 10.0.0.2 的 80 端口(默认 10 pps)
sudo ./lidar -t 10.0.0.2 -p 80

2. 多目标探测

# 同时探测多个目标
sudo ./lidar -t 10.0.0.2,10.0.0.3,10.0.0.4 -p 22

3. 高速率探测

# 以 100 pps 探测,持续 30 秒
sudo ./lidar -t 10.0.0.2 -p 80 --rate 100 -d 30s

4. 指定发送数量

# 发送 1000 个探测包后自动停止
sudo ./lidar -t 10.0.0.2 -p 80 -n 1000

5. 使用配置文件

# 用配置文件启动(适合重复性探测任务)
sudo ./lidar -c lidar.json

# 配置文件 + 命令行覆盖(临时改端口)
sudo ./lidar -c lidar.json -p 443

7. 命令行参数详解

参数短选项默认值说明
--targets-t目标 IP 地址,逗号分隔(必填)
--port-p22目标 TCP 端口
--local-addr-l自动检测源 IP 地址
--local-port54321源端口起始值
--local-port-count100源端口数量(用于 ECMP 路径覆盖)
--rate10每秒发送探测包数(pps)
--span-s1s统计报告间隔
--delay3s首次统计前的等待时间(等待在途报文)
--count-n0最大发送数量(0 = 无限)
--duration-d0最大发送时长(0 = 无限)
--interface-i自动检测出接口名称(自动检测失败时指定)
--verbose-vfalse打印丢包的详细端口信息
Tip:--local-port--local-port-count 控制源端口轮转范围。lidar 会从 local-port 开始依次递增,达到 local-port + local-port-count - 1 后回到起始值。多源端口可以覆盖不同的 ECMP 路径。

8. 配置文件

lidar 支持通过 JSON 配置文件指定参数,适合重复性探测任务和自动化场景。使用 -c 指定配置文件路径。

优先级

当配置文件和命令行参数同时提供时:命令行参数优先,会覆盖配置文件中的同名项。未在命令行中显式指定的参数使用配置文件中的值。

优先级来源说明
命令行参数显式指定的 -p--rate 等会覆盖配置文件
JSON 配置文件-c lidar.json 指定,未覆盖的字段使用文件值
代码默认值配置文件和命令行都未指定时使用默认值

配置文件格式

{
  "target_addrs":     "10.0.0.1,10.0.0.2",
  "server_port":      80,
  "local_addr":       "",
  "local_port":       54321,
  "local_port_count": 100,
  "rate":             10,
  "span":             "1s",
  "delay":            "3s",
  "count":            0,
  "send_duration":    "0s",
  "interface":        "",
  "verbose":          false
}

配置字段说明

字段类型对应命令行参数说明
target_addrsstring-t目标 IP 地址,逗号分隔
server_portint-p目标 TCP 端口
local_addrstring-l源 IP 地址(空字符串自动检测)
local_portint--local-port源端口起始值
local_port_countint--local-port-count源端口数量
rateint--rate每秒发送探测包数(pps)
spanstring-s统计报告间隔(如 "1s"、"5s")
delaystring--delay首次统计前的等待时间
countint-n最大发送数量(0 = 无限)
send_durationstring-d最大发送时长(如 "30s"、"5m")
interfacestring-i出接口名称(空字符串自动检测)
verbosebool-v打印丢包的详细端口信息

使用方式

# 仅使用配置文件
sudo ./lidar -c lidar.json

# 配置文件 + 命令行覆盖(临时调整端口为 443)
sudo ./lidar -c lidar.json -p 443

# 配置文件 + 命令行覆盖(临时调高速率)
sudo ./lidar -c lidar.json --rate 100 -d 30s
Tip:完整示例配置文件见 cmd/lidar/lidar.example.json。可以将常用参数写在配置文件中,运行时通过命令行临时覆盖需要调整的字段。

9. 输出解读

启动日志

2026/06/05 21:37:14 [INFO] probing 1 target(s) on port 80 from 192.168.1.14 (rate: 10 pps)
2026/06/05 21:37:14 [INFO] bound BPF to en0 (DLT=1)

启动时打印目标数量、端口、本机 IP、探测速率和绑定的 BPF 设备信息。

统计报告

2026/06/05 21:37:17 [WARN] 21:37:14, [192.168.1.14 -> 74.48.173.243], sent: 10, received: 10 (SYN-ACK: 10, RST: 0), timeout: 0
2026/06/05 21:37:18 [INFO] 21:37:15, [192.168.1.14 -> 74.48.173.243], sent: 10, received: 10 (SYN-ACK: 10, RST: 0), timeout: 0
字段说明
sent该时间窗口内发送的探测包总数
received收到响应的探测包总数
SYN-ACK收到 SYN-ACK 响应的数量(目标端口开放)
RST收到 RST 响应的数量(目标端口关闭/拒绝)
timeout未收到响应的探测包数量(目标不可达/丢包)

日志级别

级别条件含义
[INFO]timeout = 0全部收到响应,网络正常
[WARN]timeout > 0存在丢包或不可达
Note:首次统计报告会在启动 delay(默认 3 秒)后出现。这是为了等待在途报文返回,确保统计的准确性。

Verbose 模式

开启 -v 后,丢包时会打印超时的源端口-目的端口对:

2026/06/05 21:37:18 [WARN] 21:37:15, [192.168.1.14 -> 74.48.173.243], sent: 10, received: 8 (SYN-ACK: 8, RST: 0), timeout: 2
2026/06/05 21:37:18 [WARN] 21:37:15, [192.168.1.14 -> 74.48.173.243], timeout ports: map[54322-80:1 54325-80:1]

10. 使用示例

机房内服务器可达性检查

# 检查机柜内 3 台服务器的 SSH 端口
sudo ./lidar -t 10.0.1.10,10.0.1.11,10.0.1.12 -p 22 -d 60s

Web 服务可用性监控

# 以 10 pps 持续探测 Web 服务的 80 端口
sudo ./lidar -t www.example.com对应的IP -p 80 --rate 10

海外机房高延迟链路探测

# 高速率探测海外节点(100 pps,持续 5 分钟)
sudo ./lidar -t 74.48.173.243 -p 443 --rate 100 -d 5m

网络割接前后对比

# 割接前:发送 5000 个包,verbose 模式
sudo ./lidar -t 10.0.0.2 -p 80 -n 5000 -v

# 割接后:同样参数再次探测
sudo ./lidar -t 10.0.0.2 -p 80 -n 5000 -v

指定出接口

# 多网卡环境下指定出接口
sudo ./lidar -t 10.0.0.2 -p 80 -i eth1

ECMP 路径覆盖

# 使用更多源端口覆盖不同 ECMP 路径
sudo ./lidar -t 10.0.0.2 -p 80 --local-port 40000 --local-port-count 500 --rate 500 -d 60s

11. FAQ

Q: lidar 和 ping 有什么区别?

ping 使用 ICMP Echo,只能判断 IP 层可达性。lidar 使用 TCP SYN,可以判断特定 TCP 端口是否可达,并能区分端口开放(SYN-ACK)、端口关闭(RST)和不可达(timeout)三种状态。

Q: 为什么必须 sudo 运行?

lidar 使用 raw socket(SOCK_RAW)构造原始 IP/TCP 报文,并在 macOS 上使用 BPF 设备(/dev/bpf*)接收响应,这些操作都需要 root 权限。

Q: 探测目标需要安装什么吗?

不需要。lidar 利用目标主机内核的 TCP 协议栈自动响应 SYN 报文。只要目标 IP 可达且 TCP 端口有服务监听,就会返回 SYN-ACK;端口关闭则返回 RST。无需在远端安装任何软件。

Q: lidar 会影响目标服务器的正常 TCP 连接吗?

不会。lidar 发送 SYN 后收到 SYN-ACK 即完成统计,不会发送 ACK 完成三次握手。目标服务器会在超时后自动清理这个半开连接,不影响已有的 TCP 连接。

Q: 为什么第一个统计报告要等 3 秒?

--delay(默认 3 秒)是为了等待在途报文返回。如果立即统计,最后几个探测包的响应可能还没回来,会被误判为丢包。可以通过 --delay 调整等待时间。

Q: 如何停止 lidar?

Ctrl+C 发送 SIGINT 信号。lidar 会等待 delay 时间让在途报文返回后退出,确保最后的统计数据准确。如果指定了 -n-d,到达限制后也会自动停止。

Q: --rate 应该设多少?

取决于网络环境和目标数量。默认 10 pps 适合一般探测。高速率(100-1000 pps)适合压力测试或高精度丢包检测。注意过高速率可能被网络设备限速或触发安全策略。

Q: 自动检测出接口失败怎么办?

如果自动检测失败,使用 -i 指定出接口名称,例如 -i eth0(Linux)或 -i en0(macOS)。