|
|
@@ -62,8 +62,9 @@ type Knobs struct {
|
|
|
// netfiltering, unless overridden by the user.
|
|
|
LinuxForceNfTables atomic.Bool
|
|
|
|
|
|
- // SeamlessKeyRenewal is whether to enable the alpha functionality of
|
|
|
- // renewing node keys without breaking connections.
|
|
|
+ // SeamlessKeyRenewal is whether to renew node keys without breaking connections.
|
|
|
+ // This is enabled by default in 1.90 and later, but we but we can remotely disable
|
|
|
+ // it from the control plane if there's a problem.
|
|
|
// http://go/seamless-key-renewal
|
|
|
SeamlessKeyRenewal atomic.Bool
|
|
|
|
|
|
@@ -128,6 +129,7 @@ func (k *Knobs) UpdateFromNodeAttributes(capMap tailcfg.NodeCapMap) {
|
|
|
forceIPTables = has(tailcfg.NodeAttrLinuxMustUseIPTables)
|
|
|
forceNfTables = has(tailcfg.NodeAttrLinuxMustUseNfTables)
|
|
|
seamlessKeyRenewal = has(tailcfg.NodeAttrSeamlessKeyRenewal)
|
|
|
+ disableSeamlessKeyRenewal = has(tailcfg.NodeAttrDisableSeamlessKeyRenewal)
|
|
|
probeUDPLifetime = has(tailcfg.NodeAttrProbeUDPLifetime)
|
|
|
appCStoreRoutes = has(tailcfg.NodeAttrStoreAppCRoutes)
|
|
|
userDialUseRoutes = has(tailcfg.NodeAttrUserDialUseRoutes)
|
|
|
@@ -154,7 +156,6 @@ func (k *Knobs) UpdateFromNodeAttributes(capMap tailcfg.NodeCapMap) {
|
|
|
k.SilentDisco.Store(silentDisco)
|
|
|
k.LinuxForceIPTables.Store(forceIPTables)
|
|
|
k.LinuxForceNfTables.Store(forceNfTables)
|
|
|
- k.SeamlessKeyRenewal.Store(seamlessKeyRenewal)
|
|
|
k.ProbeUDPLifetime.Store(probeUDPLifetime)
|
|
|
k.AppCStoreRoutes.Store(appCStoreRoutes)
|
|
|
k.UserDialUseRoutes.Store(userDialUseRoutes)
|
|
|
@@ -162,6 +163,21 @@ func (k *Knobs) UpdateFromNodeAttributes(capMap tailcfg.NodeCapMap) {
|
|
|
k.DisableLocalDNSOverrideViaNRPT.Store(disableLocalDNSOverrideViaNRPT)
|
|
|
k.DisableCaptivePortalDetection.Store(disableCaptivePortalDetection)
|
|
|
k.DisableSkipStatusQueue.Store(disableSkipStatusQueue)
|
|
|
+
|
|
|
+ // If both attributes are present, then "enable" should win. This reflects
|
|
|
+ // the history of seamless key renewal.
|
|
|
+ //
|
|
|
+ // Before 1.90, seamless was a private alpha, opt-in feature. Devices would
|
|
|
+ // only seamless do if customers opted in using the seamless renewal attr.
|
|
|
+ //
|
|
|
+ // In 1.90 and later, seamless is the default behaviour, and devices will use
|
|
|
+ // seamless unless explicitly told not to by control (e.g. if we discover
|
|
|
+ // a bug and want clients to use the prior behaviour).
|
|
|
+ //
|
|
|
+ // If a customer has opted in to the pre-1.90 seamless implementation, we
|
|
|
+ // don't want to switch it off for them -- we only want to switch it off for
|
|
|
+ // devices that haven't opted in.
|
|
|
+ k.SeamlessKeyRenewal.Store(seamlessKeyRenewal || !disableSeamlessKeyRenewal)
|
|
|
}
|
|
|
|
|
|
// AsDebugJSON returns k as something that can be marshalled with json.Marshal
|