我搜索了如何使用自定义以太网类型发送原始以太网数据包,但很多人都在谈论 tcp 和 udp 协议。我需要打开一个原始套接字,获取所有具有我自定义以太网类型的数据包,读取有效负载并发送回具有不同自定义以太网类型的数据包。
func main() {
//set promiscuos mode
cmd := exec.Command("ifconfig", "eth0", "promisc")
err := cmd.Run()
if err != nil {
fmt.Println("Error: " + err.Error())
return
}
//open raw socket with custom ethertype_1 and bind to interface
fd, err := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, Htons(ETHER_TYPE_1))
if err != nil {
fmt.Println("Error: " + err.Error())
return
}
err = syscall.BindToDevice(fd, "eth0")
if err != nil {
fmt.Println("Error: " + err.Error())
return
}
f := os.NewFile(uintptr(fd), fmt.Sprintf("fd %d", fd))
for {
buf := make([]byte, 1024)
numRead, err := f.Read(buf)
if err != nil {
fmt.Println(err)
}
go ReadSocket(buf, numRead)
}
func ReadSocket(buf []byte, numRead int) {
packet := BufToEthPacket(buf, numRead)
fmt.Printf("Destination MAC: % X\n", packet.dstMac)
fmt.Printf("Source MAC: % X\n", packet.srcMac)
fmt.Printf("ether type: %X\n", packet.ethType)
fmt.Printf("Payload: % X\n", packet.payload)
var myPacket EthPacket
myPacket.srcMac = packet.dstMac
myPacket.dstMac = packet.srcMac
myPacket.ethType = ETHER_TYPE_2
myPacket.payload = packet.payload
var myBuf = EthPacketToBuf(myPacket)
//open raw socket with custom ethertype_2 and bind to interface
fd, err := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, Htons(ETHER_TYPE_2))
if err != nil {
fmt.Println("Error: " + err.Error())
return
}
err = syscall.BindToDevice(fd, "eth0")
if err != nil {
fmt.Println("Error: " + err.Error())
return
}
f := os.NewFile(uintptr(fd), fmt.Sprintf("fd %d", fd))
n, err := f.Write(myBuf)
if err != nil {
fmt.Println("Error: " + err.Error())
return
}
if n != numRead {
fmt.Println("Error: byte length not equal")
return
}
}
我收到了数据包,但f.Write(myBuf)
返回以下错误:Error: write fd 5: no such device or address
我做错了什么?