mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-11 13:18:53 +00:00
util/linuxfw,wgengine/router: skip IPv6 firewall configuration in partial iptables mode (#11546)
We have hosts that support IPv6, but not IPv6 firewall configuration in iptables mode. We also have hosts that have some support for IPv6 firewall configuration in iptables mode, but do not have iptables filter table. We should: - configure ip rules for all hosts that support IPv6 - only configure firewall rules in iptables mode if the host has iptables filter table. Updates tailscale/tailscale#11540 Signed-off-by: Irbe Krumina <irbe@tailscale.com>
This commit is contained in:
@@ -419,7 +419,12 @@ func (r *linuxRouter) UpdateMagicsockPort(port uint16, network string) error {
|
||||
case "udp4":
|
||||
magicsockPort = &r.magicsockPortV4
|
||||
case "udp6":
|
||||
if !r.getV6Available() {
|
||||
// Skip setting up MagicSock port if the host does not support
|
||||
// IPv6. MagicSock IPv6 port needs a filter rule to function. In
|
||||
// some cases (hosts with partial iptables support) filter
|
||||
// tables are not supported, so skip setting up the port for
|
||||
// those hosts too.
|
||||
if !r.getV6FilteringAvailable() {
|
||||
return nil
|
||||
}
|
||||
magicsockPort = &r.magicsockPortV6
|
||||
@@ -526,7 +531,7 @@ func (r *linuxRouter) setNetfilterMode(mode preftype.NetfilterMode) error {
|
||||
return fmt.Errorf("could not add magicsock port rule v4: %w", err)
|
||||
}
|
||||
}
|
||||
if r.magicsockPortV6 != 0 && r.getV6Available() {
|
||||
if r.magicsockPortV6 != 0 && r.getV6FilteringAvailable() {
|
||||
if err := r.nfr.AddMagicsockPortRule(r.magicsockPortV6, "udp6"); err != nil {
|
||||
return fmt.Errorf("could not add magicsock port rule v6: %w", err)
|
||||
}
|
||||
@@ -566,7 +571,7 @@ func (r *linuxRouter) setNetfilterMode(mode preftype.NetfilterMode) error {
|
||||
return fmt.Errorf("could not add magicsock port rule v4: %w", err)
|
||||
}
|
||||
}
|
||||
if r.magicsockPortV6 != 0 && r.getV6Available() {
|
||||
if r.magicsockPortV6 != 0 && r.getV6FilteringAvailable() {
|
||||
if err := r.nfr.AddMagicsockPortRule(r.magicsockPortV6, "udp6"); err != nil {
|
||||
return fmt.Errorf("could not add magicsock port rule v6: %w", err)
|
||||
}
|
||||
@@ -597,17 +602,21 @@ func (r *linuxRouter) setNetfilterMode(mode preftype.NetfilterMode) error {
|
||||
|
||||
for cidr := range r.addrs {
|
||||
if err := r.addLoopbackRule(cidr.Addr()); err != nil {
|
||||
return err
|
||||
return fmt.Errorf("error adding loopback rule: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getV6FilteringAvailable returns true if the router is able to setup the
|
||||
// required tailscale filter rules for IPv6.
|
||||
func (r *linuxRouter) getV6FilteringAvailable() bool {
|
||||
return r.nfr.HasIPV6() && r.nfr.HasIPV6Filter()
|
||||
}
|
||||
|
||||
// getV6Available returns true if the host supports IPv6.
|
||||
func (r *linuxRouter) getV6Available() bool {
|
||||
if r.netfilterMode == netfilterOff {
|
||||
return r.v6Available
|
||||
}
|
||||
return r.nfr.HasIPV6()
|
||||
}
|
||||
|
||||
@@ -669,6 +678,9 @@ func (r *linuxRouter) addLoopbackRule(addr netip.Addr) error {
|
||||
if r.netfilterMode == netfilterOff {
|
||||
return nil
|
||||
}
|
||||
if addr.Is6() && !r.nfr.HasIPV6Filter() {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := r.nfr.AddLoopbackRule(addr); err != nil {
|
||||
return err
|
||||
@@ -682,6 +694,9 @@ func (r *linuxRouter) delLoopbackRule(addr netip.Addr) error {
|
||||
if r.netfilterMode == netfilterOff {
|
||||
return nil
|
||||
}
|
||||
if addr.Is6() && !r.nfr.HasIPV6Filter() {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := r.nfr.DelLoopbackRule(addr); err != nil {
|
||||
return err
|
||||
|
@@ -659,8 +659,9 @@ func (n *fakeIPTablesRunner) DelMagicsockPortRule(port uint16, network string) e
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *fakeIPTablesRunner) HasIPV6() bool { return true }
|
||||
func (n *fakeIPTablesRunner) HasIPV6NAT() bool { return true }
|
||||
func (n *fakeIPTablesRunner) HasIPV6() bool { return true }
|
||||
func (n *fakeIPTablesRunner) HasIPV6NAT() bool { return true }
|
||||
func (n *fakeIPTablesRunner) HasIPV6Filter() bool { return true }
|
||||
|
||||
// fakeOS implements commandRunner and provides v4 and v6
|
||||
// netfilterRunners, but captures changes without touching the OS.
|
||||
|
Reference in New Issue
Block a user