Java-使用自定义源IP发送SNMP陷阱

问题描述

我正在尝试使用Java应用程序将SNMP陷阱发送到我接收和处理它的VM计算机。 我还需要确保使用特定的源IP地址发送陷阱,该地址将由用户输入提供。

我无法在接收端更改代码,因此我不得不直接更改IpV4数据包上的源IP地址。

我取得了一些成功,首先使用snmp4j发送陷阱,使用pcap4j捕获数据包,然后更改数据包并重新发送。 通过此解决方案,可以将两个数据包发送到VM,并在使用Wireshark时正确捕获这两个数据包。

但是我想要一个不包含重复数据包的解决方案,因为接收系统似乎并没有处理发送的两个陷阱,而只是处理第一个陷阱。

我尝试将第一个陷阱发送到localhost,但是Pcaps.findAllDevs()中的所有设备都无法捕获该数据包。 我也曾尝试从初始陷阱数据包的原始数据构建数据包,但是最终结果似乎比普通数据包大得多,并且Wireshark无法识别SNMP数据。

以下是我使用接收到的SNMP陷阱中的原始数据来构建数据包的代码

EthernetPacket ethPacket = EthernetPacket.newPacket(snmpTrapData,snmpTrapData.length);
IpV4Packet ipv4Packet = IpV4Packet.newPacket(ethPacket.getPayload().getRawData(),ethPacket.getPayload().getRawData().length) ;
UdpPacket udpPacket = UdpPacket.newPacket(ipv4Packet.getPayload().getRawData(),ipv4Packet.getPayload().getRawData().length);
UnkNownPacket unkNownPacket = UnkNownPacket.newPacket(udpPacket.getPayload().getRawData(),udpPacket.getPayload().getRawData().length);
    
UnkNownPacket.Builder unkNownBuilder = unkNownPacket.getBuilder();
    
UdpPacket.Builder udpBuilder = udpPacket.getBuilder();
udpBuilder
        .srcAddr(InetAddress.getByName(sourceIpAddress))
        .srcPort(UdpPort.getInstance((short) 161))
        .dstAddr(InetAddress.getByName(targetIpAddress))
        .dstPort(UdpPort.getInstance((short) 162))
        .payloadBuilder(unkNownBuilder)
        .length((short)unkNownPacket.getRawData().length);
    
IpV4Packet.Builder ipv4Builder = ipv4Packet.getBuilder();
ipv4Builder
        .srcAddr((Inet4Address) Inet4Address.getByName(sourceIpAddress))
        .dstAddr((Inet4Address) Inet4Address.getByName(targetIpAddress))
        .dontFragmentFlag(true)
        .reservedFlag(false)
        .fragmentOffset((short)0)
        .protocol(IpNumber.UDP)
        .version(IpVersion.IPV4)
        .ttl((byte)100)
        .payloadBuilder(udpBuilder);

EthernetPacket.Builder ethBuilder = ethPacket.getBuilder();
ethBuilder
        .srcAddr(MacAddress.getByName(srcMacAddress))
        .dstAddr(MacAddress.getByName(dstMacAddress))
        .type(EtherType.IPV4)
        .payloadBuilder(ipv4Builder);

Packet p = ethBuilder.build();

根据我的研究,通过Java无法丢弃原始数据包。所以我的问题是:

  1. 在使用pcap4j本地捕获数据包之前,我需要做一些配置吗?
  2. 我是否在上面代码中构造的更改数据包中丢失了一些与SNMP数据格式混淆的信息,从而使其无法识别?
  3. 还有其他解决方案,要求它必须由Java应用程序触发吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)