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())
}