Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
e916e0d
Add proto fields for IPv6 overlay and compact IP encoding
lixmal Mar 19, 2026
01c4d57
Fix gosec and staticcheck lint errors from proto deprecation
lixmal Mar 19, 2026
63c19db
Rename peer_ips to peer_prefixes and simplify EncodePrefix with AsSlice
lixmal Mar 19, 2026
cd7290a
Rename peer_prefixes to source_prefixes in FirewallRule
lixmal Mar 19, 2026
67fb6be
Use copy into fixed arrays to satisfy gosec bounds checking
lixmal Mar 19, 2026
8550765
Validate prefix length bounds in DecodePrefix
lixmal Mar 19, 2026
3963072
Rename source_prefixes to sourcePrefixes for consistent JSON naming
lixmal Mar 20, 2026
e2f7748
Add PeerCapability enum and disableIPv6 flag to proto
lixmal Mar 21, 2026
acdf8d9
Merge branch 'main' into proto-ipv6-overlay
lixmal Mar 22, 2026
0137700
Merge remote-tracking branch 'origin/main' into proto-ipv6-overlay
lixmal Mar 25, 2026
b852ce1
Add IPv6 overlay address support to client interface and engine
lixmal Mar 24, 2026
1a7e835
Fix CodeRabbit findings: hasIPv6Changed restart loop, empty peerIPs p…
lixmal Mar 24, 2026
878dc45
Fix govet non-constant format string in log.Warnf
lixmal Mar 24, 2026
71962f8
Add IPv6 reverse DNS and host configurator support
lixmal Mar 24, 2026
d81cd5d
Add IPv6 support to SSH server, client config, and netflow logger
lixmal Mar 24, 2026
3be5a5f
Fix CodeRabbit findings: hasIPv6Changed restart loop, empty peerIPs p…
lixmal Mar 24, 2026
5fcea07
Merge branch 'client-ipv6-iface' into client-ipv6-dns
lixmal Mar 25, 2026
5a29fa8
Merge branch 'client-ipv6-dns' into client-ipv6-ssh-netflow
lixmal Mar 25, 2026
baf2c03
Fix CodeRabbit findings: hasIPv6Changed restart loop, empty peerIPs p…
lixmal Mar 24, 2026
641e386
Merge branch 'client-ipv6-iface' into client-ipv6-dns
lixmal Mar 25, 2026
0c2fbd5
Merge branch 'client-ipv6-dns' into client-ipv6-ssh-netflow
lixmal Mar 25, 2026
50c0bc5
Fix connect.go lint: use SetIPv6FromCompact instead of if-else chain
lixmal Mar 25, 2026
bc6ed1a
Merge branch 'client-ipv6-dns' into client-ipv6-ssh-netflow
lixmal Mar 25, 2026
58eb519
Merge remote-tracking branch 'origin/main' into proto-ipv6-overlay
lixmal Mar 26, 2026
6acc6a1
Merge branch 'proto-ipv6-overlay' into client-ipv6-iface
lixmal Mar 26, 2026
1a6cf9d
Merge branch 'client-ipv6-iface' into client-ipv6-dns
lixmal Mar 26, 2026
1cc19e7
Merge branch 'client-ipv6-dns' into client-ipv6-ssh-netflow
lixmal Mar 26, 2026
daeb90c
Merge pull request #5687 from netbirdio/client-ipv6-ssh-netflow
lixmal Apr 7, 2026
ed646f5
Merge pull request #5686 from netbirdio/client-ipv6-dns
lixmal Apr 7, 2026
a5d4df0
Merge pull request #5675 from netbirdio/client-ipv6-iface
lixmal Apr 7, 2026
9592de1
Merge remote-tracking branch 'origin/main' into proto-ipv6-overlay
lixmal Apr 7, 2026
90c5065
Add missing SetInterfaceIPv6 to Android noop network listener
lixmal Apr 7, 2026
939598c
Collapse IPv6 toggle log to stay under Sonar file line limit
lixmal Apr 7, 2026
fa77768
Merge remote-tracking branch 'origin/main' into proto-ipv6-overlay
lixmal Apr 8, 2026
86f1b53
Fix MySQL no-op update returning account not found in SaveAccountSett…
lixmal Apr 8, 2026
a1e7db2
[management] Add IPv6 overlay addressing and capability gating (#5698)
lixmal Apr 8, 2026
1c4e5e7
[client] Add IPv6 support to ACL manager, USP filter, and forwarder (…
lixmal Apr 9, 2026
ac816a8
Merge remote-tracking branch 'origin/main' into proto-ipv6-overlay
lixmal Apr 9, 2026
0cc90e2
Fix networkmap correctness test for netip.Addr Peer.IP type
lixmal Apr 9, 2026
f484835
Use net.JoinHostPort and net.SplitHostPort for IPv6-safe host:port ha…
lixmal Apr 10, 2026
6e05a2e
Fix CodeRabbit review issues from IPv6 overlay PR (#5839)
lixmal Apr 10, 2026
a1cb952
Reconcile IPv6 addresses on group membership changes (#5837)
lixmal Apr 10, 2026
4562988
Merge remote-tracking branch 'origin/main' into proto-ipv6-overlay
lixmal Apr 10, 2026
6c5ff88
Return error from EncodePrefix instead of silently clamping bits
lixmal Apr 10, 2026
2a34f17
Anonymize SourcePrefixes in firewall rule debug output
lixmal Apr 10, 2026
2f5d9fc
Add IPv6 dispatch for OutputDNAT, fix v6 guard pattern, rename DNAT p…
lixmal Apr 10, 2026
8ddbcf6
Fix dynamic route v6 NAT rule not cleaned up on removal
lixmal Apr 10, 2026
567f36b
Fix legacy dynamic route NAT missing v6 duplicate
lixmal Apr 10, 2026
4b298fb
Fix legacy dynamic route NAT missing v6 duplicate
lixmal Apr 10, 2026
4fc9100
Check chain existence before deleting NAT OUTPUT jump rule
lixmal Apr 10, 2026
51d1edf
Resolve tracer 'self' to v6 overlay address when peer is IPv6
lixmal Apr 10, 2026
afa1256
Merge remote-tracking branch 'origin/main' into proto-ipv6-overlay
lixmal Apr 10, 2026
14a39f1
Reduce cognitive complexity in DeleteAccount and getNetworkResourcesR…
lixmal Apr 10, 2026
6f5c272
Revert "Reduce cognitive complexity in DeleteAccount and getNetworkRe…
lixmal Apr 10, 2026
aa85635
Merge remote-tracking branch 'origin/main' into proto-ipv6-overlay
lixmal Apr 10, 2026
762bf9f
Reduce cognitive complexity in DeleteAccount and getNetworkResourcesR…
lixmal Apr 10, 2026
2c792d1
Merge remote-tracking branch 'origin/main' into proto-ipv6-overlay
lixmal Apr 11, 2026
d1070a4
Regenerate proto files with matching tool versions from main
lixmal Apr 11, 2026
f86ecea
Merge remote-tracking branch 'origin/main' into proto-ipv6-overlay
lixmal Apr 13, 2026
0c9f470
Merge branch 'main' into proto-ipv6-overlay
lixmal Apr 17, 2026
02c0b20
Move IPv6 blackhole from notifier to platform tun (java/swift)
lixmal Apr 18, 2026
cec2103
[client] Reconcile external nft accept rules on external changes (#5912)
lixmal Apr 20, 2026
4506f82
Merge branch 'main' into proto-ipv6-overlay
lixmal Apr 20, 2026
d2aaadb
Replace deprecated iptables --set with --match-set in ACL ipset match
lixmal Apr 20, 2026
3537e22
Fix manager_test.go: use netip.MustParseAddr for PeerSSHInfo.IP
lixmal Apr 20, 2026
e19d0c7
Merge branch 'main' into proto-ipv6-overlay
lixmal Apr 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,4 @@ infrastructure_files/setup-*.env
vendor/
/netbird
client/netbird-electron/
management/server/types/testdata/
88 changes: 65 additions & 23 deletions client/android/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -301,10 +301,11 @@ func (c *Client) PeersList() *PeerInfoArray {
peerInfos := make([]PeerInfo, len(fullStatus.Peers))
for n, p := range fullStatus.Peers {
pi := PeerInfo{
p.IP,
p.FQDN,
int(p.ConnStatus),
PeerRoutes{routes: maps.Keys(p.GetRoutes())},
IP: p.IP,
IPv6: p.IPv6,
FQDN: p.FQDN,
ConnStatus: int(p.ConnStatus),
Routes: PeerRoutes{routes: maps.Keys(p.GetRoutes())},
}
peerInfos[n] = pi
}
Expand Down Expand Up @@ -336,41 +337,82 @@ func (c *Client) Networks() *NetworkArray {
return nil
}

routesMap := routeManager.GetClientRoutesWithNetID()
v6Merged := route.V6ExitMergeSet(routesMap)
resolvedDomains := c.recorder.GetResolvedDomainsStates()

networkArray := &NetworkArray{
items: make([]Network, 0),
}

resolvedDomains := c.recorder.GetResolvedDomainsStates()

for id, routes := range routeManager.GetClientRoutesWithNetID() {
for id, routes := range routesMap {
if len(routes) == 0 {
continue
}
if _, skip := v6Merged[id]; skip {
continue
}

network := c.buildNetwork(id, routes, routeSelector.IsSelected(id), resolvedDomains, v6Merged)
if network == nil {
continue
}
networkArray.Add(*network)
}
return networkArray
}

r := routes[0]
domains := c.getNetworkDomainsFromRoute(r, resolvedDomains)
netStr := r.Network.String()
func (c *Client) buildNetwork(id route.NetID, routes []*route.Route, selected bool, resolvedDomains map[domain.Domain]peer.ResolvedDomainInfo, v6Merged map[route.NetID]struct{}) *Network {
r := routes[0]
netStr := r.Network.String()
if r.IsDynamic() {
netStr = r.Domains.SafeString()
}

if r.IsDynamic() {
netStr = r.Domains.SafeString()
routePeer, err := c.findBestRoutePeer(routes)
if err != nil {
log.Errorf("could not get peer info for route %s: %v", id, err)
return nil
}

network := &Network{
Name: string(id),
Network: netStr,
Peer: routePeer.FQDN,
Status: routePeer.ConnStatus.String(),
IsSelected: selected,
Domains: c.getNetworkDomainsFromRoute(r, resolvedDomains),
}

if route.IsV4DefaultRoute(r.Network) && route.HasV6ExitPair(id, v6Merged) {
network.Network = "0.0.0.0/0, ::/0"
}

return network
}

// findBestRoutePeer returns the peer actively routing traffic for the given
// HA route group. Falls back to the first connected peer, then the first peer.
func (c *Client) findBestRoutePeer(routes []*route.Route) (peer.State, error) {
netStr := routes[0].Network.String()

fullStatus := c.recorder.GetFullStatus()
for _, p := range fullStatus.Peers {
if _, ok := p.GetRoutes()[netStr]; ok {
return p, nil
}
}

routePeer, err := c.recorder.GetPeer(routes[0].Peer)
for _, r := range routes {
p, err := c.recorder.GetPeer(r.Peer)
if err != nil {
log.Errorf("could not get peer info for %s: %v", routes[0].Peer, err)
continue
}
network := Network{
Name: string(id),
Network: netStr,
Peer: routePeer.FQDN,
Status: routePeer.ConnStatus.String(),
IsSelected: routeSelector.IsSelected(id),
Domains: domains,
if p.ConnStatus == peer.StatusConnected {
return p, nil
}
networkArray.Add(network)
}
return networkArray
return c.recorder.GetPeer(routes[0].Peer)
}

// OnUpdatedHostDNS update the DNS servers addresses for root zones
Expand Down
1 change: 1 addition & 0 deletions client/android/peer_notifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const (
// PeerInfo describe information about the peers. It designed for the UI usage
type PeerInfo struct {
IP string
IPv6 string
FQDN string
ConnStatus int
Routes PeerRoutes
Expand Down
18 changes: 18 additions & 0 deletions client/android/preferences.go
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,24 @@ func (p *Preferences) SetBlockInbound(block bool) {
p.configInput.BlockInbound = &block
}

// GetDisableIPv6 reads disable IPv6 setting from config file
func (p *Preferences) GetDisableIPv6() (bool, error) {
if p.configInput.DisableIPv6 != nil {
return *p.configInput.DisableIPv6, nil
}

cfg, err := profilemanager.ReadConfig(p.configInput.ConfigPath)
if err != nil {
return false, err
}
return cfg.DisableIPv6, err
}

// SetDisableIPv6 stores the given value and waits for commit
func (p *Preferences) SetDisableIPv6(disable bool) {
p.configInput.DisableIPv6 = &disable
}

// Commit writes out the changes to the config file
func (p *Preferences) Commit() error {
_, err := profilemanager.UpdateOrCreateConfig(p.configInput)
Expand Down
7 changes: 5 additions & 2 deletions client/android/route_command.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,12 @@ func executeRouteToggle(id string, manager routemanager.Manager,
netID := route.NetID(id)
routes := []route.NetID{netID}

log.Debugf("%s with id: %s", operationName, id)
routesMap := manager.GetClientRoutesWithNetID()
routes = route.ExpandV6ExitPairs(routes, routesMap)

if err := routeOperation(routes, maps.Keys(manager.GetClientRoutesWithNetID())); err != nil {
log.Debugf("%s with ids: %v", operationName, routes)

if err := routeOperation(routes, maps.Keys(routesMap)); err != nil {
log.Debugf("error when %s: %s", operationName, err)
return fmt.Errorf("error %s: %w", operationName, err)
}
Expand Down
17 changes: 12 additions & 5 deletions client/anonymize/anonymize.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"net/url"
"regexp"
"slices"
"strconv"
"strings"
)

Expand All @@ -26,8 +27,9 @@ type Anonymizer struct {
}

func DefaultAddresses() (netip.Addr, netip.Addr) {
// 198.51.100.0, 100::
return netip.AddrFrom4([4]byte{198, 51, 100, 0}), netip.AddrFrom16([16]byte{0x01})
// 198.51.100.0 (RFC 5737 TEST-NET-2), 2001:db8:ffff:: (RFC 3849 documentation, last /48)
// The old start 100:: (discard, RFC 6666) is now used for fake IPs on Android.
return netip.AddrFrom4([4]byte{198, 51, 100, 0}), netip.MustParseAddr("2001:db8:ffff::")
}

func NewAnonymizer(startIPv4, startIPv6 netip.Addr) *Anonymizer {
Expand All @@ -48,7 +50,7 @@ func (a *Anonymizer) AnonymizeIP(ip netip.Addr) netip.Addr {
ip.IsLinkLocalUnicast() ||
ip.IsLinkLocalMulticast() ||
ip.IsInterfaceLocalMulticast() ||
ip.IsPrivate() ||
(ip.Is4() && ip.IsPrivate()) ||
ip.IsUnspecified() ||
ip.IsMulticast() ||
isWellKnown(ip) ||
Expand Down Expand Up @@ -96,6 +98,11 @@ func (a *Anonymizer) isInAnonymizedRange(ip netip.Addr) bool {
}

func (a *Anonymizer) AnonymizeIPString(ip string) string {
// Handle CIDR notation (e.g. "2001:db8::/32")
if prefix, err := netip.ParsePrefix(ip); err == nil {
return a.AnonymizeIP(prefix.Addr()).String() + "/" + strconv.Itoa(prefix.Bits())
}

addr, err := netip.ParseAddr(ip)
if err != nil {
return ip
Expand Down Expand Up @@ -150,15 +157,15 @@ func (a *Anonymizer) AnonymizeURI(uri string) string {
if u.Opaque != "" {
host, port, err := net.SplitHostPort(u.Opaque)
if err == nil {
anonymizedHost = fmt.Sprintf("%s:%s", a.AnonymizeDomain(host), port)
anonymizedHost = net.JoinHostPort(a.AnonymizeDomain(host), port)
} else {
anonymizedHost = a.AnonymizeDomain(u.Opaque)
}
u.Opaque = anonymizedHost
} else if u.Host != "" {
host, port, err := net.SplitHostPort(u.Host)
if err == nil {
anonymizedHost = fmt.Sprintf("%s:%s", a.AnonymizeDomain(host), port)
anonymizedHost = net.JoinHostPort(a.AnonymizeDomain(host), port)
} else {
anonymizedHost = a.AnonymizeDomain(u.Host)
}
Expand Down
24 changes: 17 additions & 7 deletions client/anonymize/anonymize_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (

func TestAnonymizeIP(t *testing.T) {
startIPv4 := netip.MustParseAddr("198.51.100.0")
startIPv6 := netip.MustParseAddr("100::")
startIPv6 := netip.MustParseAddr("2001:db8:ffff::")
anonymizer := anonymize.NewAnonymizer(startIPv4, startIPv6)

tests := []struct {
Expand All @@ -26,9 +26,9 @@ func TestAnonymizeIP(t *testing.T) {
{"Second Public IPv4", "4.3.2.1", "198.51.100.1"},
{"Repeated IPv4", "1.2.3.4", "198.51.100.0"},
{"Private IPv4", "192.168.1.1", "192.168.1.1"},
{"First Public IPv6", "2607:f8b0:4005:805::200e", "100::"},
{"Second Public IPv6", "a::b", "100::1"},
{"Repeated IPv6", "2607:f8b0:4005:805::200e", "100::"},
{"First Public IPv6", "2607:f8b0:4005:805::200e", "2001:db8:ffff::"},
{"Second Public IPv6", "a::b", "2001:db8:ffff::1"},
{"Repeated IPv6", "2607:f8b0:4005:805::200e", "2001:db8:ffff::"},
{"Private IPv6", "fe80::1", "fe80::1"},
{"In Range IPv4", "198.51.100.2", "198.51.100.2"},
}
Expand Down Expand Up @@ -274,17 +274,27 @@ func TestAnonymizeString_IPAddresses(t *testing.T) {
{
name: "IPv6 Address",
input: "Access attempted from 2001:db8::ff00:42",
expect: "Access attempted from 100::",
expect: "Access attempted from 2001:db8:ffff::",
},
{
name: "IPv6 Address with Port",
input: "Access attempted from [2001:db8::ff00:42]:8080",
expect: "Access attempted from [100::]:8080",
expect: "Access attempted from [2001:db8:ffff::]:8080",
},
{
name: "Both IPv4 and IPv6",
input: "IPv4: 142.108.0.1 and IPv6: 2001:db8::ff00:43",
expect: "IPv4: 198.51.100.1 and IPv6: 100::1",
expect: "IPv4: 198.51.100.1 and IPv6: 2001:db8:ffff::1",
},
{
name: "STUN URI with IPv6",
input: "Connecting to stun:[2001:db8::ff00:42]:3478",
expect: "Connecting to stun:[2001:db8:ffff::]:3478",
},
{
name: "HTTPS URI with IPv6",
input: "Visit https://[2001:db8::ff00:42]:443/path",
expect: "Visit https://[2001:db8:ffff::]:443/path",
},
}

Expand Down
6 changes: 3 additions & 3 deletions client/cmd/ssh.go
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,7 @@ func parseHostnameAndCommand(args []string) error {
}

func runSSH(ctx context.Context, addr string, cmd *cobra.Command) error {
target := fmt.Sprintf("%s:%d", addr, port)
target := net.JoinHostPort(strings.Trim(addr, "[]"), strconv.Itoa(port))
c, err := sshclient.Dial(ctx, target, username, sshclient.DialOptions{
KnownHostsFile: knownHostsFile,
IdentityFile: identityFile,
Expand Down Expand Up @@ -787,10 +787,10 @@ func isUnixSocket(path string) bool {
return strings.HasPrefix(path, "/") || strings.HasPrefix(path, "./")
}

// normalizeLocalHost converts "*" to "0.0.0.0" for binding to all interfaces.
// normalizeLocalHost converts "*" to "" for binding to all interfaces (dual-stack).
func normalizeLocalHost(host string) string {
if host == "*" {
return "0.0.0.0"
return ""
}
return host
}
Expand Down
4 changes: 2 additions & 2 deletions client/cmd/ssh_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -527,10 +527,10 @@ func TestParsePortForward(t *testing.T) {
{
name: "wildcard bind all interfaces",
spec: "*:8080:localhost:80",
expectedLocal: "0.0.0.0:8080",
expectedLocal: ":8080",
expectedRemote: "localhost:80",
expectError: false,
description: "Wildcard * should bind to all interfaces (0.0.0.0)",
description: "Wildcard * should bind to all interfaces (dual-stack)",
},
{
name: "wildcard for port only",
Expand Down
14 changes: 12 additions & 2 deletions client/cmd/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
var (
detailFlag bool
ipv4Flag bool
ipv6Flag bool
jsonFlag bool
yamlFlag bool
ipsFilter []string
Expand All @@ -45,8 +46,9 @@ func init() {
statusCmd.PersistentFlags().BoolVar(&jsonFlag, "json", false, "display detailed status information in json format")
statusCmd.PersistentFlags().BoolVar(&yamlFlag, "yaml", false, "display detailed status information in yaml format")
statusCmd.PersistentFlags().BoolVar(&ipv4Flag, "ipv4", false, "display only NetBird IPv4 of this peer, e.g., --ipv4 will output 100.64.0.33")
statusCmd.MarkFlagsMutuallyExclusive("detail", "json", "yaml", "ipv4")
statusCmd.PersistentFlags().StringSliceVar(&ipsFilter, "filter-by-ips", []string{}, "filters the detailed output by a list of one or more IPs, e.g., --filter-by-ips 100.64.0.100,100.64.0.200")
statusCmd.PersistentFlags().BoolVar(&ipv6Flag, "ipv6", false, "display only NetBird IPv6 of this peer")
statusCmd.MarkFlagsMutuallyExclusive("detail", "json", "yaml", "ipv4", "ipv6")
statusCmd.PersistentFlags().StringSliceVar(&ipsFilter, "filter-by-ips", []string{}, "filters the detailed output by a list of one or more IPs (v4 or v6), e.g., --filter-by-ips 100.64.0.100,fd00::1")
statusCmd.PersistentFlags().StringSliceVar(&prefixNamesFilter, "filter-by-names", []string{}, "filters the detailed output by a list of one or more peer FQDN or hostnames, e.g., --filter-by-names peer-a,peer-b.netbird.cloud")
statusCmd.PersistentFlags().StringVar(&statusFilter, "filter-by-status", "", "filters the detailed output by connection status(idle|connecting|connected), e.g., --filter-by-status connected")
statusCmd.PersistentFlags().StringVar(&connectionTypeFilter, "filter-by-connection-type", "", "filters the detailed output by connection type (P2P|Relayed), e.g., --filter-by-connection-type P2P")
Expand Down Expand Up @@ -101,6 +103,14 @@ func statusFunc(cmd *cobra.Command, args []string) error {
return nil
}

if ipv6Flag {
ipv6 := resp.GetFullStatus().GetLocalPeerState().GetIpv6()
if ipv6 != "" {
cmd.Print(parseInterfaceIP(ipv6))
}
return nil
}

pm := profilemanager.NewProfileManager()
var profName string
if activeProf, err := pm.GetActiveProfile(); err == nil {
Expand Down
5 changes: 5 additions & 0 deletions client/cmd/system.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ const (
disableFirewallFlag = "disable-firewall"
blockLANAccessFlag = "block-lan-access"
blockInboundFlag = "block-inbound"
disableIPv6Flag = "disable-ipv6"
)

var (
Expand All @@ -17,6 +18,7 @@ var (
disableFirewall bool
blockLANAccess bool
blockInbound bool
disableIPv6 bool
)

func init() {
Expand All @@ -39,4 +41,7 @@ func init() {
upCmd.PersistentFlags().BoolVar(&blockInbound, blockInboundFlag, false,
"Block inbound connections. If enabled, the client will not allow any inbound connections to the local machine nor routed networks.\n"+
"This overrides any policies received from the management service.")

upCmd.PersistentFlags().BoolVar(&disableIPv6, disableIPv6Flag, false,
"Disable IPv6 overlay. If enabled, the client won't request or use an IPv6 overlay address.")
}
Loading
Loading