Модификация UDP пакета через NFQueue
Я пытаюсь модифицировать исходящий пинг пакет от сервера Minecraft PE через NFQueue и gopacket (golang)
configOutcoming := nfqueue.Config{
NfQueue: 1001,
MaxPacketLen: 0xFFFF,
MaxQueueLen: 0xFF,
Copymode: nfqueue.NfQnlCopyPacket,
ReadTimeout: 100 * time.Millisecond,
WriteTimeout: 150 * time.Millisecond,
}
nfOut, errOut := nfqueue.Open(&configOutcoming)
if errOut != nil {
fmt.Println("could not open outcoming socket:", errOut)
return
}
defer nfOut.Close()
ctxOut := context.Background()
outReceiver := func(a nfqueue.Attribute) int {
id := *a.PacketID
packet := gopacket.NewPacket(*a.Payload, layers.LayerTypeIPv4, gopacket.Default)
if udpLayer := packet.Layer(layers.LayerTypeUDP); udpLayer != nil {
ipLayer := packet.Layer(layers.LayerTypeIPv4);
ip, _ := ipLayer.(*layers.IPv4)
udp, _ := udpLayer.(*layers.UDP)
//получен исходящий пакет от сервера
if GetRakLibPacket(udp.Payload, ip.SrcIP.String(), udp.SrcPort.String()).Header == UnconnectedPong { //проверка на то что пакет именно пинг от сервера
splittedPing := strings.Split(string(GetRakLibPacket([]byte(udp.Payload), ip.SrcIP.String(), udp.SrcPort.String()).Buffer), ";") //разделение пакета по ; чтобы достать MOTD строку из пинга
hijackedPing := "124" + splittedPing[1] //добавляю 124 к MOTD строке
splittedPing[1] = hijackedPing //заменяем старую строку на новую
hijackedBuffer := strings.Join(splittedPing, ";") //возращаем все обратно в пакет пинга
*packet.ApplicationLayer().(*gopacket.Payload) = []byte(hijackedBuffer)
ip.Length = uint16(ip.Length + 4)
err := udp.SetNetworkLayerForChecksum(packet.NetworkLayer())
if err != nil {
panic(err)
}
buffer := gopacket.NewSerializeBuffer()
options := gopacket.SerializeOptions{
ComputeChecksums: true,
FixLengths: true,
}
if err := gopacket.SerializePacket(buffer, options, packet); err != nil {
log.Fatalln(err)
}
packetBytes := buffer.Bytes() //результат
nfOut.SetVerdictModPacket(id, nfqueue.NfAccept, packetBytes) //изменяем исходящий пакет
return 0
}
nfOut.SetVerdict(id, nfqueue.NfAccept)
}
return 0
}
// Запуск прослушивания
errOut = nfOut.Register(ctxOut, outReceiver)
if errOut != nil {
fmt.Println(errOut)
return
}
После модификации игра показывает модифицированный пакет, но последние цифры теряются (я так думаю что размер пакета не изменился и игра обрезает пакет пинга до полученного размера)

Если проверять пинг через сторонних ботов, то пакет не обрезается и показывает измененную информацию

Команда iptables:
iptables -I OUTPUT -p udp --sport 19132 -j NFQUEUE --queue-num 1001
Что я делаю не так?