Vreau să fac câteva experimente cu pachetele TCP. Prin urmare, folosesc gopacket (v1.1.19) pentru a crea pachete și a le trimite pe o interfață.
Am acest cod pentru a crea un pachet SYN și a-l pune pe loopback și a trimite la 127.0.0.1:8888 unde am un server ncat care ascultă (ncat -v -l 127.0.0.1 8888).
Îmi văd pachetul pe wireshark așa cum era de așteptat, dar nu există niciun pachet SYN/ACK trimis de server. Apelarea localhost:8888 din browser funcționează perfect. Și mi-am construit pachetul astfel încât să semene cu cel trimis de browser (suma de control, marca temporală și portul sunt diferite).
Are cineva o idee care este problema mea sau la ce aș putea căuta?
pachet principal
import (
    "codificare/binar"
    „github.com/google/gopacket”
    „github.com/google/gopacket/layers”
    „github.com/google/gopacket/pcap”
    "Buturuga"
    "matematică/rand"
    "net"
    "timp"
)
var (
    șir dispozitiv = „lo”
    snapshotLen int32 = 1024
    promiscuous bool = false
    eroare eroare
    timeout time.Durata = 30 * time.Secund
    mâner *pcap.Mâner
    buffer gopacket.SerializeBuffer
    opțiuni gopacket.SerializeOptions= gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true}
    ethernetLayer layers.Ethernet = straturi.Ethernet{
        SrcMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
        DstMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
        EthernetType: layers.EthernetTypeIPv4,
    }
    ipLayer layers.IPv4 = layers.IPv4{
        Versiunea: 4,
        SrcIP: net.IP{127, 0, 0, 1},
        DstIP: net.IP{127,0,0,1},
        Protocol: layers.IPProtocolTCP,
        TTL: 64,
        FragOffset: 0,
        Steaguri: layers.IPv4DontFragment,
    }
)
func syn() []octet {
    rand.Seed(time.Now().UnixMilli())
    buffer = gopacket.NewSerializeBuffer()
    option1 := layers.TCPOption{layers.TCPOptionKindWindowScale, 3,[]byte{7} }
    bs := make([]octet, 2)
    binary.BigEndian.PutUint16(bs,56495)
    option2 := layers.TCPOption{layers.TCPOptionKindMSS, 0, bs }
    bsTsval := make([]byte,4)
    bsTsecr := make([]byte,4)
    binary.BigEndian.PutUint32(bsTsval,uint32(time.Now().UnixMilli()))
    bsTime := append(bsTsval, bsTsecr...)
    opțiunea3 := layers.TCPOption{layers.TCPOptionKindTimestamps,0, bsTime}
    tcpLayerSYN := &layers.TCP{
        SrcPort: layers.TCPPort(rand.Intn(0xffff-1)+1),
        DstPort: layers.TCPPort(8888),
        SYN: adevărat,
        Seq: rand.Uint32(),
        Fereastra: 65495,
        Opțiuni: []layers.TCPOption{opțiune1, opțiune2, opțiune3},
    }
    tcpLayerSYN.SetNetworkLayerForChecksum(&ipLayer)
    // Și creați pachetul cu straturile
    buffer = gopacket.NewSerializeBuffer()
    gopacket.SerializeLayers(buffer, opțiuni,
        ðernetLayer,
        &ipLayer,
        tcpLayerSYN,
    )
    outgoingPacket := buffer.Bytes()
    returnează pachetul de ieșire
}
func principal() {
    // Deschideți dispozitivul
    handle, err = pcap.OpenLive (dispozitiv, snapshotLen, promiscuu, timeout)
    if err != nil {log.Fatal(err) }
    defer handle. Close()
    err = handle.WritePacketData(syn())
}