tstest/natlab/vnet: add syslog tests

Updates #13038

Change-Id: I4ac96cb0a9e46a2fb1e09ddedd3614eb006c2c8c
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2024-08-30 10:54:51 -07:00 committed by Brad Fitzpatrick
parent b1a5b40318
commit 7e88d6712e
3 changed files with 77 additions and 2 deletions

View File

@ -6,6 +6,7 @@
import (
"cmp"
"fmt"
"iter"
"net/netip"
"os"
"slices"
@ -60,6 +61,10 @@ func (c *Config) FirstNetwork() *Network {
return c.networks[0]
}
func (c *Config) Nodes() iter.Seq2[int, *Node] {
return slices.All(c.nodes)
}
func nodeMac(n int) MAC {
// 52=TS then 0xcc for cccclient
return MAC{0x52, 0xcc, 0xcc, 0xcc, 0xcc, byte(n)}

View File

@ -1322,7 +1322,7 @@ func (n *network) handleUDPPacketForRouter(ep EthernetPacket, udp *layers.UDP, t
if node.verboseSyslog {
// TODO(bradfitz): parse this and capture it, structured, into
// node's log buffer.
log.Printf("syslog from %v: %s", node, udp.Payload)
n.logf("syslog from %v: %s", node, udp.Payload)
}
return
}

View File

@ -84,6 +84,22 @@ type netTest struct {
pktSubstr(" IP=2052::3 "),
),
},
{
name: "syslog-v4",
pkt: mkSyslogPacket(clientIPv4(1), "<6>2024-08-30T10:36:06-07:00 natlabapp tailscaled[1]: 2024/08/30 10:36:06 some-message"),
check: all(
numPkts(0),
logSubstr("some-message"),
),
},
{
name: "syslog-v6",
pkt: mkSyslogPacket(nodeWANIP6(1), "<6>2024-08-30T10:36:06-07:00 natlabapp tailscaled[1]: 2024/08/30 10:36:06 some-message"),
check: all(
numPkts(0),
logSubstr("some-message"),
),
},
},
},
{
@ -288,7 +304,7 @@ func mkDNSReq(ipVer int) []byte {
ip = &layers.IPv4{
Version: 4,
Protocol: layers.IPProtocolUDP,
SrcIP: net.ParseIP("192.168.0.101"),
SrcIP: clientIPv4(1).AsSlice(),
TTL: 64,
DstIP: FakeDNSIPv4().AsSlice(),
}
@ -354,6 +370,40 @@ func mkDHCP(srcMAC MAC, typ layers.DHCPMsgType) []byte {
return mkPacket(eth, ip, udp, dhcp)
}
func mkSyslogPacket(srcIP netip.Addr, msg string) []byte {
eth := &layers.Ethernet{
SrcMAC: nodeMac(1).HWAddr(),
DstMAC: routerMac(1).HWAddr(),
EthernetType: layers.EthernetTypeIPv4,
}
if srcIP.Is6() {
eth.EthernetType = layers.EthernetTypeIPv6
}
var ip serializableNetworkLayer
if srcIP.Is4() {
ip = &layers.IPv4{
Version: 4,
Protocol: layers.IPProtocolUDP,
SrcIP: srcIP.AsSlice(),
TTL: 64,
DstIP: FakeSyslogIPv4().AsSlice(),
}
} else if srcIP.Is6() {
ip = &layers.IPv6{
Version: 6,
HopLimit: 64,
NextHeader: layers.IPProtocolUDP,
SrcIP: srcIP.AsSlice(),
DstIP: FakeSyslogIPv6().AsSlice(),
}
}
udp := &layers.UDP{
SrcPort: 123,
DstPort: 456, // unused; only IP matches
}
return mkPacket(eth, ip, udp, gopacket.Payload([]byte(msg)))
}
// receivedPacket is an ethernet frame that was received during a test.
type receivedPacket struct {
port MAC // MAC address of client that received the packet
@ -439,11 +489,28 @@ func numPkts(want int) func(*sideEffects) error {
}
}
func clientIPv4(n int) netip.Addr {
return netip.AddrFrom4([4]byte{192, 168, 0, byte(100 + n)})
}
var wanSLAACBase = netip.MustParseAddr("2052::50cc:ccff:fecc:cc01")
// nodeLANIP6 returns a node number's Link Local SLAAC IPv6 address,
// such as fe80::50cc:ccff:fecc:cc03 for node 3.
func nodeWANIP6(n int) netip.Addr {
a := wanSLAACBase.As16()
a[15] = byte(n)
return netip.AddrFrom16(a)
}
func newTwoNodesSameNetwork() (*Server, error) {
var c Config
nw := c.AddNetwork("192.168.0.1/24", "2052::1/64")
c.AddNode(nw)
c.AddNode(nw)
for _, c := range c.Nodes() {
c.SetVerboseSyslog(true)
}
return New(&c)
}
@ -452,6 +519,9 @@ func newTwoNodesSameV4Network() (*Server, error) {
nw := c.AddNetwork("192.168.0.1/24")
c.AddNode(nw)
c.AddNode(nw)
for _, c := range c.Nodes() {
c.SetVerboseSyslog(true)
}
return New(&c)
}