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)
}
}
}
}
}
}