mirror of
https://github.com/tailscale/tailscale.git
synced 2025-12-01 09:32:08 +00:00
linuxfw,wgengine/route,ipn: add c2n and nodeattrs to control linux netfilter
Updates tailscale/corp#14029. Signed-off-by: Naman Sood <mail@nsood.in>
This commit is contained in:
@@ -76,6 +76,7 @@ type Config struct {
|
||||
SubnetRoutes []netip.Prefix // subnets being advertised to other Tailscale nodes
|
||||
SNATSubnetRoutes bool // SNAT traffic to local subnets
|
||||
NetfilterMode preftype.NetfilterMode // how much to manage netfilter rules
|
||||
NetfilterKind string // what kind of netfilter to use (nftables, iptables)
|
||||
}
|
||||
|
||||
func (a *Config) Equal(b *Config) bool {
|
||||
|
||||
@@ -47,6 +47,7 @@ type linuxRouter struct {
|
||||
localRoutes map[netip.Prefix]bool
|
||||
snatSubnetRoutes bool
|
||||
netfilterMode preftype.NetfilterMode
|
||||
netfilterKind string
|
||||
|
||||
// ruleRestorePending is whether a timer has been started to
|
||||
// restore deleted ip rules.
|
||||
@@ -326,6 +327,21 @@ func (r *linuxRouter) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// setupNetfilter initializes the NetfilterRunner in r.nfr. It expects r.nfr
|
||||
// to be nil, or the current netfilter to be set to netfilterOff.
|
||||
// kind should be either a linuxfw.FirewallMode, or the empty string for auto.
|
||||
func (r *linuxRouter) setupNetfilter(kind string) error {
|
||||
r.netfilterKind = kind
|
||||
|
||||
var err error
|
||||
r.nfr, err = linuxfw.New(r.logf, r.netfilterKind)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not create new netfilter: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Set implements the Router interface.
|
||||
func (r *linuxRouter) Set(cfg *Config) error {
|
||||
var errs []error
|
||||
@@ -333,6 +349,18 @@ func (r *linuxRouter) Set(cfg *Config) error {
|
||||
cfg = &shutdownConfig
|
||||
}
|
||||
|
||||
if cfg.NetfilterKind != r.netfilterKind {
|
||||
if err := r.setNetfilterMode(netfilterOff); err != nil {
|
||||
err = fmt.Errorf("could not disable existing netfilter: %w", err)
|
||||
errs = append(errs, err)
|
||||
} else {
|
||||
r.nfr = nil
|
||||
if err := r.setupNetfilter(cfg.NetfilterKind); err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if err := r.setNetfilterMode(cfg.NetfilterMode); err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
@@ -383,7 +411,7 @@ func (r *linuxRouter) setNetfilterMode(mode preftype.NetfilterMode) error {
|
||||
|
||||
if r.nfr == nil {
|
||||
var err error
|
||||
r.nfr, err = linuxfw.New(r.logf)
|
||||
r.nfr, err = linuxfw.New(r.logf, r.netfilterKind)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ func TestConfigEqual(t *testing.T) {
|
||||
testedFields := []string{
|
||||
"LocalAddrs", "Routes", "LocalRoutes", "NewMTU",
|
||||
"SubnetRoutes", "SNATSubnetRoutes", "NetfilterMode",
|
||||
"NetfilterKind",
|
||||
}
|
||||
configType := reflect.TypeOf(Config{})
|
||||
configFields := []string{}
|
||||
|
||||
Reference in New Issue
Block a user