mirror of
https://github.com/netbirdio/netbird.git
synced 2026-05-20 23:59:55 +00:00
Move v6 forwarding helpers to dedicated file
This commit is contained in:
@@ -55,11 +55,6 @@ const (
|
|||||||
ipv4ForwardingPath = "net.ipv4.ip_forward"
|
ipv4ForwardingPath = "net.ipv4.ip_forward"
|
||||||
// ipv6ForwardingPath is the path to the file containing the IPv6 forwarding setting.
|
// ipv6ForwardingPath is the path to the file containing the IPv6 forwarding setting.
|
||||||
ipv6ForwardingPath = "net.ipv6.conf.all.forwarding"
|
ipv6ForwardingPath = "net.ipv6.conf.all.forwarding"
|
||||||
// 1 (default) accepts RAs only while forwarding is off; 2 keeps RA
|
|
||||||
// acceptance on regardless, so RA-installed host defaults survive our
|
|
||||||
// v6 forwarding flip.
|
|
||||||
acceptRAInterfacePath = "net.ipv6.conf.%s.accept_ra"
|
|
||||||
acceptRAProcPathFormat = "/proc/sys/net/ipv6/conf/%s/accept_ra"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var ErrTableIDExists = errors.New("ID exists with different name")
|
var ErrTableIDExists = errors.New("ID exists with different name")
|
||||||
@@ -775,65 +770,6 @@ func EnableV4IPForwarding() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// EnableV6IPForwarding bumps accept_ra=2 on host v6 interfaces before flipping
|
|
||||||
// forwarding=1, so RA-installed host defaults survive. Returns the prior values
|
|
||||||
// of sysctls we actually changed; entries already at the target are omitted.
|
|
||||||
func EnableV6IPForwarding(wgIfaceName string) (map[string]int, error) {
|
|
||||||
saved := map[string]int{}
|
|
||||||
bumpAcceptRA(saved, wgIfaceName)
|
|
||||||
|
|
||||||
oldVal, err := sysctl.Set(ipv6ForwardingPath, 1, false)
|
|
||||||
if err != nil {
|
|
||||||
return saved, err
|
|
||||||
}
|
|
||||||
if oldVal != 1 {
|
|
||||||
saved[ipv6ForwardingPath] = oldVal
|
|
||||||
}
|
|
||||||
return saved, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DisableV6IPForwarding restores what EnableV6IPForwarding captured.
|
|
||||||
func DisableV6IPForwarding(saved map[string]int) error {
|
|
||||||
var result *multierror.Error
|
|
||||||
for key, value := range saved {
|
|
||||||
if _, err := sysctl.Set(key, value, false); err != nil {
|
|
||||||
result = multierror.Append(result, fmt.Errorf("restore %s: %w", key, err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nberrors.FormatErrorOrNil(result)
|
|
||||||
}
|
|
||||||
|
|
||||||
func bumpAcceptRA(saved map[string]int, wgIfaceName string) {
|
|
||||||
interfaces, err := net.Interfaces()
|
|
||||||
if err != nil {
|
|
||||||
log.Warnf("list interfaces for accept_ra: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, intf := range interfaces {
|
|
||||||
if intf.Name == "lo" || intf.Name == wgIfaceName {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
bumpAcceptRAForInterface(saved, intf.Name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func bumpAcceptRAForInterface(saved map[string]int, name string) {
|
|
||||||
key := fmt.Sprintf(acceptRAInterfacePath, name)
|
|
||||||
// Build procfs path from name, not the dotted key: VLAN names like eth0.100.
|
|
||||||
if _, err := os.Stat(fmt.Sprintf(acceptRAProcPathFormat, name)); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// onlyIfOne=true: leave admin overrides (0, 2) alone.
|
|
||||||
oldVal, err := sysctl.Set(key, 2, true)
|
|
||||||
if err != nil {
|
|
||||||
log.Warnf("bump %s: %v", key, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if oldVal != 2 {
|
|
||||||
saved[key] = oldVal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// entryExists checks if the specified ID or name already exists in the rt_tables file
|
// entryExists checks if the specified ID or name already exists in the rt_tables file
|
||||||
// and verifies if existing names start with "netbird_".
|
// and verifies if existing names start with "netbird_".
|
||||||
func entryExists(file *os.File, id int) (bool, error) {
|
func entryExists(file *os.File, id int) (bool, error) {
|
||||||
|
|||||||
82
client/internal/routemanager/systemops/v6forwarding_linux.go
Normal file
82
client/internal/routemanager/systemops/v6forwarding_linux.go
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
//go:build !android
|
||||||
|
|
||||||
|
package systemops
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/hashicorp/go-multierror"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
nberrors "github.com/netbirdio/netbird/client/errors"
|
||||||
|
"github.com/netbirdio/netbird/client/internal/routemanager/sysctl"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// 1 (default) accepts RAs only while forwarding is off; 2 keeps RA
|
||||||
|
// acceptance on regardless, so RA-installed host defaults survive our
|
||||||
|
// v6 forwarding flip.
|
||||||
|
acceptRAInterfacePath = "net.ipv6.conf.%s.accept_ra"
|
||||||
|
acceptRAProcPathFormat = "/proc/sys/net/ipv6/conf/%s/accept_ra"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EnableV6IPForwarding bumps accept_ra=2 on host v6 interfaces before flipping
|
||||||
|
// forwarding=1, so RA-installed host defaults survive. Returns the prior values
|
||||||
|
// of sysctls we actually changed; entries already at the target are omitted.
|
||||||
|
func EnableV6IPForwarding(wgIfaceName string) (map[string]int, error) {
|
||||||
|
saved := map[string]int{}
|
||||||
|
bumpAcceptRA(saved, wgIfaceName)
|
||||||
|
|
||||||
|
oldVal, err := sysctl.Set(ipv6ForwardingPath, 1, false)
|
||||||
|
if err != nil {
|
||||||
|
return saved, err
|
||||||
|
}
|
||||||
|
if oldVal != 1 {
|
||||||
|
saved[ipv6ForwardingPath] = oldVal
|
||||||
|
}
|
||||||
|
return saved, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DisableV6IPForwarding restores what EnableV6IPForwarding captured.
|
||||||
|
func DisableV6IPForwarding(saved map[string]int) error {
|
||||||
|
var result *multierror.Error
|
||||||
|
for key, value := range saved {
|
||||||
|
if _, err := sysctl.Set(key, value, false); err != nil {
|
||||||
|
result = multierror.Append(result, fmt.Errorf("restore %s: %w", key, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nberrors.FormatErrorOrNil(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
func bumpAcceptRA(saved map[string]int, wgIfaceName string) {
|
||||||
|
interfaces, err := net.Interfaces()
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("list interfaces for accept_ra: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, intf := range interfaces {
|
||||||
|
if intf.Name == "lo" || intf.Name == wgIfaceName {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
bumpAcceptRAForInterface(saved, intf.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func bumpAcceptRAForInterface(saved map[string]int, name string) {
|
||||||
|
key := fmt.Sprintf(acceptRAInterfacePath, name)
|
||||||
|
// Build procfs path from name, not the dotted key: VLAN names like eth0.100.
|
||||||
|
if _, err := os.Stat(fmt.Sprintf(acceptRAProcPathFormat, name)); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// onlyIfOne=true: leave admin overrides (0, 2) alone.
|
||||||
|
oldVal, err := sysctl.Set(key, 2, true)
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("bump %s: %v", key, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if oldVal != 2 {
|
||||||
|
saved[key] = oldVal
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user