tcpdump配合grep捕获协议头异常扫描报文效果有限,因tcpdump不解析应用层、grep仅匹配文本,无法识别加密/分片/非标载荷;应聚焦传输层特征,如syn扫描(同源ip短时多端口syn无ack)、udp/icmp异常频率分布,并用awk+sort+uniq聚合统计源ip行为。

直接用 tcpdump 配合 grep 捕获“协议头中的异常扫描报文”效果有限——因为 tcpdump 本身不解析应用层协议内容,而 grep 只能匹配文本输出,无法可靠识别加密、分片、或非标准格式的载荷。真正有效的做法是:先用 tcpdump 精准过滤出可疑的传输层行为(如大量 SYN、UDP Flood、ICMP 类型异常),再结合结构化分析判断是否为扫描。
聚焦传输层特征,而非协议头内容
端口扫描、主机发现等异常行为在协议栈中体现为特定 TCP/UDP/ICMP 模式,不是靠 grep HTTP 头或 DNS 字符串来发现的:
- SYN 扫描:同一源 IP 短时间内向多个目的端口发 SYN 包(无 ACK)
- UDP 扫描:向大量不同 UDP 端口发空载荷包,常触发 ICMP port-unreachable 回复
- ICMP 扫描:高频发送 type 8(echo request)或 type 13(timestamp)等非常规探测包
- FIN/XMAS/NULL 扫描:TCP 标志位异常组合(如只有 FIN,或 FIN+URG+PUSH),普通服务不会响应
用 tcpdump 过滤 + 命令链快速定位扫描源
不要依赖 grep 匹配“扫描”“nmap”等字符串——攻击工具可自定义载荷,且多数扫描不发应用层数据。推荐实时聚合统计法:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 抓取所有可疑 TCP SYN 请求(排除 ACK):
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) == 0' -nn -q -c 500 - 提取源 IP 和目的端口,统计每个 IP 扫的端口数:
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) == 0' -nn -q 2>/dev/null | awk '{print $3, $5}' | awk -F'[ .:]' '{print $1"."$2"."$3"."$4, $NF}' | sort | uniq | awk '{ip[$1]++; ports[$1] = ports[$1] " " $2} END {for (i in ip) print ip[i], i, ports[i]}' | sort -nr | head -10
对 UDP/ICMP 扫描做轻量级检测
UDP 和 ICMP 扫描更难靠载荷识别,但可通过频率和分布判断:
- UDP 端口扫描(如 nmap -sU):
sudo tcpdump -i eth0 -n udp 'udp[8:2] == 0' -q -c 200 | awk '{print $3}' | sort | uniq -c | sort -nr | head -5
(过滤 UDP 载荷长度为 0 的包,统计源 IP 出现频次) - ICMP 主机发现(ping sweep):
sudo tcpdump -i eth0 -n icmp[icmptype] == 8 -q -c 100 | awk '{print $3}' | sort | uniq -c | sort -nr | head -5
为什么不用 -A 或 -X 加 grep?
绝大多数扫描报文没有应用层载荷:
- TCP SYN 扫描:TCP 头之后全是 0x00,grep 找不到有效字符串
- UDP 扫描:通常发空 UDP 包,-A 输出为空行
- 即使有载荷(如某些 HTTP 探针),也常被 TLS 加密或混淆,grep 无法泛化匹配
- tcpdump -A 输出含时间戳、接口名等干扰字段,grep 易误匹配










