diff --git a/examples/config.yml b/examples/config.yml index 444592f..f8930af 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -107,7 +107,7 @@ lighthouse: # Port Nebula will be listening on. The default here is 4242. For a lighthouse node, the port should be defined, # however using port 0 will dynamically assign a port and is recommended for roaming nodes. listen: - # To listen on both any ipv4 and ipv6 use "[::]" + # To listen on both any ipv4 and ipv6 use "::" host: 0.0.0.0 port: 4242 # Sets the max number of packets to pull from the kernel for each syscall (under systems that support recvmmsg) diff --git a/main.go b/main.go index f9ea77c..bbf831a 100644 --- a/main.go +++ b/main.go @@ -151,8 +151,21 @@ func Main(c *config.C, configTest bool, buildVersion string, logger *logrus.Logg port := c.GetInt("listen.port", 0) if !configTest { + rawListenHost := c.GetString("listen.host", "0.0.0.0") + var listenHost *net.IPAddr + if rawListenHost == "[::]" { + // Old guidance was to provide the literal `[::]` in `listen.host` but that won't resolve. + listenHost = &net.IPAddr{IP: net.IPv6zero} + + } else { + listenHost, err = net.ResolveIPAddr("ip", rawListenHost) + if err != nil { + return nil, util.NewContextualError("Failed to resolve listen.host", nil, err) + } + } + for i := 0; i < routines; i++ { - udpServer, err := udp.NewListener(l, c.GetString("listen.host", "0.0.0.0"), port, routines > 1, c.GetInt("listen.batch", 64)) + udpServer, err := udp.NewListener(l, listenHost.IP, port, routines > 1, c.GetInt("listen.batch", 64)) if err != nil { return nil, util.NewContextualError("Failed to open udp listener", m{"queue": i}, err) } diff --git a/udp/udp_generic.go b/udp/udp_generic.go index 0a7c0d9..f03174d 100644 --- a/udp/udp_generic.go +++ b/udp/udp_generic.go @@ -23,9 +23,9 @@ type Conn struct { l *logrus.Logger } -func NewListener(l *logrus.Logger, ip string, port int, multi bool, batch int) (*Conn, error) { +func NewListener(l *logrus.Logger, ip net.IP, port int, multi bool, batch int) (*Conn, error) { lc := NewListenConfig(multi) - pc, err := lc.ListenPacket(context.TODO(), "udp", fmt.Sprintf("%s:%d", ip, port)) + pc, err := lc.ListenPacket(context.TODO(), "udp", net.JoinHostPort(ip.String(), fmt.Sprintf("%v", port))) if err != nil { return nil, err } diff --git a/udp/udp_linux.go b/udp/udp_linux.go index 5d4b16a..77102ab 100644 --- a/udp/udp_linux.go +++ b/udp/udp_linux.go @@ -45,7 +45,7 @@ const ( type _SK_MEMINFO [_SK_MEMINFO_VARS]uint32 -func NewListener(l *logrus.Logger, ip string, port int, multi bool, batch int) (*Conn, error) { +func NewListener(l *logrus.Logger, ip net.IP, port int, multi bool, batch int) (*Conn, error) { syscall.ForkLock.RLock() fd, err := unix.Socket(unix.AF_INET6, unix.SOCK_DGRAM, unix.IPPROTO_UDP) if err == nil { @@ -59,7 +59,7 @@ func NewListener(l *logrus.Logger, ip string, port int, multi bool, batch int) ( } var lip [16]byte - copy(lip[:], net.ParseIP(ip)) + copy(lip[:], ip.To16()) if multi { if err = unix.SetsockoptInt(fd, unix.SOL_SOCKET, unix.SO_REUSEPORT, 1); err != nil { diff --git a/udp/udp_tester.go b/udp/udp_tester.go index 62e4f56..3b33f0d 100644 --- a/udp/udp_tester.go +++ b/udp/udp_tester.go @@ -45,9 +45,9 @@ type Conn struct { l *logrus.Logger } -func NewListener(l *logrus.Logger, ip string, port int, _ bool, _ int) (*Conn, error) { +func NewListener(l *logrus.Logger, ip net.IP, port int, _ bool, _ int) (*Conn, error) { return &Conn{ - Addr: &Addr{net.ParseIP(ip), uint16(port)}, + Addr: &Addr{ip, uint16(port)}, RxPackets: make(chan *Packet, 10), TxPackets: make(chan *Packet, 10), l: l,