在 Ubuntu 上“调试 sniffer”通常指排查抓包工具(如 tcpdump / Wireshark / sniffer 程序)为什么抓不到包、报错或行为异常。下面按常见场景给你一套系统化的调试方法。
sudo apt update
sudo apt install tcpdump wireshark ethtool
普通用户默认不能抓包:
groups
若无 pcap 或不在 sudo:
sudo usermod -aG pcap $USER
# 或
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
重新登录生效。
ip addr
ip link
ip link show eth0
若为 DOWN:
sudo ip link set eth0 up
sudo tcpdump -i eth0
或看计数器:
ip -s link
lo:本地回环docker0 / veth*:容器流量ens* 或 eth0✅ 建议:
sudo tcpdump -i any
虽然 Sniffer 一般在更底层,但某些虚拟环境会丢包:
sudo nft list ruleset
sudo iptables -L -n -v
常见于:
关闭 offload:
sudo ethtool -K eth0 tso off
sudo ethtool -K eth0 gro off
sudo ethtool -K eth0 lro off
查看状态:
ethtool -k eth0
veth调试:
brctl show
ip link
sudo tcpdump -i docker0
如果你是写 C / Python sniffer:
socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
需要:
sudo setcap cap_net_raw=ep your_program
recvfrom() 返回值perror("recvfrom");
sudo tcpdump -i eth0 -w test.pcap
你的程序抓不到,但 tcpdump 能 → 代码或权限问题。
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 |
| 程序崩溃 | 缓冲区太小 |
你可以告诉我:
我可以直接帮你定位问题。