Merge pull request #691 from openziti/fix-lo-addr-cleanup

Fix address remove from loopback on shutdown. Fixes GH-670
This commit is contained in:
Paul Lorenz
2021-06-16 11:33:06 -04:00
committed by GitHub
3 changed files with 27 additions and 20 deletions
+2
View File
@@ -346,11 +346,13 @@ type AddressTracker interface {
type addrTracker map[string]int
func (self addrTracker) AddAddress(addr string) {
logrus.Debugf("adding %v from address tracker: %+v", addr, self)
useCnt := self[addr]
self[addr] = useCnt + 1
}
func (self addrTracker) RemoveAddress(addr string) bool {
logrus.Debugf("trying to remove %v from address tracker: %+v", addr, self)
useCnt := self[addr]
if useCnt <= 1 {
delete(self, addr)
+22 -20
View File
@@ -30,6 +30,7 @@ import (
"github.com/openziti/foundation/util/info"
"github.com/openziti/foundation/util/mempool"
"github.com/openziti/foundation/util/stringz"
"github.com/openziti/sdk-golang/ziti/edge/impl"
cmap "github.com/orcaman/concurrent-map"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
@@ -331,20 +332,16 @@ func getOriginalDest(oob []byte) (*net.UDPAddr, error) {
}
func deleteIptablesChain(ipt *iptables.IPTables, table, srcChain, dstChain string) {
log := pfxlog.Logger()
err := ipt.Delete(table, srcChain, []string{"-j", dstChain}...)
if err != nil {
log.Errorf("failed to unlink chain %s: %v", dstChain, err)
if err := ipt.Delete(table, srcChain, []string{"-j", dstChain}...); err != nil {
logrus.Errorf("failed to unlink chain %s: %v", dstChain, err)
}
err = ipt.ClearChain(table, dstChain)
if err != nil {
log.Errorf("failed to clear chain %s, %v", dstChain, err)
if err := ipt.ClearChain(table, dstChain); err != nil {
logrus.Errorf("failed to clear chain %s, %v", dstChain, err)
}
err = ipt.DeleteChain(table, dstChain)
if err != nil {
log.Errorf("failed to delete chain %s: %v", dstChain, err)
if err := ipt.DeleteChain(table, dstChain); err != nil {
logrus.Errorf("failed to delete chain %s: %v", dstChain, err)
}
}
@@ -422,6 +419,7 @@ func (self *tProxy) addInterceptAddr(interceptAddr *intercept.InterceptAddress,
return fmt.Errorf("failed to add local route: %v", err)
}
tracker.AddAddress(ipNet.String())
self.addresses = append(self.addresses, interceptAddr)
interceptAddr.TproxySpec = []string{
"-m", "comment", "--comment", service.Name,
@@ -458,32 +456,36 @@ func (self *tProxy) addInterceptAddr(interceptAddr *intercept.InterceptAddress,
}
func (self *tProxy) StopIntercepting(tracker intercept.AddressTracker) error {
// keep track of routes used by all intercepts. use a map to avoid duplicates
routes := map[string]*net.IPNet{}
var errors []error
for _, addr := range self.addresses {
err := self.interceptor.ipt.Delete(mangleTable, dstChain, addr.TproxySpec...)
if err != nil {
return fmt.Errorf("failed to remove iptables rule for service %s: %v", self.service.Name, err)
errors = append(errors, err)
logrus.Errorf("failed to remove iptables rule for service %s: %v", self.service.Name, err)
}
if self.interceptor.lanIf != "" {
err = self.interceptor.ipt.Delete(filterTable, dstChain, addr.AcceptSpec...)
if err != nil {
return fmt.Errorf("failed to remove iptables rule for service %s: %v", self.service.Name, err)
errors = append(errors, err)
logrus.Errorf("failed to remove iptables rule for service %s: %v", self.service.Name, err)
}
}
ipn := addr.IpNet()
routes[ipn.String()] = ipn
}
for _, ipNet := range routes {
ipNet := addr.IpNet()
if tracker.RemoveAddress(ipNet.String()) {
err := router.RemoveLocalAddress(ipNet, "lo")
if err != nil {
return fmt.Errorf("failed to remove route for service %s: %v", self.service.Name, err)
errors = append(errors, err)
logrus.Errorf("failed to remove route for service %s: %v", self.service.Name, err)
}
}
}
return nil
if len(errors) == 0 {
return nil
}
return impl.MultipleErrors(errors)
}
type IPPortAddr interface {
+3
View File
@@ -22,6 +22,7 @@ import (
"github.com/mdlayher/netlink"
"github.com/mdlayher/netlink/nlenc"
"github.com/michaelquigley/pfxlog"
"github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
"net"
"os"
@@ -29,10 +30,12 @@ import (
// Add an address (or prefix) to the specified network interface.
func AddLocalAddress(prefix *net.IPNet, ifName string) error {
logrus.Debugf("adding local address '%v' to interface %v", prefix.String(), ifName)
return nlAddrReq(prefix, nil, ifName, unix.RTM_NEWADDR)
}
func RemoveLocalAddress(prefix *net.IPNet, ifName string) error {
logrus.Debugf("removing local address '%v' from interface %v", prefix.String(), ifName)
return nlAddrReq(prefix, nil, ifName, unix.RTM_DELADDR)
}