Рейтинг:0

netcat не реагирует на пакет синхронизации, созданный с помощью gopacket

флаг cn

Я хочу провести несколько экспериментов с 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(буфер, параметры,
        &ethernetLayer,
        &ip-слой,
        TCPLayerSYN,
    )
    исходящий пакет: = буфер. Байты ()
    возврат исходящего пакета
}


основная функция () {

    // Открыть устройство
    дескриптор, ошибка = pcap.OpenLive (устройство, snapshotLen, беспорядочные связи, тайм-аут)
    если ошибка != ноль {log.Fatal(ошибка) }
    отложить дескриптор.Закрыть()

    ошибка = дескриптор.WritePacketData(syn())


}
A.B avatar
флаг cl
A.B
Непосредственная проблема, которую я мог видеть, заключается в том, что петлевое устройство не является устройством Ethernet. В любом случае, я не уверен, что этот вопрос действительно актуален на этом сайте [об управлении системами информационных технологий в бизнес-среде] (https://serverfault.com/help/on-topic). Также не нужно привлекать netcat в названии проблемы. Это проблема неправильного пакета, а не проблема netcat.
jonathan-dev avatar
флаг cn
Если я делаю запрос браузера, пакет также виден на петле в wirehark. Почему должно быть проблемой, что петля не является устройством Ethernet? Как вы думаете, какая платформа лучше подходит для моего вопроса?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.