2022-06-02 23:20:42 +00:00
|
|
|
// Copyright (c) 2022 Tailscale Inc & AUTHORS All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package controlhttp
|
|
|
|
|
2022-09-16 19:06:25 +00:00
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"net/url"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"tailscale.com/net/dnscache"
|
|
|
|
"tailscale.com/types/key"
|
|
|
|
"tailscale.com/types/logger"
|
|
|
|
)
|
|
|
|
|
2022-06-02 23:20:42 +00:00
|
|
|
const (
|
|
|
|
// upgradeHeader is the value of the Upgrade HTTP header used to
|
|
|
|
// indicate the Tailscale control protocol.
|
|
|
|
upgradeHeaderValue = "tailscale-control-protocol"
|
|
|
|
|
|
|
|
// handshakeHeaderName is the HTTP request header that can
|
|
|
|
// optionally contain base64-encoded initial handshake
|
|
|
|
// payload, to save an RTT.
|
|
|
|
handshakeHeaderName = "X-Tailscale-Handshake"
|
|
|
|
|
|
|
|
// serverUpgradePath is where the server-side HTTP handler to
|
|
|
|
// to do the protocol switch is located.
|
|
|
|
serverUpgradePath = "/ts2021"
|
|
|
|
)
|
2022-09-16 19:06:25 +00:00
|
|
|
|
|
|
|
// Dialer contains configuration on how to dial the Tailscale control server.
|
|
|
|
type Dialer struct {
|
|
|
|
// Hostname is the hostname to connect to, with no port number.
|
|
|
|
//
|
|
|
|
// This field is required.
|
|
|
|
Hostname string
|
|
|
|
|
|
|
|
// MachineKey contains the current machine's private key.
|
|
|
|
//
|
|
|
|
// This field is required.
|
|
|
|
MachineKey key.MachinePrivate
|
|
|
|
|
|
|
|
// ControlKey contains the expected public key for the control server.
|
|
|
|
//
|
|
|
|
// This field is required.
|
|
|
|
ControlKey key.MachinePublic
|
|
|
|
|
|
|
|
// ProtocolVersion is the expected protocol version to negotiate.
|
|
|
|
//
|
|
|
|
// This field is required.
|
|
|
|
ProtocolVersion uint16
|
|
|
|
|
|
|
|
// HTTPPort is the port number to use when making a HTTP connection.
|
|
|
|
//
|
|
|
|
// If not specified, this defaults to port 80.
|
|
|
|
HTTPPort string
|
|
|
|
|
|
|
|
// HTTPSPort is the port number to use when making a HTTPS connection.
|
|
|
|
//
|
|
|
|
// If not specified, this defaults to port 443.
|
|
|
|
HTTPSPort string
|
|
|
|
|
|
|
|
// Dialer is the dialer used to make outbound connections.
|
|
|
|
//
|
|
|
|
// If not specified, this defaults to net.Dialer.DialContext.
|
|
|
|
Dialer dnscache.DialContextFunc
|
|
|
|
|
|
|
|
// Logf, if set, is a logging function to use; if unset, logs are
|
|
|
|
// dropped.
|
|
|
|
Logf logger.Logf
|
|
|
|
|
|
|
|
proxyFunc func(*http.Request) (*url.URL, error) // or nil
|
|
|
|
|
|
|
|
// For tests only
|
|
|
|
insecureTLS bool
|
|
|
|
testFallbackDelay time.Duration
|
|
|
|
}
|
|
|
|
|
|
|
|
func strDef(v1, v2 string) string {
|
|
|
|
if v1 != "" {
|
|
|
|
return v1
|
|
|
|
}
|
|
|
|
return v2
|
|
|
|
}
|