title: How to use Golang to compose raw TCP packet (using gopacket) and send it via raw socket
body: <p>I would like to craft custome TCP packets using gopacket and then
  send them using raw sockets.</p>
  
  <p>Here is a short and readable example go program that
  demonstrates what I'd like to do:</p>
  
  <pre><code>package main
  
  import (
      "code.google.com/p/gopacket"
      "code.google.com/p/gopacket/examples/util"
      "code.google.com/p/gopacket/layers"
      "log"
      "net"
  )
  
  func main() {
      defer util.Run()()
  
      // XXX create tcp/ip packet
      srcIP := net.ParseIP("127.0.0.1")
      dstIP := net.ParseIP("192.168.0.1")
      //srcIPaddr := net.IPAddr{
      //  IP: srcIP,
      //}
      dstIPaddr := net.IPAddr{
          IP: dstIP,
      }
      ipLayer := layers.IPv4{
          SrcIP:    srcIP,
          DstIP:    dstIP,
          Protocol: layers.IPProtocolTCP,
      }
      tcpLayer := layers.TCP{
          SrcPort: layers.TCPPort(666),
          DstPort: layers.TCPPort(22),
          SYN:     true,
      }
      tcpLayer.SetNetworkLayerForChecksum(&amp;ipLayer)
      buf := gopacket.NewSerializeBuffer()
      opts := gopacket.SerializeOptions{
          FixLengths:       true,
          ComputeChecksums: true,
      }
      err := gopacket.SerializeLayers(buf, opts, &amp;ipLayer, &amp;tcpLayer)
      if err != nil {
          panic(err)
      }
      // XXX end of packet creation
  
      // XXX send packet
      ipConn, err := net.ListenPacket("ip4:tcp", "0.0.0.0")
      if err != nil {
          panic(err)
      }
      _, err = ipConn.WriteTo(buf.Bytes(), &amp;dstIPaddr)
      if err != nil {
          panic(err)
      }
      log.Print("packet sent!\n")
  }
  </code></pre>
  
  <p>However running this program doesn't work... the SerializeLayer fails.
  Here's the panic:</p>
  
  <blockquote>
    <p>panic: invalid src IP 127.0.0.1</p>
    
    <p>goroutine 16 [running]: runtime.panic(0x5bb020, 0xc2090723e0)
            /home/human/golang-empire/go/src/pkg/runtime/panic.c:279 +0xf5 main.main()
            /home/human/golang-empire/gopkg/src/github.com/david415/HoneyBadger/packetSendTest.go:41 +0x464</p>
    
    <p>goroutine 19 [finalizer wait]: runtime.park(0x413cc0, 0x7bc6c0,
    0x7bb189)
            /home/human/golang-empire/go/src/pkg/runtime/proc.c:1369 +0x89 runtime.parkunlock(0x7bc6c0, 0x7bb189)
            /home/human/golang-empire/go/src/pkg/runtime/proc.c:1385 +0x3b runfinq()
            /home/human/golang-empire/go/src/pkg/runtime/mgc0.c:2644 +0xcf runtime.goexit()
            /home/human/golang-empire/go/src/pkg/runtime/proc.c:1445</p>
  </blockquote>