You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:05:14