2016-10-27 10 views
3

gopacketを使用して、イーサネットパケット(ARP、BGP、UDP、TCP)を作成し、ヘッダーバイトと長さを取得してみます。すべてのレイヤーをリストアップし、ワークアウトに続い総ヘッダ長やバイトをペイロードの場所を見つけようと、以下のような例を用いて再生するgopacketでヘッダーバイト/長さを取得する方法

試してみてください。

Packet layer: Ethernet 
Packet layer: IPv4 
Packet layer: DecodeFailure 

package main 

import (
    "fmt" 
    "net" 

    "github.com/google/gopacket" 
    "github.com/google/gopacket/layers" 
) 

func main() { 
    var (
     buffer gopacket.SerializeBuffer 
     options gopacket.SerializeOptions 
    ) 

    // Create the layers 
    ethernetLayer := &layers.Ethernet{ 
     SrcMAC:  net.HardwareAddr{0xff, 0xaa, 0xfa, 0xaa, 0xff, 0xaa}, 
     DstMAC:  net.HardwareAddr{0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd}, 
     EthernetType: layers.EthernetTypeIPv4, 
    } 
    ipLayer := &layers.IPv4{ 
     SrcIP: net.IP{192, 168, 1, 3}, 
     DstIP: net.IP{8, 8, 8, 8}, 
     // Version: 4, 
     // IHL:  5, 
     Length: 24, 
    } 
    tcpLayer := &layers.TCP{ 
     SrcPort: layers.TCPPort(4321), 
     DstPort: layers.TCPPort(80), 
    } 
    fmt.Println(tcpLayer) 
    payload := []byte{10, 20, 30, 40, 50, 60} 
    buffer = gopacket.NewSerializeBuffer() 
    gopacket.SerializeLayers(buffer, options, ethernetLayer, ipLayer, tcpLayer, gopacket.Payload(payload)) 
    outgoingPacket := buffer.Bytes() 

    packet := gopacket.NewPacket(outgoingPacket, layers.LayerTypeEthernet, gopacket.Default) 

    for _, layer := range packet.Layers() { 
     fmt.Println("Packet layer:", layer.LayerType()) 
    } 
} 

私は以下のようにエラーが発生しました

私は何か間違っていましたか?

誰でも私にどのようにヘッダバイトを得ることができますか考えてもらえますか?この場合

if withErr, ok := layer.(interface{ Error() error }); ok { 
    fmt.Pritnln(withError.Error()) 
} 

、IHLフィールドは5に設定され、4バイトワードのヘッダの長さを示す:

答えて

1

まず、あなたのコメントアウトのIPv4フィールドによって暗示されるように、layer.Error()は、より多くの情報を含んでいます。長さを24に指定したため、計算されたIHLの長さと指定された長さの間に不一致があり、gopacketがIPv6パケットとして解析しようとするとクラッシュします。長さを20に、ヘッダーの長さを5に調整することができます。この場合、エラーはなくパーズされますが、tcpフィールドは含まれません。

gopacketは実際にはパケットの生成ではなく、キャプチャされたパケットの解析用です。

実際に手動で行う場合は、関連するRFCを読んで、さまざまなオプションをカバーし、チェックサムを計算し、プロトコル(TCPの場合は6)、正しい長さ(TCPパケットの実際のサイズは32バイト私が間違っていないならばヘッダーなど)、それはかなり関わっている。

これは通常、オペレーティングシステムのソケットによって処理されるべきです。なぜこれを手動で生成しようとしていますか?

関連する問題