Skip to content

fix: 修复高并发下自适应超时过低导致开放端口漏扫#597

Closed
fyihang wants to merge 1 commit into
shadow1ng:mainfrom
fyihang:fix/issue-503-port-scan-missing
Closed

fix: 修复高并发下自适应超时过低导致开放端口漏扫#597
fyihang wants to merge 1 commit into
shadow1ng:mainfrom
fyihang:fix/issue-503-port-scan-missing

Conversation

@fyihang

@fyihang fyihang commented Jul 11, 2026

Copy link
Copy Markdown

问题

Issue #503 反映 fscan 2.x 扫描本机时部分端口漏扫,而 1.8.4 不存在此问题。

原因

2.x 引入的 AdaptiveTimeout(自适应超时)在高并发场景下下限过低:

  1. 扫描本机时 RTT 接近 0,自适应超时在 10 次采样后迅速降到 100ms 下限
  2. 600+ 并发下 TCP 握手存在尾延迟(OS 调度抖动、backlog 溢出、端口竞争),部分开放端口的连接耗时超过 100ms
  3. 超时错误不会被重试(connectWithRetry 只重试资源耗尽错误),开放端口被永久漏扫

修复

1. 提高自适应超时下限(core/adaptive_timeout.go)

minTO 从固定 100ms 改为 max(500ms, maxTimeout/5):

  • 默认 3s 超时:下限 100ms -> 600ms
  • LAN 环境 1s 超时:下限 100ms -> 500ms

2. 超时错误重试(core/port_scan.go)

connectWithRetry 新增 fallbackTimeout 参数,连接超时时用完整超时再试一次,避免自适应超时过低导致误判。

3. 任务丢弃日志(core/port_scan.go)

slidingWindowSchedule 中 pool.Invoke 失败不再静默丢弃,改为记录日志和总计统计,方便排查漏扫。

测试

全部测试通过,包括自适应超时收敛测试验证新下限工作正常:

TestReal_AdaptiveTimeout_Convergence: 3s -> 600ms (20 samples)
TestIntegration_DualRTTTracking: AdaptiveTO=600ms, Ratio=1.00

Closes #503

扫描本机/低 RTT 目标时,AdaptiveTimeout 在 10 次采样后迅速收敛到 100ms 下限。高并发(600+ 线程)下 TCP 握手尾延迟可能超过 100ms,加上超时错误不会重试,导致开放端口被误判为关闭。

- AdaptiveTimeout 下限从 100ms 提升至 max(500ms, maxTimeout/5)
- connectWithRetry 对超时错误用完整超时重试一次
- slidingWindowSchedule 任务丢弃时记录日志,便于排查漏扫
@ZacharyZcR
ZacharyZcR self-requested a review July 11, 2026 09:11
@fyihang fyihang closed this Jul 11, 2026
@fyihang
fyihang deleted the fix/issue-503-port-scan-missing branch July 11, 2026 09:26
@fyihang
fyihang restored the fix/issue-503-port-scan-missing branch July 11, 2026 09:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

新版本扫描内网端口存在问题

1 participant