PCAP Go с использованием вычисления контрольной суммы Raw Sockets

Я пишу программу обработки кадров / дейтаграмм / пакетов, которая пересылает кадры из одного источника в другой. Я использую библиотеку слоев Go для управления кадрами.

Если я не установлю опцию для вычисления контрольных сумм, пакеты SYN будут доставлены на компьютер с этим кодом перехода, и он будет перенаправлен. Тем не менее, я изменил пакет dstIP, srcIP, в то время как контрольная сумма остается прежней, получатель никогда не отправляет обратно SYN ACK, я подозреваю, что это потому, что контрольная сумма теперь является ошибкой из-за изменения.

Но библиотека слоев включает в себя опцию CalculateChecksum, которая, если я включаю ее, чтобы быть верным, компьютер, на котором запущена эта программа, получает кадр, но никогда не передает его получателю.

Это мой первый раз с RAW сокетами, так что я работаю над теориями и без опыта, есть идеи?

package main

import (
    "code.google.com/p/gopacket"
    "code.google.com/p/gopacket/layers"
    "code.google.com/p/gopacket/pcap"
    "fmt"
    "net"
)

func main() {

    if handle, err := pcap.OpenLive("enp3s0", 1600, true, 100); err != nil {
        panic(err)
    } else {
        packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
        for packet := range packetSource.Packets() {

            if ethLayer := packet.Layer(layers.LayerTypeEthernet); ethLayer != nil {

                eth, _ := ethLayer.(*layers.Ethernet)
                //eth.DstMAC, _ = net.ParseMAC("14:10:9f:d1:47:e5")

                eth.SrcMAC, _ = net.ParseMAC("98:90:96:a3:93:e0")

                if ipLayer := packet.Layer(layers.LayerTypeIPv4); ipLayer != nil {

                    ip, _ := ipLayer.(*layers.IPv4)
                    if ip.SrcIP.Equal(net.ParseIP("192.168.1.72")) {
                        fmt.Println("from cal")
                        //change the dst IP to something 192.168.1.65
                        eth.DstMAC, _ = net.ParseMAC("00:90:F5:D6:02:FD")
                        ip.SrcIP = net.IP{192, 168, 1, 70}
                        ip.DstIP = net.IP{192, 168, 1, 73}

                    }
                    if ip.SrcIP.Equal(net.ParseIP("192.168.1.73")) {
                        fmt.Println("from me")
                        //change the dst IP to something 192.168.1.65
                        eth.DstMAC, _ = net.ParseMAC("AC:16:2D:49:69:4B")
                        ip.SrcIP = net.IP{192, 168, 1, 70}
                        ip.DstIP = net.IP{192, 168, 1, 72}

                    }

                    if tcpLayer := packet.Layer(layers.LayerTypeTCP); tcpLayer != nil {

                        tcp, _ := tcpLayer.(*layers.TCP)

                        buf := gopacket.NewSerializeBuffer()
                        opts := gopacket.SerializeOptions{}
                        opts.FixLengths = true
                        /* I WISH TO RE-COMPUTE CHECKSUMS HOWEVER WHEN THIS OPTION IS TRUE
                           I NEVER TRANSMIT THE FRAME*/
                        opts.ComputeChecksums = true
                        gopacket.SerializeLayers(buf, opts,
                            eth,
                            ip,
                            tcp,
                            gopacket.Payload([]byte(tcp.LayerPayload())))
                        packetData := buf.Bytes()

                        handle.WritePacketData(buf)

                    }

                }

            }

        }
    }

}

0 ответов

Другие вопросы по тегам