controlknobs.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. // Package controlknobs contains client options configurable from control which can be turned on
  4. // or off. The ability to turn options on and off is for incrementally adding features in.
  5. package controlknobs
  6. import (
  7. "sync/atomic"
  8. "tailscale.com/syncs"
  9. "tailscale.com/tailcfg"
  10. "tailscale.com/types/opt"
  11. )
  12. // Knobs is the set of knobs that the control plane's coordination server can
  13. // adjust at runtime.
  14. type Knobs struct {
  15. // DisableUPnP indicates whether to attempt UPnP mapping.
  16. DisableUPnP atomic.Bool
  17. // DisableDRPO is whether control says to disable the
  18. // DERP route optimization (Issue 150).
  19. DisableDRPO atomic.Bool
  20. // KeepFullWGConfig is whether we should disable the lazy wireguard
  21. // programming and instead give WireGuard the full netmap always, even for
  22. // idle peers.
  23. KeepFullWGConfig atomic.Bool
  24. // RandomizeClientPort is whether control says we should randomize
  25. // the client port.
  26. RandomizeClientPort atomic.Bool
  27. // OneCGNAT is whether the the node should make one big CGNAT route
  28. // in the OS rather than one /32 per peer.
  29. OneCGNAT syncs.AtomicValue[opt.Bool]
  30. // ForceBackgroundSTUN forces netcheck STUN queries to keep
  31. // running in magicsock, even when idle.
  32. ForceBackgroundSTUN atomic.Bool
  33. // DisableDeltaUpdates is whether the node should not process
  34. // incremental (delta) netmap updates and should treat all netmap
  35. // changes as "full" ones as tailscaled did in 1.48.x and earlier.
  36. DisableDeltaUpdates atomic.Bool
  37. // PeerMTUEnable is whether the node should do peer path MTU discovery.
  38. PeerMTUEnable atomic.Bool
  39. // DisableDNSForwarderTCPRetries is whether the DNS forwarder should
  40. // skip retrying truncated queries over TCP.
  41. DisableDNSForwarderTCPRetries atomic.Bool
  42. // SilentDisco is whether the node should suppress disco heartbeats to its
  43. // peers.
  44. SilentDisco atomic.Bool
  45. // LinuxForceIPTables is whether the node should use iptables for Linux
  46. // netfiltering, unless overridden by the user.
  47. LinuxForceIPTables atomic.Bool
  48. // LinuxForceNfTables is whether the node should use nftables for Linux
  49. // netfiltering, unless overridden by the user.
  50. LinuxForceNfTables atomic.Bool
  51. // SeamlessKeyRenewal is whether to enable the alpha functionality of
  52. // renewing node keys without breaking connections.
  53. // http://go/seamless-key-renewal
  54. SeamlessKeyRenewal atomic.Bool
  55. // ProbeUDPLifetime is whether the node should probe UDP path lifetime on
  56. // the tail end of an active direct connection in magicsock.
  57. ProbeUDPLifetime atomic.Bool
  58. // AppCStoreRoutes is whether the node should store RouteInfo to StateStore
  59. // if it's an app connector.
  60. AppCStoreRoutes atomic.Bool
  61. }
  62. // UpdateFromNodeAttributes updates k (if non-nil) based on the provided self
  63. // node attributes (Node.Capabilities).
  64. func (k *Knobs) UpdateFromNodeAttributes(capMap tailcfg.NodeCapMap) {
  65. if k == nil {
  66. return
  67. }
  68. has := capMap.Contains
  69. var (
  70. keepFullWG = has(tailcfg.NodeAttrDebugDisableWGTrim)
  71. disableDRPO = has(tailcfg.NodeAttrDebugDisableDRPO)
  72. disableUPnP = has(tailcfg.NodeAttrDisableUPnP)
  73. randomizeClientPort = has(tailcfg.NodeAttrRandomizeClientPort)
  74. disableDeltaUpdates = has(tailcfg.NodeAttrDisableDeltaUpdates)
  75. oneCGNAT opt.Bool
  76. forceBackgroundSTUN = has(tailcfg.NodeAttrDebugForceBackgroundSTUN)
  77. peerMTUEnable = has(tailcfg.NodeAttrPeerMTUEnable)
  78. dnsForwarderDisableTCPRetries = has(tailcfg.NodeAttrDNSForwarderDisableTCPRetries)
  79. silentDisco = has(tailcfg.NodeAttrSilentDisco)
  80. forceIPTables = has(tailcfg.NodeAttrLinuxMustUseIPTables)
  81. forceNfTables = has(tailcfg.NodeAttrLinuxMustUseNfTables)
  82. seamlessKeyRenewal = has(tailcfg.NodeAttrSeamlessKeyRenewal)
  83. probeUDPLifetime = has(tailcfg.NodeAttrProbeUDPLifetime)
  84. appCStoreRoutes = has(tailcfg.NodeAttrStoreAppCRoutes)
  85. )
  86. if has(tailcfg.NodeAttrOneCGNATEnable) {
  87. oneCGNAT.Set(true)
  88. } else if has(tailcfg.NodeAttrOneCGNATDisable) {
  89. oneCGNAT.Set(false)
  90. }
  91. k.KeepFullWGConfig.Store(keepFullWG)
  92. k.DisableDRPO.Store(disableDRPO)
  93. k.DisableUPnP.Store(disableUPnP)
  94. k.RandomizeClientPort.Store(randomizeClientPort)
  95. k.OneCGNAT.Store(oneCGNAT)
  96. k.ForceBackgroundSTUN.Store(forceBackgroundSTUN)
  97. k.DisableDeltaUpdates.Store(disableDeltaUpdates)
  98. k.PeerMTUEnable.Store(peerMTUEnable)
  99. k.DisableDNSForwarderTCPRetries.Store(dnsForwarderDisableTCPRetries)
  100. k.SilentDisco.Store(silentDisco)
  101. k.LinuxForceIPTables.Store(forceIPTables)
  102. k.LinuxForceNfTables.Store(forceNfTables)
  103. k.SeamlessKeyRenewal.Store(seamlessKeyRenewal)
  104. k.ProbeUDPLifetime.Store(probeUDPLifetime)
  105. k.AppCStoreRoutes.Store(appCStoreRoutes)
  106. }
  107. // AsDebugJSON returns k as something that can be marshalled with json.Marshal
  108. // for debug.
  109. func (k *Knobs) AsDebugJSON() map[string]any {
  110. if k == nil {
  111. return nil
  112. }
  113. return map[string]any{
  114. "DisableUPnP": k.DisableUPnP.Load(),
  115. "DisableDRPO": k.DisableDRPO.Load(),
  116. "KeepFullWGConfig": k.KeepFullWGConfig.Load(),
  117. "RandomizeClientPort": k.RandomizeClientPort.Load(),
  118. "OneCGNAT": k.OneCGNAT.Load(),
  119. "ForceBackgroundSTUN": k.ForceBackgroundSTUN.Load(),
  120. "DisableDeltaUpdates": k.DisableDeltaUpdates.Load(),
  121. "PeerMTUEnable": k.PeerMTUEnable.Load(),
  122. "DisableDNSForwarderTCPRetries": k.DisableDNSForwarderTCPRetries.Load(),
  123. "SilentDisco": k.SilentDisco.Load(),
  124. "LinuxForceIPTables": k.LinuxForceIPTables.Load(),
  125. "LinuxForceNfTables": k.LinuxForceNfTables.Load(),
  126. "SeamlessKeyRenewal": k.SeamlessKeyRenewal.Load(),
  127. "ProbeUDPLifetime": k.ProbeUDPLifetime.Load(),
  128. "AppCStoreRoutes": k.AppCStoreRoutes.Load(),
  129. }
  130. }