feat: add option to speedtest to dump a pcap of network traffic (#11848)

This commit is contained in:
Colin Adler 2024-01-29 09:57:31 -06:00 committed by GitHub
parent b2bc3fff33
commit bc14e926d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 41 additions and 0 deletions

View File

@ -3,11 +3,13 @@ package cli
import (
"context"
"fmt"
"os"
"time"
"github.com/jedib0t/go-pretty/v6/table"
"golang.org/x/xerrors"
tsspeedtest "tailscale.com/net/speedtest"
"tailscale.com/wgengine/capture"
"cdr.dev/slog"
"cdr.dev/slog/sloggers/sloghuman"
@ -21,6 +23,7 @@ func (r *RootCmd) speedtest() *clibase.Cmd {
direct bool
duration time.Duration
direction string
pcapFile string
)
client := new(codersdk.Client)
cmd := &clibase.Cmd{
@ -63,6 +66,7 @@ func (r *RootCmd) speedtest() *clibase.Cmd {
return err
}
defer conn.Close()
if direct {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
@ -95,6 +99,19 @@ func (r *RootCmd) speedtest() *clibase.Cmd {
} else {
conn.AwaitReachable(ctx)
}
if pcapFile != "" {
s := capture.New()
conn.InstallCaptureHook(s.LogPacket)
f, err := os.OpenFile(pcapFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
if err != nil {
return err
}
defer f.Close()
unregister := s.RegisterOutput(f)
defer unregister()
}
var tsDir tsspeedtest.Direction
switch direction {
case "up":
@ -146,6 +163,12 @@ func (r *RootCmd) speedtest() *clibase.Cmd {
Default: tsspeedtest.DefaultDuration.String(),
Value: clibase.DurationOf(&duration),
},
{
Description: "Specifies a file to write a network capture to.",
Flag: "pcap-file",
Default: "",
Value: clibase.StringOf(&pcapFile),
},
}
return cmd
}

View File

@ -14,6 +14,9 @@ OPTIONS:
Specifies whether to run in reverse mode where the client receives and
the server sends.
--pcap-file string
Specifies a file to write a network capture to.
-t, --time duration (default: 5s)
Specifies the duration to monitor traffic.

8
docs/cli/speedtest.md generated
View File

@ -29,6 +29,14 @@ Specifies whether to wait for a direct connection before testing speed.
Specifies whether to run in reverse mode where the client receives and the server sends.
### --pcap-file
| | |
| ---- | ------------------- |
| Type | <code>string</code> |
Specifies a file to write a network capture to.
### -t, --time
| | |

View File

@ -30,6 +30,7 @@ import (
tslogger "tailscale.com/types/logger"
"tailscale.com/types/netlogtype"
"tailscale.com/wgengine"
"tailscale.com/wgengine/capture"
"tailscale.com/wgengine/magicsock"
"tailscale.com/wgengine/netstack"
"tailscale.com/wgengine/router"
@ -310,6 +311,12 @@ type Conn struct {
trafficStats *connstats.Statistics
}
func (c *Conn) InstallCaptureHook(f capture.Callback) {
c.mutex.Lock()
defer c.mutex.Unlock()
c.wireguardEngine.InstallCaptureHook(f)
}
func (c *Conn) MagicsockSetDebugLoggingEnabled(enabled bool) {
c.magicConn.SetDebugLoggingEnabled(enabled)
}