Netcat не реагирует на син-пакет, созданный с помощью gopacket
Я хочу провести несколько экспериментов с TCP-пакетами. Поэтому я использую gopacket (v1.1.19) для создания пакетов и отправки их на интерфейс. У меня есть этот код для создания пакета SYN, помещения его в петлю и отправки на адрес 127.0.0.1:8888, где меня прослушивает сервер ncat (
Я вижу свой пакет на Wireshark, как и ожидалось, но сервер не отправляет пакет SYN/ACK. Вызов localhost:8888 из браузера работает отлично. И я собрал свой пакет так, чтобы он напоминал пакет, отправленный браузером (контрольная сумма, временная метка и порт могут отличаться).
Есть ли у кого-нибудь идея, в чем моя проблема или на что я мог бы обратить внимание?
package main
import (
"encoding/binary"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
"log"
"math/rand"
"net"
"time"
)
var (
device string = "lo"
snapshotLen int32 = 1024
promiscuous bool = false
err error
timeout time.Duration = 30 * time.Second
handle *pcap.Handle
buffer gopacket.SerializeBuffer
options gopacket.SerializeOptions= gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true}
ethernetLayer layers.Ethernet = layers.Ethernet{
SrcMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
DstMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
EthernetType: layers.EthernetTypeIPv4,
}
ipLayer layers.IPv4 = layers.IPv4{
Version: 4,
SrcIP: net.IP{127, 0, 0, 1},
DstIP: net.IP{127,0,0,1},
Protocol: layers.IPProtocolTCP,
TTL: 64,
FragOffset: 0,
Flags: layers.IPv4DontFragment,
}
)
func syn() []byte {
rand.Seed(time.Now().UnixMilli())
buffer = gopacket.NewSerializeBuffer()
option1 := layers.TCPOption{layers.TCPOptionKindWindowScale, 3,[]byte{7} }
bs := make([]byte, 2)
binary.BigEndian.PutUint16(bs,56495)
option2 := layers.TCPOption{layers.TCPOptionKindMSS, 0, bs }
bsTsval := make([]byte,4)
bsTsecr := make([]byte,4)
binary.BigEndian.PutUint32(bsTsval,uint32(time.Now().UnixMilli()))
bsTime := append(bsTsval, bsTsecr...)
option3 := layers.TCPOption{layers.TCPOptionKindTimestamps,0, bsTime}
tcpLayerSYN := &layers.TCP{
SrcPort: layers.TCPPort(rand.Intn(0xffff-1)+1 ),
DstPort: layers.TCPPort(8888),
SYN: true,
Seq: rand.Uint32(),
Window: 65495,
Options: []layers.TCPOption{option1, option2, option3},
}
tcpLayerSYN.SetNetworkLayerForChecksum(&ipLayer)
// And create the packet with the layers
buffer = gopacket.NewSerializeBuffer()
gopacket.SerializeLayers(buffer, options,
ðernetLayer,
&ipLayer,
tcpLayerSYN,
)
outgoingPacket := buffer.Bytes()
return outgoingPacket
}
func main() {
// Open device
handle, err = pcap.OpenLive(device, snapshotLen, promiscuous, timeout)
if err != nil {log.Fatal(err) }
defer handle.Close()
err = handle.WritePacketData(syn())
}