From b1441d004478ea931e007eeccacc5f86457f8e91 Mon Sep 17 00:00:00 2001 From: James Tucker Date: Wed, 23 Nov 2022 14:45:44 -0800 Subject: [PATCH] cmd/stunc: add command for making debug stun requests Signed-off-by: James Tucker --- cmd/stunc/stunc.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 cmd/stunc/stunc.go diff --git a/cmd/stunc/stunc.go b/cmd/stunc/stunc.go new file mode 100644 index 000000000..34cc4f2e5 --- /dev/null +++ b/cmd/stunc/stunc.go @@ -0,0 +1,58 @@ +// 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. + +// Command stunc makes a STUN request to a STUN server and prints the result. +package main + +import ( + "log" + "net" + "os" + + "tailscale.com/net/stun" +) + +func main() { + log.SetFlags(0) + + if len(os.Args) != 2 { + log.Fatalf("usage: %s ", os.Args[0]) + } + host := os.Args[1] + + uaddr, err := net.ResolveUDPAddr("udp", host+":3478") + if err != nil { + log.Fatal(err) + } + c, err := net.ListenUDP("udp", nil) + if err != nil { + log.Fatal(err) + } + + txID := stun.NewTxID() + req := stun.Request(txID) + + _, err = c.WriteToUDP(req, uaddr) + if err != nil { + log.Fatal(err) + } + + var buf [1024]byte + n, raddr, err := c.ReadFromUDPAddrPort(buf[:]) + if err != nil { + log.Fatal(err) + } + + tid, saddr, err := stun.ParseResponse(buf[:n]) + if err != nil { + log.Fatal(err) + } + if tid != txID { + log.Fatalf("txid mismatch: got %v, want %v", tid, txID) + } + + log.Printf("sent addr: %v", uaddr) + log.Printf("from addr: %v", raddr) + log.Printf("stun addr: %v", saddr) +}