diff --git a/lib/connections/kcp_listen.go b/lib/connections/kcp_listen.go index 368c4ce1..1f4cf221 100644 --- a/lib/connections/kcp_listen.go +++ b/lib/connections/kcp_listen.go @@ -200,6 +200,7 @@ func (t *kcpListener) stunRenewal(listener net.PacketConn) { var natType stun.NATType var extAddr *stun.Host + var udpAddr *net.UDPAddr var err error oldType := stun.NATUnknown @@ -218,7 +219,17 @@ func (t *kcpListener) stunRenewal(listener net.PacketConn) { } for _, addr := range t.cfg.StunServers() { - client.SetServerAddr(addr) + // Resolve the address, so that in case the server advertises two + // IPs, we always hit the same one, as otherwise, the mapping might + // expire as we hit the other address, and cause us to flip flop + // between servers/external addresses, as a result flooding discovery + // servers. + udpAddr, err = net.ResolveUDPAddr("udp", addr) + if err != nil { + l.Debugf("%s stun addr resolution on %s: %s", t.uri, addr, err) + continue + } + client.SetServerAddr(udpAddr.String()) natType, extAddr, err = client.Discover() if err != nil || extAddr == nil {