1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| package main
import ( "flag" "log" "net"
"github.com/mdlayher/arp" )
type cliFlag struct { Ifname string Debug bool }
func main() {
var cli cliFlag flag.StringVar(&cli.Ifname, "i", "vlan1000", "Proxy Arp interface name") flag.BoolVar(&cli.Debug, "v", false, "show verbose informations") flag.Parse()
ifname, err := net.InterfaceByName(cli.Ifname)
if err != nil { log.Fatalln("get interface by name: ", err) } client, _ := arp.Dial(ifname) for { arp_recv, _, err := client.Read()
if err != nil { log.Fatalln("read packets error: ", err)
} if cli.Debug { log.Println("recv arp: ", arp_recv) } arp_replay, err := arp.NewPacket(arp.OperationReply, ifname.HardwareAddr, arp_recv.TargetIP, arp_recv.SenderHardwareAddr, arp_recv.SenderIP) if err != nil { log.Fatalln("create packets error: ", err) } destinationMAC := arp_recv.SenderHardwareAddr err = client.WriteTo(arp_replay, destinationMAC) if err != nil {
log.Fatalln("sent packet error: ", err) } if cli.Debug { log.Println("sent arp: ", arp_replay) }
}
}
|