Files
gluetun/internal/routing/enable.go
Quentin McGaw ed4fcc17b3 Routing improvements (#268)
- Fixes #82 
- Remove `EXTRA_SUBNETS`
- Remove no longer needed iptables rules
- Reduce routing interface arity
- Routing setup is done in main.go instead of in the firewall
- Routing setup gets reverted at shutdown
2020-10-24 18:05:11 -04:00

63 lines
1.4 KiB
Go

package routing
import (
"fmt"
"net"
)
var (
ErrSetup = fmt.Errorf("cannot setup routing")
ErrTeardown = fmt.Errorf("cannot teardown routing")
)
const (
table = 200
priority = 100
)
func (r *routing) Setup() (err error) {
defaultIP, err := r.defaultIP()
if err != nil {
return fmt.Errorf("%s: %w", ErrSetup, err)
}
defaultInterfaceName, defaultGateway, err := r.DefaultRoute()
if err != nil {
return fmt.Errorf("%s: %w", ErrSetup, err)
}
defer func() {
if err == nil {
return
}
if err := r.TearDown(); err != nil {
r.logger.Error(err)
}
}()
if err := r.addIPRule(defaultIP, table, priority); err != nil {
return fmt.Errorf("%s: %w", ErrSetup, err)
}
if err := r.addRouteVia(net.IPNet{}, defaultGateway, defaultInterfaceName, table); err != nil {
return fmt.Errorf("%s: %w", ErrSetup, err)
}
return nil
}
func (r *routing) TearDown() error {
defaultIP, err := r.defaultIP()
if err != nil {
return fmt.Errorf("%s: %w", ErrTeardown, err)
}
defaultInterfaceName, defaultGateway, err := r.DefaultRoute()
if err != nil {
return fmt.Errorf("%s: %w", ErrTeardown, err)
}
if err := r.deleteRouteVia(net.IPNet{}, defaultGateway, defaultInterfaceName, table); err != nil {
return fmt.Errorf("%s: %w", ErrTeardown, err)
}
if err := r.deleteIPRule(defaultIP, table, priority); err != nil {
return fmt.Errorf("%s: %w", ErrTeardown, err)
}
return nil
}