mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	Merge pull request #499 from juanfont/mandatory-stun
This commit is contained in:
		
						commit
						53b62f3f39
					
				
							
								
								
									
										23
									
								
								app.go
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								app.go
									
									
									
									
									
								
							| @ -47,6 +47,14 @@ import ( | ||||
| 	"tailscale.com/types/key" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	errSTUNAddressNotSet                   = Error("STUN address not set") | ||||
| 	errUnsupportedDatabase                 = Error("unsupported DB") | ||||
| 	errUnsupportedLetsEncryptChallengeType = Error( | ||||
| 		"unknown value for Lets Encrypt challenge type", | ||||
| 	) | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	AuthPrefix         = "Bearer " | ||||
| 	Postgres           = "postgres" | ||||
| @ -58,11 +66,6 @@ const ( | ||||
| 	registerCacheExpiration = time.Minute * 15 | ||||
| 	registerCacheCleanup    = time.Minute * 20 | ||||
| 
 | ||||
| 	errUnsupportedDatabase                 = Error("unsupported DB") | ||||
| 	errUnsupportedLetsEncryptChallengeType = Error( | ||||
| 		"unknown value for Lets Encrypt challenge type", | ||||
| 	) | ||||
| 
 | ||||
| 	DisabledClientAuth = "disabled" | ||||
| 	RelaxedClientAuth  = "relaxed" | ||||
| 	EnforcedClientAuth = "enforced" | ||||
| @ -124,7 +127,6 @@ type DERPConfig struct { | ||||
| 	ServerRegionID   int | ||||
| 	ServerRegionCode string | ||||
| 	ServerRegionName string | ||||
| 	STUNEnabled      bool | ||||
| 	STUNAddr         string | ||||
| 	URLs             []url.URL | ||||
| 	Paths            []string | ||||
| @ -500,10 +502,13 @@ func (h *Headscale) Serve() error { | ||||
| 	h.DERPMap = GetDERPMap(h.cfg.DERP) | ||||
| 
 | ||||
| 	if h.cfg.DERP.ServerEnabled { | ||||
| 		h.DERPMap.Regions[h.DERPServer.region.RegionID] = &h.DERPServer.region | ||||
| 		if h.cfg.DERP.STUNEnabled { | ||||
| 			go h.ServeSTUN() | ||||
| 		// When embedded DERP is enabled we always need a STUN server
 | ||||
| 		if h.cfg.DERP.STUNAddr == "" { | ||||
| 			return errSTUNAddressNotSet | ||||
| 		} | ||||
| 
 | ||||
| 		h.DERPMap.Regions[h.DERPServer.region.RegionID] = &h.DERPServer.region | ||||
| 		go h.ServeSTUN() | ||||
| 	} | ||||
| 
 | ||||
| 	if h.cfg.DERP.AutoUpdate { | ||||
|  | ||||
| @ -55,6 +55,9 @@ func LoadConfig(path string) error { | ||||
| 
 | ||||
| 	viper.SetDefault("dns_config", nil) | ||||
| 
 | ||||
| 	viper.SetDefault("derp.server.enabled", false) | ||||
| 	viper.SetDefault("derp.server.stun.enabled", true) | ||||
| 
 | ||||
| 	viper.SetDefault("unix_socket", "/var/run/headscale.sock") | ||||
| 	viper.SetDefault("unix_socket_permission", "0o770") | ||||
| 
 | ||||
| @ -121,8 +124,11 @@ func GetDERPConfig() headscale.DERPConfig { | ||||
| 	serverRegionID := viper.GetInt("derp.server.region_id") | ||||
| 	serverRegionCode := viper.GetString("derp.server.region_code") | ||||
| 	serverRegionName := viper.GetString("derp.server.region_name") | ||||
| 	stunEnabled := viper.GetBool("derp.server.stun.enabled") | ||||
| 	stunAddr := viper.GetString("derp.server.stun.listen_addr") | ||||
| 	stunAddr := viper.GetString("derp.server.stun_listen_addr") | ||||
| 
 | ||||
| 	if serverEnabled && stunAddr == "" { | ||||
| 		log.Fatal().Msg("derp.server.stun_listen_addr must be set if derp.server.enabled is true") | ||||
| 	} | ||||
| 
 | ||||
| 	urlStrs := viper.GetStringSlice("derp.urls") | ||||
| 
 | ||||
| @ -149,7 +155,6 @@ func GetDERPConfig() headscale.DERPConfig { | ||||
| 		ServerRegionID:   serverRegionID, | ||||
| 		ServerRegionCode: serverRegionCode, | ||||
| 		ServerRegionName: serverRegionName, | ||||
| 		STUNEnabled:      stunEnabled, | ||||
| 		STUNAddr:         stunAddr, | ||||
| 		URLs:             urls, | ||||
| 		Paths:            paths, | ||||
|  | ||||
| @ -69,11 +69,11 @@ derp: | ||||
|     region_code: "headscale" | ||||
|     region_name: "Headscale Embedded DERP" | ||||
| 
 | ||||
|     # If enabled, also listens in UDP at the configured address for STUN connections to help on NAT traversal | ||||
|     # Listens in UDP at the configured address for STUN connections to help on NAT traversal. | ||||
|     # When the embedded DERP server is enabled stun_listen_addr MUST be defined. | ||||
|     # | ||||
|     # For more details on how this works, check this great article: https://tailscale.com/blog/how-tailscale-works/ | ||||
|     stun: | ||||
|       enabled: false | ||||
|       listen_addr: "0.0.0.0:3478" | ||||
|     stun_listen_addr: "0.0.0.0:3478" | ||||
| 
 | ||||
|   # List of externally available DERP maps encoded in JSON | ||||
|   urls: | ||||
|  | ||||
| @ -77,17 +77,15 @@ func (h *Headscale) generateRegionLocalDERP() (tailcfg.DERPRegion, error) { | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	if h.cfg.DERP.STUNEnabled { | ||||
| 		_, portStr, err := net.SplitHostPort(h.cfg.DERP.STUNAddr) | ||||
| 		if err != nil { | ||||
| 			return tailcfg.DERPRegion{}, err | ||||
| 		} | ||||
| 		port, err := strconv.Atoi(portStr) | ||||
| 		if err != nil { | ||||
| 			return tailcfg.DERPRegion{}, err | ||||
| 		} | ||||
| 		localDERPregion.Nodes[0].STUNPort = port | ||||
| 	_, portSTUNStr, err := net.SplitHostPort(h.cfg.DERP.STUNAddr) | ||||
| 	if err != nil { | ||||
| 		return tailcfg.DERPRegion{}, err | ||||
| 	} | ||||
| 	portSTUN, err := strconv.Atoi(portSTUNStr) | ||||
| 	if err != nil { | ||||
| 		return tailcfg.DERPRegion{}, err | ||||
| 	} | ||||
| 	localDERPregion.Nodes[0].STUNPort = portSTUN | ||||
| 
 | ||||
| 	return localDERPregion, nil | ||||
| } | ||||
|  | ||||
| @ -24,6 +24,5 @@ derp: | ||||
|     region_id: 999 | ||||
|     region_code: "headscale" | ||||
|     region_name: "Headscale Embedded DERP" | ||||
|     stun: | ||||
|       enabled: true | ||||
|       listen_addr: "0.0.0.0:3478" | ||||
| 
 | ||||
|     stun_listen_addr: "0.0.0.0:3478" | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user