You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailscale/cmd/derper/ace.go

51 lines
1.1 KiB
Go

// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause
// TODO: docs about all this
package main
import (
"errors"
"fmt"
"net"
"net/http"
"strings"
"tailscale.com/derp"
"tailscale.com/net/connectproxy"
)
// serveConnect handles a CONNECT request for ACE support.
func serveConnect(s *derp.Server, w http.ResponseWriter, r *http.Request) {
if !*flagACEEnabled {
http.Error(w, "CONNECT not enabled", http.StatusForbidden)
return
}
if r.TLS == nil {
// This should already be enforced by the caller of serveConnect, but
// double check.
http.Error(w, "CONNECT requires TLS", http.StatusForbidden)
return
}
ch := &connectproxy.Handler{
Check: func(hostPort string) error {
host, port, err := net.SplitHostPort(hostPort)
if err != nil {
return err
}
if port != "443" {
return fmt.Errorf("only port 443 is allowed")
}
// TODO(bradfitz): make policy configurable from flags and/or come
// from local tailscaled nodeAttrs
if !strings.HasSuffix(host, ".tailscale.com") || strings.Contains(host, "derp") {
return errors.New("bad host")
}
return nil
},
}
ch.ServeHTTP(w, r)
}