In diesem Artikel erfahren Sie, wie Sie mit Golang eine ARP-Anfrage senden, um die MAC-Adresse des Zielgeräts zu erhalten.
ARP (Address Resolution Protocol) ist ein Protokoll, das Netzwerkschichtadressen (IP-Adressen) und Datenverbindungsschichtadressen (MAC-Adressen) auflöst. In einem LAN verfügt jedes Gerät über eine eindeutige MAC-Adresse, die das Gerät identifiziert. Wenn wir die IP-Adresse des Zielgeräts kennen, aber nicht seine MAC-Adresse, können wir eine ARP-Anfrage senden, um die MAC-Adresse des Geräts zu erhalten.
In Golang können wir die Funktion net.InterfaceAddrs() im Net-Paket verwenden, um die IP- und MAC-Adresse des aktuellen Geräts abzurufen. Verwenden Sie dann die Funktion net.ParseIP() im Net-Paket, um die Ziel-IP-Adresse in eine Variable vom Typ IP zu analysieren. Als nächstes verwenden Sie die Gopacket-Bibliothek, um ein ARP-Anforderungspaket zu erstellen und es an das Netzwerk zu senden.
Schauen wir uns den Beispielcode an:
package main import ( "fmt" "net" "time" "github.com/google/gopacket" "github.com/google/gopacket/layers" "github.com/google/gopacket/packetio" "github.com/google/gopacket/pcap" ) func main() { // 获取当前设备的IP和MAC地址 interfaces, err := net.Interfaces() if err != nil { panic(err) } var localIP net.IP var localMAC net.HardwareAddr for _, iface := range interfaces { if iface.Flags&net.FlagUp != 0 && iface.Flags&net.FlagLoopback == 0 { addrs, err := iface.Addrs() if err != nil { panic(err) } for _, addr := range addrs { switch addr := addr.(type) { case *net.IPNet: if addr.IP.To4() != nil { localIP = addr.IP } case *net.IPAddr: if addr.IP.To4() != nil { localIP = addr.IP } } } localMAC = iface.HardwareAddr break } } if localIP == nil || localMAC == nil { panic("Could not find local IP and MAC addresses") } fmt.Println("Local IP:", localIP) fmt.Println("Local MAC:", localMAC) // 目标IP地址 targetIP := net.ParseIP("192.168.1.1") if targetIP == nil { panic("Invalid target IP address") } fmt.Println("Target IP:", targetIP) // 使用gopacket构建ARP请求包 var buf gopacket.SerializeBuffer opts := gopacket.SerializeOptions{} eth := layers.Ethernet{ SrcMAC: localMAC, DstMAC: net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, EthernetType: layers.EthernetTypeARP, } arp := layers.ARP{ AddrType: layers.LinkTypeEthernet, Protocol: layers.EthernetTypeIPv4, HwAddressSize: 6, ProtAddressSize: 4, Operation: layers.ARPRequest, SourceHwAddress: []byte(localMAC), SourceProtAddress: []byte(localIP.To4()), DstHwAddress: []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, DstProtAddress: []byte(targetIP.To4()), } if err := gopacket.SerializeLayers(&buf, opts, ð, &arp); err != nil { panic(err) } // 打开网络接口并发送ARP请求包 handle, err := pcap.OpenLive("eth0", 65535, true, pcap.BlockForever) if err != nil { panic(err) } defer handle.Close() if err := handle.WritePacketData(buf.Bytes()); err != nil { panic(err) } // 等待一段时间以获得目标设备的MAC地址 time.Sleep(time.Second) packetSource := packetio.NewPacketSource(handle, handle.LinkType()) for packet := range packetSource.Packets() { arpLayer := packet.Layer(layers.LayerTypeARP) if arpLayer != nil { arpPacket, _ := arpLayer.(*layers.ARP) if arpPacket.Operation == layers.ARPReply && bytes.Equal(arpPacket.SourceProtAddress, targetIP.To4()) { fmt.Println("Target MAC:", net.HardwareAddr(arpPacket.SourceHwAddress)) return } } } panic("Could not resolve target MAC address") }
Im Beispielcode verwenden wir zunächst das Net-Paket, um die IP- und MAC-Adresse des aktuellen Geräts abzurufen. Verwenden Sie dann die Funktion net.ParseIP(), um die Ziel-IP-Adresse in eine Variable vom Typ IP zu analysieren. Als nächstes verwenden wir die Funktion gopacket.SerializeLayers(), um das ARP-Anforderungspaket zu erstellen. Wir definieren zunächst die Ethernet-Schicht, legen die Quell-MAC-Adresse auf die lokale MAC-Adresse und die Ziel-MAC-Adresse auf die Broadcast-Adresse fest. Definieren Sie dann die ARP-Schicht, setzen Sie den Anforderungstyp auf ARP-Anfrage, die Quell-MAC-Adresse und die Quell-IP-Adresse auf die lokale MAC-Adresse und die lokale IP-Adresse, die Ziel-MAC-Adresse auf 0 und die Ziel-IP-Adresse auf die Ziel-IP-Adresse. Schließlich öffnen wir die Netzwerkschnittstelle über die Funktion pcap.OpenLive() und schreiben das ARP-Anforderungspaket.
Wir warten einige Zeit, bis wir die Antwort vom Zielgerät erhalten. Verwenden Sie die Funktion packetio.NewPacketSource(), um die Quelle der empfangenen Daten abzurufen, und verwenden Sie dann eine for-Schleife, um die empfangenen Pakete zu durchlaufen. Wenn eine ARP-Antwort empfangen wird und die Quell-IP-Adresse die Ziel-IP-Adresse ist, bedeutet dies, dass wir die MAC-Adresse des Zielgeräts erhalten haben. Das Programm gibt die MAC-Adresse des Zielgeräts aus und beendet den Lauf.
Verwenden Sie den obigen Code, um ganz einfach eine ARP-Anfrage zu senden und die MAC-Adresse des Zielgeräts abzurufen.
Das obige ist der detaillierte Inhalt vonGolang Arp-Anfrage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!