package main import ( "encoding/binary" "log" "net" "os" "baalvpn/shared" ) const SERVER_IP = "172.20.12.47" var ( internalIP net.IP = nil ) func main() { if os.Geteuid() != 0 { panic("root permissions needed") } listenAddr, err := net.ResolveUDPAddr("udp", ":38001") if err != nil { panic(err) } listener, err := net.ListenUDP("udp", listenAddr) if err != nil { panic(err) } defer listener.Close() go receivePackets(listener) register(listener) <-make(chan int) // block forever } func register(c *net.UDPConn) { serverAddr, err := net.ResolveUDPAddr("udp", SERVER_IP+":38000") if err != nil { panic(err) } req := shared.BuildPkt(shared.REQ_REGISTER, []byte{}) if _, err := c.WriteToUDP(req, serverAddr); err != nil { panic(err) } } func receivePackets(listener *net.UDPConn) { for { buffer := make([]byte, 50000) n, addr, err := listener.ReadFromUDP(buffer) if err != nil { log.Println(err) continue } if n == 0 { continue } go receivePacket(listener, buffer[:n], addr) } } func receivePacket(c *net.UDPConn, pkt []byte, addr *net.UDPAddr) { if len(pkt) < 4 { log.Println("packet too short") return } version := binary.LittleEndian.Uint16(pkt[0:]) if version != shared.PROTO_VERSION { log.Println("mismatched packet version") return } pktType := binary.LittleEndian.Uint16(pkt[2:]) switch pktType { case shared.RESP_REGISTER: internalIP = net.IP(pkt[4:]) log.Println("Received IP from the server:", internalIP.String()) default: log.Println("unknown packet type") } }