26
)
27
28
var (
29
- errFeatureUnavailable = errors.New(types.APIErrorCodeFeatureUnavailable)
30
- errHostnameConflict = errors.New(types.APIErrorCodeHostnameConflict)
31
- errIPBanned = errors.New(types.APIErrorCodeIPBanned)
32
- errLeaseNotFound = errors.New(types.APIErrorCodeLeaseNotFound)
33
- errLeaseRejected = errors.New(types.APIErrorCodeLeaseRejected)
34
- errTransportMismatch = errors.New(types.APIErrorCodeTransportMismatch)
35
- errUnauthorized = errors.New(types.APIErrorCodeUnauthorized)
36
- errUDPDisabled = errors.New(types.APIErrorCodeUDPDisabled)
37
- errUDPCapacityExceeded = errors.New(types.APIErrorCodeUDPCapacityExceeded)
29
+ errFeatureUnavailable = errors.New(types.APIErrorCodeFeatureUnavailable)
30
+ errHostnameConflict = errors.New(types.APIErrorCodeHostnameConflict)
31
+ errIPBanned = errors.New(types.APIErrorCodeIPBanned)
32
+ errLeaseNotFound = errors.New(types.APIErrorCodeLeaseNotFound)
33
+ errLeaseRejected = errors.New(types.APIErrorCodeLeaseRejected)
34
+ errTransportMismatch = errors.New(types.APIErrorCodeTransportMismatch)
35
+ errUnauthorized = errors.New(types.APIErrorCodeUnauthorized)
36
+ errUDPDisabled = errors.New(types.APIErrorCodeUDPDisabled)
37
+ errUDPCapacityExceeded = errors.New(types.APIErrorCodeUDPCapacityExceeded)
38
+ errTCPPortDisabled = errors.New(types.APIErrorCodeTCPPortDisabled)
39
+ errTCPPortCapacityExceeded = errors.New(types.APIErrorCodeTCPPortCapacityExceeded)
40
)
41
42
func (s *Server) newAPIServer(listener net.Listener, apiMux *http.ServeMux, apiTLS keyless.TLSMaterialConfig) (net.Listener, *http.Server, io.Closer, error) {
157
ExpiresAt: now.Add(2 * types.DiscoveryPollInterval),
158
APIHTTPSAddr: s.cfg.PortalURL,
159
IngressTLSAddr: ingressAddr,
158
- SupportsTCP: true,
160
+ SupportsTLS: true,
161
SupportsUDP: s.cfg.UDPPortCount > 0,
162
+ SupportsTCP: s.cfg.TCPPortCount > 0,
163
SupportsOverlayPeer: supportsOverlayPeer,
164
WireGuardPublicKey: s.wgConfig.PublicKey,
165
WireGuardEndpoint: s.wgConfig.Endpoint,
237
utils.WriteAPIError(w, http.StatusForbidden, types.APIErrorCodeUDPDisabled, err.Error())
238
case errors.Is(err, errUDPCapacityExceeded):
239
utils.WriteAPIError(w, http.StatusServiceUnavailable, types.APIErrorCodeUDPCapacityExceeded, err.Error())
240
+ case errors.Is(err, errTCPPortDisabled):
241
+ utils.WriteAPIError(w, http.StatusForbidden, types.APIErrorCodeTCPPortDisabled, err.Error())
242
+ case errors.Is(err, errTCPPortCapacityExceeded):
243
+ utils.WriteAPIError(w, http.StatusServiceUnavailable, types.APIErrorCodeTCPPortCapacityExceeded, err.Error())
244
default:
245
utils.InvalidRequestError(err).Write(w)
246
}
282
utils.WriteAPIError(w, http.StatusServiceUnavailable, types.APIErrorCodeFeatureUnavailable, errFeatureUnavailable.Error())
283
return
284
}
285
+ if req.TCPEnabled && s.cfg.TCPPortCount <= 0 {
286
+ utils.WriteAPIError(w, http.StatusServiceUnavailable, types.APIErrorCodeFeatureUnavailable, errFeatureUnavailable.Error())
287
+ return
288
+ }
289
290
resp, err := s.registry.issueRegisterChallenge(req, domain, registerURI)
291
if err != nil {
567
return types.RegisterResponse{}, errUDPCapacityExceeded
568
}
569
}
570
+ if req.TCPEnabled {
571
+ if s.cfg.TCPPortCount <= 0 {
572
+ return types.RegisterResponse{}, errFeatureUnavailable
573
+ }
574
+ if !s.registry.policy.IsTCPPortEnabled() {
575
+ return types.RegisterResponse{}, errTCPPortDisabled
576
+ }
577
+ if max := s.registry.policy.TCPPortMaxLeases(); max > 0 && s.registry.CountTCPPortLeases() >= max {
578
+ return types.RegisterResponse{}, errTCPPortCapacityExceeded
579
+ }
580
+ }
581
accessToken, claims, err := auth.IssueLeaseAccessToken(s.identity.PrivateKey, s.identity.Address, s.cfg.PortalURL, identity, ttl)
582
if err != nil {
583
return types.RegisterResponse{}, err
585
issuedAt := claims.IssuedAt.Time().UTC()
586
expiresAt := claims.Expiry.Time().UTC()
587
identityKey := identity.Key()
588
+ stream := transport.NewRelayStream(identityKey, defaultIdleKeepalive, defaultReadyQueueLimit)
589
record := &leaseRecord{
590
Identity: identity,
591
Hostname: hostname,
596
ClientIP: clientIP,
597
ReportedIP: utils.SanitizeReportedIP(reportedIP),
598
UDPEnabled: req.UDPEnabled,
576
- stream: transport.NewRelayStream(identityKey, defaultIdleKeepalive, defaultReadyQueueLimit),
599
+ TCPEnabled: req.TCPEnabled,
600
+ stream: stream,
601
}
602
if req.UDPEnabled {
603
if s.ports == nil {
610
record.datagram = transport.NewRelayDatagram(identityKey, port)
611
record.ports = s.ports
612
}
613
+ if req.TCPEnabled {
614
+ if s.tcpPorts == nil {
615
+ return types.RegisterResponse{}, errors.New("tcp port allocation not available")
616
+ }
617
+ port, err := s.tcpPorts.Allocate(identity.Name)
618
+ if err != nil {
619
+ return types.RegisterResponse{}, err
620
+ }
621
+ record.tcpPort = transport.NewRelayTCPPort(identityKey, port, stream)
622
+ record.tcpPorts = s.tcpPorts
623
+ }
624
625
if err := record.Start(); err != nil {
626
record.Close()
645
ExpiresAt: expiresAt,
646
AccessToken: accessToken,
647
UDPEnabled: record.UDPEnabled,
648
+ TCPEnabled: record.TCPEnabled,
649
}
650
if record.datagram != nil {
651
resp.UDPAddr = fmt.Sprintf("%s:%d", s.identity.Name, record.datagram.UDPPort())
652
}
653
+ if record.tcpPort != nil {
654
+ resp.TCPAddr = fmt.Sprintf("%s:%d", s.identity.Name, record.tcpPort.TCPPort())
655
+ }
656
657
return resp, nil
658
}