Maison >développement back-end >Golang >Comment puis-je créer et envoyer des paquets TCP bruts à l'aide de Golang et gopacket ?

Comment puis-je créer et envoyer des paquets TCP bruts à l'aide de Golang et gopacket ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-08 01:46:121009parcourir

How can I craft and send raw TCP packets using Golang and gopacket?

Création et envoi de paquets TCP bruts avec Golang à l'aide de gopacket

Vous souhaitez créer des paquets TCP personnalisés à l'aide de gopacket et les transmettre via des sockets bruts. Permettez-nous de vous guider tout au long du processus :

Création d'en-têtes de paquets IP et TCP personnalisés

Bien que votre question mentionne la création de paquets TCP personnalisés, votre code suggère que vous souhaitez modifier les en-têtes IPv4 couche 3 et TCP couche 4. Nous nous concentrerons sur IPv4 pour cet exemple :

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

Création d'un socket brut dans Golang

Contrairement aux réponses incorrectes sur cette plateforme, Go autorise le socket brut création à l’aide de net.ListenPacket, net.DialIP ou net.ListenIP. Par exemple :

conn, err := net.ListenIP("ip4:tcp", netaddr)
if err != nil {
    log.Fatalf("ListenIP: %s\n", err)
}

Activation de l'inclusion de l'en-tête IP

Sur macOS et Linux, vous pouvez définir l'option de socket IP_HDRINCL pour autoriser la modification personnalisée de l'en-tête IPv4.

conn.SetsockoptIPHDRINCL(true)

Envoi du Paquet

Enfin, envoyez le paquet à l'aide du socket brut :

_, err = conn.WriteTo(buf.Bytes(), &dstIPaddr)
if err != nil {
    panic(err)
}

Remarque : Pour éviter les répétitions, nous nous sommes concentrés sur les étapes principales de l'assemblage le paquet et l'envoyer via un socket brut. Même si nous pensons que cette réponse est techniquement correcte et complète, elle n'est pas destinée à constituer une solution de code complète.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn