温馨提示×

怎样调试ubuntu sniffer

小樊
45
2026-10-24 02:45:39
栏目: 智能运维

在 Ubuntu 上“调试 sniffer”通常指排查抓包工具(如 tcpdump / Wireshark / sniffer 程序)为什么抓不到包、报错或行为异常。下面按常见场景给你一套系统化的调试方法。


一、确认基础环境

1. 是否安装必要工具

sudo apt update
sudo apt install tcpdump wireshark ethtool

2. 用户是否有权限

普通用户默认不能抓包:

groups

若无 pcap 或不在 sudo:

sudo usermod -aG pcap $USER
# 或
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap

重新登录生效。


二、确认网卡与流量

1. 查看网卡

ip addr
ip link

2. 确认网卡是 UP

ip link show eth0

若为 DOWN:

sudo ip link set eth0 up

3. 确认有流量

sudo tcpdump -i eth0

或看计数器:

ip -s link

三、常见抓不到包原因(重点)

1. 抓错网卡

  • lo:本地回环
  • docker0 / veth*:容器流量
  • 云服务器常走 ens* 或 eth0

✅ 建议:

sudo tcpdump -i any

2. 被防火墙 / nftables 影响

虽然 Sniffer 一般在更底层,但某些虚拟环境会丢包:

sudo nft list ruleset
sudo iptables -L -n -v

3. 网卡 Offload 导致抓不到“真实包”

常见于:

  • TSO / GRO / LRO
  • 大包被合并

关闭 offload:

sudo ethtool -K eth0 tso off
sudo ethtool -K eth0 gro off
sudo ethtool -K eth0 lro off

查看状态:

ethtool -k eth0

4. 虚拟环境(Docker / K8s / 虚拟机)

  • Docker 容器流量在 veth
  • 虚拟机可能走 bridge

调试:

brctl show
ip link
sudo tcpdump -i docker0

四、调试你自己的 Sniffer 程序

如果你是写 C / Python sniffer:

1. 使用 raw socket 的权限

socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

需要:

sudo setcap cap_net_raw=ep your_program

2. 打开调试输出

  • 打印 recvfrom() 返回值
  • 打印 errno
perror("recvfrom");

3. 对比 tcpdump

sudo tcpdump -i eth0 -w test.pcap

你的程序抓不到,但 tcpdump 能 → 代码或权限问题。


五、用 Wireshark 调试

sudo wireshark

或:

sudo dumpcap -i eth0 -w debug.pcap

过滤示例:

tcp.port == 80
host 192.168.1.1

六、常见错误速查表

现象 原因
Permission denied 无 CAP_NET_RAW
抓不到包 网卡错 / offload
只有本地流量 抓了 lo
Docker 无流量 没抓 veth
程序崩溃 缓冲区太小

七、如果你愿意,我可以更具体帮你

你可以告诉我:

  1. 用的是 tcpdump / Wireshark / 自写程序
  2. Ubuntu 版本
  3. 物理机 / 虚拟机 / 容器
  4. 报错信息或现象截图

我可以直接帮你定位问题。

0 踩