From a27ac66eed094d959e7051004a8702113683ccb1 Mon Sep 17 00:00:00 2001 From: Robert Habermann Date: Sat, 13 Apr 2019 13:49:31 +0000 Subject: [PATCH] server: add periodic renewal of port forwarding The check prevented the creation of port forwardings which were assumed to be present already. After this change the port forwardings which might have been removed from the NAT device can be re-created. --- nat/pmp.go | 4 ---- nat/upnp.go | 4 ---- server.go | 15 +++++++++++++++ 3 files changed, 15 insertions(+), 8 deletions(-) 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 }