ホームページ > バックエンド開発 > Golang > Golang と gopacket を使用して生の TCP パケットを作成して送信するにはどうすればよいですか?

Golang と gopacket を使用して生の TCP パケットを作成して送信するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-08 01:46:12
オリジナル
947 人が閲覧しました

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

gopacket を使用した Golang での生の TCP パケットの作成と送信

gopacket を使用してカスタム TCP パケットを構築し、生のソケット経由で送信したいと考えています。プロセスをご案内します:

カスタム IP および TCP パケット ヘッダーの作成

質問ではカスタム TCP パケットの作成について言及していますが、コードは変更することを示唆しています。 IPv4 レイヤ 3 ヘッダーと TCP レイヤ 4 ヘッダーの両方。この例では 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)
}
ログイン後にコピー

Golang での Raw ソケットの作成

このプラットフォームでの誤った応答とは対照的に、Go では Raw ソケットが許可されていますnet.ListenPacket、net.DialIP、または net.ListenIP を使用して作成します。例:

conn, err := net.ListenIP("ip4:tcp", netaddr)
if err != nil {
    log.Fatalf("ListenIP: %s\n", err)
}
ログイン後にコピー

IP ヘッダーの組み込みの有効化

macOS および Linux では、IP_HDRINCL ソケット オプションを設定してカスタム IPv4 ヘッダーの変更を許可できます。

conn.SetsockoptIPHDRINCL(true)
ログイン後にコピー

送信中Packet

最後に、生のソケットを使用してパケットを送信します:

_, err = conn.WriteTo(buf.Bytes(), &dstIPaddr)
if err != nil {
    panic(err)
}
ログイン後にコピー

注: 繰り返しを避けるために、組み立ての中心的な手順に焦点を当てました。パケットを取得し、生のソケット経由で送信します。この応答は技術的に正しく、包括的であると信じていますが、完全なコード ソリューションを意図したものではありません。

以上がGolang と gopacket を使用して生の TCP パケットを作成して送信するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート