Skip to content

Commit

Permalink
Add hostname parameter for TCP probe (#981)
Browse files Browse the repository at this point in the history
This adds the ability to set the TLS server name for TCP probes using the hostname parameter, 
just like #823 did for HTTP probes

* add hostname parameter for tcp probe
* only add servername if TLS is true
* add even if TLS isn't true in case of STARTTLS
* added test hostname parameter with TCP probe
* remove unnecessary function and inline assignment

---------

Signed-off-by: Lyas Spiehler <lspiehler@gmail.com>
Co-authored-by: Lyas Spiehler <lyas.spiehler@sapphirehealth.org>
  • Loading branch information
lspiehler and lyasspiehler committed Feb 1, 2023
1 parent c17e2d1 commit 2894df6
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
6 changes: 6 additions & 0 deletions prober/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,12 @@ func Handler(w http.ResponseWriter, r *http.Request, c *config.Config, logger lo
}
}

if module.Prober == "tcp" && hostname != "" {
if module.TCP.TLSConfig.ServerName == "" {
module.TCP.TLSConfig.ServerName = hostname
}
}

sl := newScrapeLogger(logger, moduleName, target)
level.Info(sl).Log("msg", "Beginning probe", "probe", module.Prober, "timeout_seconds", timeoutSeconds)

Expand Down
54 changes: 54 additions & 0 deletions prober/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ package prober
import (
"bytes"
"fmt"
"net"
"net/http"
"net/http/httptest"
"strconv"
"strings"
"testing"
"time"
Expand Down Expand Up @@ -203,3 +205,55 @@ func TestHostnameParam(t *testing.T) {
t.Errorf("probe request handler returned wrong status code: %v, want %v", status, http.StatusBadRequest)
}
}

func TestTCPHostnameParam(t *testing.T) {
c := &config.Config{
Modules: map[string]config.Module{
"tls_connect": {
Prober: "tcp",
Timeout: 10 * time.Second,
TCP: config.TCPProbe{
TLS: true,
IPProtocol: "ip4",
TLSConfig: pconfig.TLSConfig{InsecureSkipVerify: true},
},
},
},
}

// check that 'hostname' parameter make its way to server_name in the tls_config
hostname := "foo.example.com"

ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Host != hostname {
t.Errorf("Unexpected Host: expected %q, got %q.", hostname, r.Host)
}
w.WriteHeader(http.StatusOK)
}))
defer ts.Close()

requrl := fmt.Sprintf("?module=tls_connect&debug=true&hostname=%s&target=%s", hostname, ts.Listener.Addr().(*net.TCPAddr).IP.String()+":"+strconv.Itoa(ts.Listener.Addr().(*net.TCPAddr).Port))

req, err := http.NewRequest("GET", requrl, nil)
if err != nil {
t.Fatal(err)
}

rr := httptest.NewRecorder()

handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
Handler(w, r, c, log.NewNopLogger(), &ResultHistory{}, 0.5, nil)
})

handler.ServeHTTP(rr, req)

if status := rr.Code; status != http.StatusOK {
t.Errorf("probe request handler returned wrong status code: %v, want %v", status, http.StatusOK)
}

// check debug output to confirm the server_name is set in tls_config and matches supplied hostname
if !strings.Contains(rr.Body.String(), "server_name: "+hostname) {
t.Errorf("probe failed, response body: %v", rr.Body.String())
}

}

0 comments on commit 2894df6

Please sign in to comment.