Erstellen und Senden von Raw-TCP-Paketen mit Golang unter Verwendung von Gopacket
Sie möchten mit Gopacket benutzerdefinierte TCP-Pakete erstellen und diese über Raw-Sockets übertragen. Erlauben Sie uns, Sie durch den Prozess zu führen:
Erstellen benutzerdefinierter IP- und TCP-Paket-Header
Während Ihre Frage die Erstellung benutzerdefinierter TCP-Pakete erwähnt, deutet Ihr Code darauf hin, dass Sie Änderungen vornehmen möchten sowohl die IPv4-Layer-3- als auch die TCP-Layer-4-Header. In diesem Beispiel konzentrieren wir uns auf IPv4:
// Example Packet Definition import ( "code.google.com/p/gopacket" "code.google.com/p/gopacket/examples/util" "code.google.com/p/gopacket/layers" "log" "net" ) // Packet Data srcIP := net.ParseIP("127.0.0.1") dstIP := net.ParseIP("192.168.0.1") ipLayer := layers.IPv4{ SrcIP: srcIP, DstIP: dstIP, Protocol: layers.IPProtocolTCP, } tcpLayer := layers.TCP{ SrcPort: layers.TCPPort(666), DstPort: layers.TCPPort(22), SYN: true, } // Compute Checksums and Serialize Packet tcpLayer.SetNetworkLayerForChecksum(&ipLayer) buf := gopacket.NewSerializeBuffer() err := gopacket.SerializeLayers(buf, gopacket.SerializeOptions{ FixLengths: true, ComputeChecksums: true, }, &ipLayer, &tcpLayer) if err != nil { panic(err) }
Erstellen eines Raw-Sockets in Golang
Im Gegensatz zu falschen Antworten auf dieser Plattform ermöglicht Go Raw-Socket Erstellung mit net.ListenPacket, net.DialIP oder net.ListenIP. Zum Beispiel:
conn, err := net.ListenIP("ip4:tcp", netaddr) if err != nil { log.Fatalf("ListenIP: %s\n", err) }
IP-Header-Einbindung aktivieren
Unter macOS und Linux können Sie die IP_HDRINCL-Socket-Option festlegen, um eine benutzerdefinierte IPv4-Header-Änderung zu ermöglichen.
conn.SetsockoptIPHDRINCL(true)
Senden der Paket
Abschließend senden Sie das Paket über den Raw-Socket:
_, err = conn.WriteTo(buf.Bytes(), &dstIPaddr) if err != nil { panic(err) }
Hinweis: Um Wiederholungen zu vermeiden, haben wir uns auf die Kernschritte für den Zusammenbau konzentriert das Paket und sendet es über einen Raw-Socket. Obwohl wir glauben, dass diese Antwort technisch korrekt und umfassend ist, ist sie nicht als vollständige Codelösung gedacht.
Das obige ist der detaillierte Inhalt vonWie kann ich rohe TCP-Pakete mit Golang und Gopacket erstellen und senden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!