ホームページ > バックエンド開発 > Golang > Go で Raw ソケットを使用してカスタム TCP パケットを作成して送信する方法

Go で Raw ソケットを使用してカスタム TCP パケットを作成して送信する方法

Mary-Kate Olsen
リリース: 2024-11-29 05:08:15
オリジナル
305 人が閲覧しました

How to Create and Send Custom TCP Packets using Raw Sockets in Go?

Go を使用したカスタム TCP パケットの作成と Raw ソケット送信

このガイドでは、gopacket を使用してカスタム TCP パケットを作成し、それを経由して送信する方法を説明します。 Go の生のソケット。元のクエリは TCP パケットの作成に焦点を当てていましたが、このアプローチでは IPv4 ヘッダーのカスタマイズも必要であることに注意することが重要です。

Go での Raw ソケットの作成

逆誤解があるかもしれませんが、Go は net.ListenPacket、net.DialIP、または net.ListenIP を通じて生のソケットを作成する手段を提供します。次の例は、net.ListenIP を使用した生のソケットの作成を示しています。

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

IPv4 ソケット オプションの設定

IPv4 ヘッダーをカスタマイズするには、以下を設定する必要があります。 IP_HDRINCL ソケット オプション。残念ながら、Core Go にはこの機能がありません。ただし、ipv4 などの外部パッケージはこの機能を提供します。 NewRawConn 関数は、IP_HDRINCL セットを使用して raw 接続を作成します。

サンプル コード

次のコード スニペットは完全な例を示しています。

package main

import (
    "code.google.com/p/gopacket"
    "code.google.com/p/gopacket/examples/util"
    "code.google.com/p/gopacket/layers"
    "github.com/dustin/go-ipv4"
    "log"
    "net"
)

const netaddr = "127.0.0.1:666"

func main() {
    defer util.Run()()

    // IPv4-specific operations
    srcIP := net.ParseIP("127.0.0.1")
    dstIP := net.ParseIP("192.168.0.1")

    // Raw socket creation using ipv4 package
    conn, err := ipv4.NewRawConn("ip4:tcp", netaddr, 0)
    if err != nil {
        log.Fatalf("NewRawConn: %s\n", err)
    }

    // TCP/IP packet creation
    tcpLayer := layers.TCP{
        SrcPort: layers.TCPPort(666),
        DstPort: layers.TCPPort(22),
        SYN:     true,
    }
    ipLayer := layers.IPv4{
        SrcIP:    srcIP,
        DstIP:    dstIP,
        Protocol: layers.IPProtocolTCP,
    }
    tcpLayer.SetNetworkLayerForChecksum(&ipLayer)

    // Serialize and transmit the packet
    buf := gopacket.NewSerializeBuffer()
    serializeOpts := gopacket.SerializeOptions{
        FixLengths:       true,
        ComputeChecksums: true,
    }
    err = gopacket.SerializeLayers(buf, serializeOpts, &ipLayer, &tcpLayer)
    if err != nil {
        log.Fatalf("SerializeLayers: %s\n", err)
    }

    _, err = conn.Write(buf.Bytes())
    if err != nil {
        log.Fatalf("Write: %s\n", err)
    }

    log.Print("Custom TCP packet sent!")
}
ログイン後にコピー

以上がGo で Raw ソケットを使用してカスタム TCP パケットを作成して送信する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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