wgengine/filter: add protocol-agnostic packet checker (#10446)

For use in ACL tests, we need a way to check whether a packet is allowed
not just with TCP, but any protocol.

Updates #3561

Signed-off-by: Andrew Lytvynov <awly@tailscale.com>
pull/10450/head
Andrew Lytvynov 12 months ago committed by GitHub
parent c85532270f
commit 263e01c47b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -300,9 +300,9 @@ var dummyPacket = []byte{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
} }
// CheckTCP determines whether TCP traffic from srcIP to dstIP:dstPort // Check determines whether traffic from srcIP to dstIP:dstPort is allowed
// is allowed. // using protocol proto.
func (f *Filter) CheckTCP(srcIP, dstIP netip.Addr, dstPort uint16) Response { func (f *Filter) Check(srcIP, dstIP netip.Addr, dstPort uint16, proto ipproto.Proto) Response {
pkt := &packet.Parsed{} pkt := &packet.Parsed{}
pkt.Decode(dummyPacket) // initialize private fields pkt.Decode(dummyPacket) // initialize private fields
switch { switch {
@ -319,12 +319,20 @@ func (f *Filter) CheckTCP(srcIP, dstIP netip.Addr, dstPort uint16) Response {
} }
pkt.Src = netip.AddrPortFrom(srcIP, 0) pkt.Src = netip.AddrPortFrom(srcIP, 0)
pkt.Dst = netip.AddrPortFrom(dstIP, dstPort) pkt.Dst = netip.AddrPortFrom(dstIP, dstPort)
pkt.IPProto = ipproto.TCP pkt.IPProto = proto
pkt.TCPFlags = packet.TCPSyn if proto == ipproto.TCP {
pkt.TCPFlags = packet.TCPSyn
}
return f.RunIn(pkt, 0) return f.RunIn(pkt, 0)
} }
// CheckTCP determines whether TCP traffic from srcIP to dstIP:dstPort
// is allowed.
func (f *Filter) CheckTCP(srcIP, dstIP netip.Addr, dstPort uint16) Response {
return f.Check(srcIP, dstIP, dstPort, ipproto.TCP)
}
// CapsWithValues appends to base the capabilities that srcIP has talking // CapsWithValues appends to base the capabilities that srcIP has talking
// to dstIP. // to dstIP.
func (f *Filter) CapsWithValues(srcIP, dstIP netip.Addr) tailcfg.PeerCapMap { func (f *Filter) CapsWithValues(srcIP, dstIP netip.Addr) tailcfg.PeerCapMap {

Loading…
Cancel
Save