基于ARP欺骗与IP转发的数据包捕获问题求助
解决ARP欺骗场景下无法捕获响应数据包的问题
你遇到的问题核心是:开启IP转发后,内核直接转发了路由器返回的数据包,导致pcap无法捕获到这些响应包。以下是具体的解决步骤:
必须以root权限运行程序
开启网卡混杂模式需要root权限,普通用户运行时pcap.OpenLive的promiscuous参数会被系统忽略,导致只能捕获发往本机的包,无法捕获经过网卡的转发流量。启动程序时加上sudo。验证混杂模式是否生效
运行程序后,用命令查看网卡状态:ip link show <你的网卡名称>输出中如果包含
PROMISC字样,说明混杂模式已成功开启;如果没有,检查程序是否有权限,或者手动开启:sudo ip link set <你的网卡名称> promisc on添加BPF过滤规则,精准捕获双向流量
在创建pcap handle后,添加过滤规则,指定捕获被攻击设备和路由器之间的双向数据包,避免无关流量干扰,同时确保不会漏掉响应包。修改代码如下:handle, err := pcap.OpenLive(iface.Name, 65535, true, pcap.BlockForever) if err != nil { return err } defer handle.Close() // 添加BPF过滤规则,替换成实际的被攻击设备IP和路由器IP filter := "host 192.168.1.100 and host 192.168.1.1" if err := handle.SetBPFFilter(filter); err != nil { log.Fatalf("设置过滤规则失败: %v", err) } src := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet) // 后续代码不变...把
snaplen从1024改成65535,确保能捕获完整的数据包(避免截断)。禁用内核转发加速(可选)
部分Linux内核的快速转发机制会跳过pcap的捕获点,导致转发的数据包无法被捕获。可以临时关闭该优化:sudo sysctl -w net.ipv4.conf.all.accept_local=1 sudo sysctl -w net.ipv4.conf.<你的网卡名称>.accept_local=1这样内核会把转发的数据包也交给pcap处理。
检查iptables规则
如果系统中有iptables规则,可能会拦截或修改数据包,导致pcap无法捕获。可以临时清空iptables规则测试:sudo iptables -F sudo iptables -t nat -F
内容的提问来源于stack exchange,提问作者has van
相关产品推荐
相关产品推荐

