diff --git a/config/config.go b/config/config.go index 67eb83af..522372ef 100644 --- a/config/config.go +++ b/config/config.go @@ -92,6 +92,7 @@ type ServerConfig struct { JwtValidityDuration time.Duration `yaml:"jwt_validity_duration"` RacAutoDisable bool `yaml:"rac_auto_disable"` CacheEnabled string `yaml:"caching_enabled"` + EndpointDetection bool `json:"endpoint_detection"` AllowedEmailDomains string `yaml:"allowed_email_domains"` } diff --git a/controllers/hosts.go b/controllers/hosts.go index 4a659fa5..caf579f2 100644 --- a/controllers/hosts.go +++ b/controllers/hosts.go @@ -134,17 +134,18 @@ func pull(w http.ResponseWriter, r *http.Request) { serverConf.TrafficKey = key response := models.HostPull{ - Host: *host, - Nodes: logic.GetHostNodes(host), - ServerConfig: serverConf, - Peers: hPU.Peers, - PeerIDs: hPU.PeerIDs, - HostNetworkInfo: hPU.HostNetworkInfo, - EgressRoutes: hPU.EgressRoutes, - FwUpdate: hPU.FwUpdate, - ChangeDefaultGw: hPU.ChangeDefaultGw, - DefaultGwIp: hPU.DefaultGwIp, - IsInternetGw: hPU.IsInternetGw, + Host: *host, + Nodes: logic.GetHostNodes(host), + ServerConfig: serverConf, + Peers: hPU.Peers, + PeerIDs: hPU.PeerIDs, + HostNetworkInfo: hPU.HostNetworkInfo, + EgressRoutes: hPU.EgressRoutes, + FwUpdate: hPU.FwUpdate, + ChangeDefaultGw: hPU.ChangeDefaultGw, + DefaultGwIp: hPU.DefaultGwIp, + IsInternetGw: hPU.IsInternetGw, + EndpointDetection: servercfg.IsEndpointDetectionEnabled(), } logger.Log(1, hostID, "completed a pull") diff --git a/logic/peers.go b/logic/peers.go index 20953630..43ba7252 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -72,10 +72,11 @@ func GetPeerUpdateForHost(network string, host *models.Host, allNodes []models.N FwUpdate: models.FwUpdate{ EgressInfo: make(map[string]models.EgressInfo), }, - PeerIDs: make(models.PeerMap, 0), - Peers: []wgtypes.PeerConfig{}, - NodePeers: []wgtypes.PeerConfig{}, - HostNetworkInfo: models.HostInfoMap{}, + PeerIDs: make(models.PeerMap, 0), + Peers: []wgtypes.PeerConfig{}, + NodePeers: []wgtypes.PeerConfig{}, + HostNetworkInfo: models.HostInfoMap{}, + EndpointDetection: servercfg.IsEndpointDetectionEnabled(), } slog.Debug("peer update for host", "hostId", host.ID.String()) diff --git a/models/mqtt.go b/models/mqtt.go index 6dc259ac..54b4b94b 100644 --- a/models/mqtt.go +++ b/models/mqtt.go @@ -8,21 +8,22 @@ import ( // HostPeerUpdate - struct for host peer updates type HostPeerUpdate struct { - Host Host `json:"host" bson:"host" yaml:"host"` - ChangeDefaultGw bool `json:"change_default_gw"` - DefaultGwIp net.IP `json:"default_gw_ip"` - IsInternetGw bool `json:"is_inet_gw"` - NodeAddrs []net.IPNet `json:"nodes_addrs" yaml:"nodes_addrs"` - Server string `json:"server" bson:"server" yaml:"server"` - ServerVersion string `json:"serverversion" bson:"serverversion" yaml:"serverversion"` - ServerAddrs []ServerAddr `json:"serveraddrs" bson:"serveraddrs" yaml:"serveraddrs"` - NodePeers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` - Peers []wgtypes.PeerConfig - PeerIDs PeerMap `json:"peerids" bson:"peerids" yaml:"peerids"` - HostNetworkInfo HostInfoMap `json:"host_network_info,omitempty" bson:"host_network_info,omitempty" yaml:"host_network_info,omitempty"` - EgressRoutes []EgressNetworkRoutes `json:"egress_network_routes"` - FwUpdate FwUpdate `json:"fw_update"` - ReplacePeers bool `json:"replace_peers"` + Host Host `json:"host" bson:"host" yaml:"host"` + ChangeDefaultGw bool `json:"change_default_gw"` + DefaultGwIp net.IP `json:"default_gw_ip"` + IsInternetGw bool `json:"is_inet_gw"` + NodeAddrs []net.IPNet `json:"nodes_addrs" yaml:"nodes_addrs"` + Server string `json:"server" bson:"server" yaml:"server"` + ServerVersion string `json:"serverversion" bson:"serverversion" yaml:"serverversion"` + ServerAddrs []ServerAddr `json:"serveraddrs" bson:"serveraddrs" yaml:"serveraddrs"` + NodePeers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` + Peers []wgtypes.PeerConfig + PeerIDs PeerMap `json:"peerids" bson:"peerids" yaml:"peerids"` + HostNetworkInfo HostInfoMap `json:"host_network_info,omitempty" bson:"host_network_info,omitempty" yaml:"host_network_info,omitempty"` + EgressRoutes []EgressNetworkRoutes `json:"egress_network_routes"` + FwUpdate FwUpdate `json:"fw_update"` + ReplacePeers bool `json:"replace_peers"` + EndpointDetection bool `json:"endpoint_detection"` } // IngressInfo - struct for ingress info diff --git a/models/structs.go b/models/structs.go index be37ce49..a052d7b5 100644 --- a/models/structs.go +++ b/models/structs.go @@ -232,17 +232,18 @@ type TrafficKeys struct { // HostPull - response of a host's pull type HostPull struct { - Host Host `json:"host" yaml:"host"` - Nodes []Node `json:"nodes" yaml:"nodes"` - Peers []wgtypes.PeerConfig `json:"peers" yaml:"peers"` - ServerConfig ServerConfig `json:"server_config" yaml:"server_config"` - PeerIDs PeerMap `json:"peer_ids,omitempty" yaml:"peer_ids,omitempty"` - HostNetworkInfo HostInfoMap `json:"host_network_info,omitempty" yaml:"host_network_info,omitempty"` - EgressRoutes []EgressNetworkRoutes `json:"egress_network_routes"` - FwUpdate FwUpdate `json:"fw_update"` - ChangeDefaultGw bool `json:"change_default_gw"` - DefaultGwIp net.IP `json:"default_gw_ip"` - IsInternetGw bool `json:"is_inet_gw"` + Host Host `json:"host" yaml:"host"` + Nodes []Node `json:"nodes" yaml:"nodes"` + Peers []wgtypes.PeerConfig `json:"peers" yaml:"peers"` + ServerConfig ServerConfig `json:"server_config" yaml:"server_config"` + PeerIDs PeerMap `json:"peer_ids,omitempty" yaml:"peer_ids,omitempty"` + HostNetworkInfo HostInfoMap `json:"host_network_info,omitempty" yaml:"host_network_info,omitempty"` + EgressRoutes []EgressNetworkRoutes `json:"egress_network_routes"` + FwUpdate FwUpdate `json:"fw_update"` + ChangeDefaultGw bool `json:"change_default_gw"` + DefaultGwIp net.IP `json:"default_gw_ip"` + IsInternetGw bool `json:"is_inet_gw"` + EndpointDetection bool `json:"endpoint_detection"` } type DefaultGwInfo struct { diff --git a/scripts/netmaker.default.env b/scripts/netmaker.default.env index cf0c8d67..15f73053 100644 --- a/scripts/netmaker.default.env +++ b/scripts/netmaker.default.env @@ -72,4 +72,6 @@ JWT_VALIDITY_DURATION=43200 # Auto disable a user's connecteds clients bassed on JWT token expiration RAC_AUTO_DISABLE=true # if turned on data will be cached on to improve performance significantly (IMPORTANT: If HA set to `false` ) -CACHING_ENABLED=true \ No newline at end of file +CACHING_ENABLED=true +# if turned on netclient checks if peers are reachable over private/LAN address, and choose that as peer endpoint +ENDPOINT_DETECTION=true diff --git a/scripts/nm-quick.sh b/scripts/nm-quick.sh index 787ac01a..e35f8a40 100755 --- a/scripts/nm-quick.sh +++ b/scripts/nm-quick.sh @@ -249,7 +249,7 @@ save_config() { ( "INSTALL_TYPE" "NODE_ID" "DNS_MODE" "NETCLIENT_AUTO_UPDATE" "API_PORT" "CORS_ALLOWED_ORIGIN" "DISPLAY_KEYS" "DATABASE" "SERVER_BROKER_ENDPOINT" "VERBOSITY" "DEBUG_MODE" "REST_BACKEND" "DISABLE_REMOTE_IP_CHECK" "TELEMETRY" "ALLOWED_EMAIL_DOMAINS" "AUTH_PROVIDER" "CLIENT_ID" "CLIENT_SECRET" - "FRONTEND_URL" "AZURE_TENANT" "OIDC_ISSUER" "EXPORTER_API_PORT" "JWT_VALIDITY_DURATION" "RAC_AUTO_DISABLE" "CACHING_ENABLED") + "FRONTEND_URL" "AZURE_TENANT" "OIDC_ISSUER" "EXPORTER_API_PORT" "JWT_VALIDITY_DURATION" "RAC_AUTO_DISABLE" "CACHING_ENABLED" "ENDPOINT_DETECTION") for name in "${toCopy[@]}"; do save_config_item $name "${!name}" done diff --git a/servercfg/serverconf.go b/servercfg/serverconf.go index 46e35233..1d92e3f7 100644 --- a/servercfg/serverconf.go +++ b/servercfg/serverconf.go @@ -674,6 +674,17 @@ func DeployedByOperator() bool { return config.Config.Server.DeployedByOperator } +// IsEndpointDetectionEnabled - returns true if endpoint detection enabled +func IsEndpointDetectionEnabled() bool { + var enabled = true //default + if os.Getenv("ENDPOINT_DETECTION") != "" { + enabled = os.Getenv("ENDPOINT_DETECTION") == "true" + } else { + enabled = config.Config.Server.EndpointDetection + } + return enabled +} + // GetEnvironment returns the environment the server is running in (e.g. dev, staging, prod...) func GetEnvironment() string { if env := os.Getenv("ENVIRONMENT"); env != "" {