Изменение IP-адреса Gopacket и повторная передача с использованием необработанных сокетов
Я пишу программу, которая читает все пакеты, проходящие через компьютер, на котором она запущена. Я хочу захватить пакет (либо через dst ip, либо через src ip), затем изменить dstIP и TCP dstPort и вернуть его обратно в сеть.
У меня нет проблем с изменением dstIP, но как правильно его сериализовать, чтобы пакет не был искажен и попал в пункт назначения, в который я хочу его отправить?
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("wlp4s0", 1600, true, 100); err != nil {
panic(err)
} else {
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
if ipLayer := packet.Layer(layers.LayerTypeIPv4); ipLayer != nil {
fmt.Println("This is a IP packet!")
// Get actual IP data from this layer
ip, _ := ipLayer.(*layers.IPv4)
//see if the source IP is what I'm expecting
if ip.SrcIP.Equal(net.ParseIP("192.168.1.66")) {
//change the dst IP to something 192.168.1.65
ip.DstIP = net.ParseIP("192.168.1.65")
// create a buffer to serialize to
buf := gopacket.NewSerializeBuffer()
//no options
opts := gopacket.SerializeOptions{}
//serialize the packet
ip.SerializeTo(buf, opts)
packetDataToGo := buf.Bytes()
// send the packet
handle.WritePacketData(packetDataToGo)
}
}
}
}
}