diff --git a/nat/pmp.go b/nat/pmp.go index f35ce5c0..f3c726f5 100644 --- a/nat/pmp.go +++ b/nat/pmp.go @@ -65,10 +65,6 @@ func (p *PMP) AddPortMapping(port uint16) error { p.forwardedPortsMtx.Lock() defer p.forwardedPortsMtx.Unlock() - if _, exists := p.forwardedPorts[port]; exists { - return nil - } - _, err := p.client.AddPortMapping("tcp", int(port), int(port), 0) if err != nil { return err diff --git a/nat/upnp.go b/nat/upnp.go index 4022456a..c533640b 100644 --- a/nat/upnp.go +++ b/nat/upnp.go @@ -62,10 +62,6 @@ func (u *UPnP) AddPortMapping(port uint16) error { u.forwardedPortsMtx.Lock() defer u.forwardedPortsMtx.Unlock() - if _, exists := u.forwardedPorts[port]; exists { - return nil - } - if err := u.device.Forward(port, ""); err != nil { return err } diff --git a/server.go b/server.go index 2539745c..8a0275ba 100644 --- a/server.go +++ b/server.go @@ -1145,6 +1145,21 @@ out: continue } + // Periodically renew the NAT port forwarding. + for _, port := range forwardedPorts { + err := s.natTraversal.AddPortMapping(port) + if err != nil { + srvrLog.Warnf("Unable to automatically "+ + "re-create port forwarding using %s: %v", + s.natTraversal.Name(), err) + } else { + srvrLog.Debugf("Automatically re-created "+ + "forwarding for port %d using %s to "+ + "advertise external IP", + port, s.natTraversal.Name()) + } + } + if ip.Equal(s.lastDetectedIP) { continue }