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 サイトの他の関連記事を参照してください。