mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-12 16:39:09 +02:00
[management] Emit IPv6 default permit firewall rule for exit node routes (#6368)
This commit is contained in:
@@ -557,7 +557,6 @@ func (c *NetworkMapComponents) getRoutingPeerRoutes(peerID string) (enabledRoute
|
|||||||
return enabledRoutes, disabledRoutes
|
return enabledRoutes, disabledRoutes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (c *NetworkMapComponents) filterRoutesByGroups(routes []*route.Route, groupListMap LookupMap) []*route.Route {
|
func (c *NetworkMapComponents) filterRoutesByGroups(routes []*route.Route, groupListMap LookupMap) []*route.Route {
|
||||||
var filteredRoutes []*route.Route
|
var filteredRoutes []*route.Route
|
||||||
for _, r := range routes {
|
for _, r := range routes {
|
||||||
@@ -628,9 +627,14 @@ func (c *NetworkMapComponents) getDefaultPermit(r *route.Route, includeIPv6 bool
|
|||||||
|
|
||||||
rules := []*RouteFirewallRule{&rule}
|
rules := []*RouteFirewallRule{&rule}
|
||||||
|
|
||||||
if includeIPv6 && r.IsDynamic() {
|
isDefaultV4 := r.Network.Addr().Is4() && r.Network.Bits() == 0
|
||||||
|
if includeIPv6 && (r.IsDynamic() || isDefaultV4) {
|
||||||
ruleV6 := rule
|
ruleV6 := rule
|
||||||
ruleV6.SourceRanges = []string{"::/0"}
|
ruleV6.SourceRanges = []string{"::/0"}
|
||||||
|
if isDefaultV4 {
|
||||||
|
ruleV6.Destination = "::/0"
|
||||||
|
ruleV6.RouteID = r.ID + "-v6-default"
|
||||||
|
}
|
||||||
rules = append(rules, &ruleV6)
|
rules = append(rules, &ruleV6)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
"slices"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -1029,6 +1030,48 @@ func TestComponents_RouteDefaultPermit(t *testing.T) {
|
|||||||
assert.True(t, hasDefaultPermit, "route without ACG should have default permit rule with 0.0.0.0/0 source")
|
assert.True(t, hasDefaultPermit, "route without ACG should have default permit rule with 0.0.0.0/0 source")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestComponents_ExitNodeDefaultPermitIPv6 verifies that a default exit node route
|
||||||
|
// (0.0.0.0/0) without AccessControlGroups also emits an IPv6 default permit rule
|
||||||
|
// (::/0 source and destination) for peers that support IPv6, mirroring the route
|
||||||
|
// the client installs. Without it, IPv6 traffic is routed to the exit node but
|
||||||
|
// dropped at the forward chain.
|
||||||
|
func TestComponents_ExitNodeDefaultPermitIPv6(t *testing.T) {
|
||||||
|
account, validatedPeers := scalableTestAccount(20, 2)
|
||||||
|
|
||||||
|
routingPeerID := "peer-5"
|
||||||
|
routingPeer := account.Peers[routingPeerID]
|
||||||
|
routingPeer.IPv6 = netip.MustParseAddr("fd00::5")
|
||||||
|
routingPeer.Meta.Capabilities = append(routingPeer.Meta.Capabilities, nbpeer.PeerCapabilityIPv6Overlay)
|
||||||
|
|
||||||
|
account.Routes["route-exit"] = &route.Route{
|
||||||
|
ID: "route-exit", Network: netip.MustParsePrefix("0.0.0.0/0"),
|
||||||
|
PeerID: routingPeerID, Peer: routingPeer.Key,
|
||||||
|
Enabled: true, Groups: []string{"group-all"}, PeerGroups: []string{"group-0"},
|
||||||
|
AccessControlGroups: []string{},
|
||||||
|
AccountID: "test-account",
|
||||||
|
}
|
||||||
|
|
||||||
|
nm := componentsNetworkMap(account, routingPeerID, validatedPeers)
|
||||||
|
require.NotNil(t, nm)
|
||||||
|
|
||||||
|
hasV4 := false
|
||||||
|
hasV6 := false
|
||||||
|
for _, rfr := range nm.RoutesFirewallRules {
|
||||||
|
switch rfr.Destination {
|
||||||
|
case "0.0.0.0/0":
|
||||||
|
if slices.Contains(rfr.SourceRanges, "0.0.0.0/0") {
|
||||||
|
hasV4 = true
|
||||||
|
}
|
||||||
|
case "::/0":
|
||||||
|
if slices.Contains(rfr.SourceRanges, "::/0") {
|
||||||
|
hasV6 = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert.True(t, hasV4, "exit node route should have an IPv4 default permit rule (0.0.0.0/0)")
|
||||||
|
assert.True(t, hasV6, "exit node route should have an IPv6 default permit rule (::/0)")
|
||||||
|
}
|
||||||
|
|
||||||
// ──────────────────────────────────────────────────────────────────────────────
|
// ──────────────────────────────────────────────────────────────────────────────
|
||||||
// 15. MULTIPLE ROUTERS PER NETWORK
|
// 15. MULTIPLE ROUTERS PER NETWORK
|
||||||
// ──────────────────────────────────────────────────────────────────────────────
|
// ──────────────────────────────────────────────────────────────────────────────
|
||||||
|
|||||||
Reference in New Issue
Block a user