Я хочу провести несколько экспериментов с TCP-пакетами. Поэтому я использую gopacket (v1.1.19) для создания пакетов и отправки их на интерфейс.
У меня есть этот код для создания пакета SYN, помещения его в петлю и отправки на 127.0.0.1:8888, где у меня прослушивается сервер ncat (ncat -v -l 127.0.0.1 8888
).
Я вижу свой пакет на wirehark, как и ожидалось, но сервер не отправляет пакет SYN/ACK. Вызов localhost:8888 из браузера работает отлично. И я построил свой пакет так, чтобы он напоминал тот, который отправляет браузер (контрольная сумма, временная метка и порт, по сути, разные).
У кого-нибудь есть идея, в чем моя проблема или что я мог бы изучить?
основной пакет
импорт (
"кодирование/двоичный"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
"журнал"
"математика / ранд"
"сеть"
"время"
)
вар (
строка устройства = "lo"
snapshotLen int32 = 1024
неразборчивое логическое значение = ложь
ошибка ошибка
тайм-аут time.Duration = 30 * time.Second
ручка *pcap.Handle
буфер gopacket.SerializeBuffer
опции gopacket.SerializeOptions= gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true}
слои ethernetLayer.Ethernet = слои.Ethernet{
SrcMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
DstMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
EthernetType: слои.EthernetTypeIPv4,
}
ipLayer слои.IPv4 = слои.IPv4{
Версия: 4,
SrcIP: net.IP{127, 0, 0, 1},
DstIP: сетевой.IP{127,0,0,1},
Протокол: слои.IPProtocolTCP,
ТТЛ: 64,
Смещение фрагмента: 0,
Флаги: слои.IPv4DontFragment,
}
)
функция синхр() [] байт {
rand.Seed(time.Now().UnixMilli())
буфер = gopacket.NewSerializeBuffer()
вариант1 := слои.TCPOption{слои.TCPOptionKindWindowScale, 3,[]byte{7} }
бс := сделать([]байт, 2)
двоичный.BigEndian.PutUint16(bs,56495)
вариант2: = слои.TCPOption{слои.TCPOptionKindMSS, 0, bs}
bsTsval := сделать ([] байт, 4)
bsTsecr := сделать ([] байт, 4)
двоичный.BigEndian.PutUint32(bsTsval,uint32(time.Now().UnixMilli()))
bsTime := добавить(bsTsval, bsTsecr...)
вариант3: = слои.TCPOption{слои.TCPOptionKindTimestamps,0, bsTime}
tcpLayerSYN := &layers.TCP{
SrcPort: слои.TCPPort(rand.Intn(0xffff-1)+1),
DstPort: слои.TCPPort(8888),
СИН: правда,
Последовательность: rand.Uint32(),
Окно: 65495,
Опции: []layers.TCPOption{option1, option2, option3},
}
tcpLayerSYN.SetNetworkLayerForChecksum(&ipLayer)
// И создаем пакет со слоями
буфер = gopacket.NewSerializeBuffer()
gopacket.SerializeLayers(буфер, параметры,
ðernetLayer,
&ip-слой,
TCPLayerSYN,
)
исходящий пакет: = буфер. Байты ()
возврат исходящего пакета
}
основная функция () {
// Открыть устройство
дескриптор, ошибка = pcap.OpenLive (устройство, snapshotLen, беспорядочные связи, тайм-аут)
если ошибка != ноль {log.Fatal(ошибка) }
отложить дескриптор.Закрыть()
ошибка = дескриптор.WritePacketData(syn())
}