mirror of
https://github.com/slackhq/nebula.git
synced 2025-12-15 15:20:44 -08:00
V2 certificate format (#1216)
Co-authored-by: Nate Brown <nbrown.us@gmail.com> Co-authored-by: Jack Doan <jackdoan@rivian.com> Co-authored-by: brad-defined <77982333+brad-defined@users.noreply.github.com> Co-authored-by: Jack Doan <me@jackdoan.com>
This commit is contained in:
parent
2b427a7e89
commit
d97ed57a19
105 changed files with 8276 additions and 4528 deletions
|
|
@ -10,8 +10,8 @@ import (
|
|||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
|
@ -136,7 +136,10 @@ func NewR(t testing.TB, controls ...*nebula.Control) *R {
|
|||
panic("Duplicate listen address: " + addr.String())
|
||||
}
|
||||
|
||||
r.vpnControls[c.GetVpnIp()] = c
|
||||
for _, vpnAddr := range c.GetVpnAddrs() {
|
||||
r.vpnControls[vpnAddr] = c
|
||||
}
|
||||
|
||||
r.controls[addr] = c
|
||||
}
|
||||
|
||||
|
|
@ -213,11 +216,11 @@ func (r *R) renderFlow() {
|
|||
continue
|
||||
}
|
||||
participants[addr] = struct{}{}
|
||||
sanAddr := strings.Replace(addr.String(), ":", "-", 1)
|
||||
sanAddr := normalizeName(addr.String())
|
||||
participantsVals = append(participantsVals, sanAddr)
|
||||
fmt.Fprintf(
|
||||
f, " participant %s as Nebula: %s<br/>UDP: %s\n",
|
||||
sanAddr, e.packet.from.GetVpnIp(), sanAddr,
|
||||
sanAddr, e.packet.from.GetVpnAddrs(), sanAddr,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -250,9 +253,9 @@ func (r *R) renderFlow() {
|
|||
|
||||
fmt.Fprintf(f,
|
||||
" %s%s%s: %s(%s), index %v, counter: %v\n",
|
||||
strings.Replace(p.from.GetUDPAddr().String(), ":", "-", 1),
|
||||
normalizeName(p.from.GetUDPAddr().String()),
|
||||
line,
|
||||
strings.Replace(p.to.GetUDPAddr().String(), ":", "-", 1),
|
||||
normalizeName(p.to.GetUDPAddr().String()),
|
||||
h.TypeName(), h.SubTypeName(), h.RemoteIndex, h.MessageCounter,
|
||||
)
|
||||
}
|
||||
|
|
@ -267,6 +270,11 @@ func (r *R) renderFlow() {
|
|||
}
|
||||
}
|
||||
|
||||
func normalizeName(s string) string {
|
||||
rx := regexp.MustCompile("[\\[\\]\\:]")
|
||||
return rx.ReplaceAllLiteralString(s, "_")
|
||||
}
|
||||
|
||||
// IgnoreFlow tells the router to stop recording future flows that matches the provided criteria.
|
||||
// messageType and subType will target nebula underlay packets while tun will target nebula overlay packets
|
||||
// NOTE: This is a very broad system, if you set tun to true then no more tun traffic will be rendered
|
||||
|
|
@ -303,7 +311,7 @@ func (r *R) RenderHostmaps(title string, controls ...*nebula.Control) {
|
|||
func (r *R) renderHostmaps(title string) {
|
||||
c := maps.Values(r.controls)
|
||||
sort.SliceStable(c, func(i, j int) bool {
|
||||
return c[i].GetVpnIp().Compare(c[j].GetVpnIp()) > 0
|
||||
return c[i].GetVpnAddrs()[0].Compare(c[j].GetVpnAddrs()[0]) > 0
|
||||
})
|
||||
|
||||
s := renderHostmaps(c...)
|
||||
|
|
@ -419,10 +427,11 @@ func (r *R) RouteUntilTxTun(sender *nebula.Control, receiver *nebula.Control) []
|
|||
// Nope, lets push the sender along
|
||||
case p := <-udpTx:
|
||||
r.Lock()
|
||||
c := r.getControl(sender.GetUDPAddr(), p.To, p)
|
||||
a := sender.GetUDPAddr()
|
||||
c := r.getControl(a, p.To, p)
|
||||
if c == nil {
|
||||
r.Unlock()
|
||||
panic("No control for udp tx")
|
||||
panic("No control for udp tx " + a.String())
|
||||
}
|
||||
fp := r.unlockedInjectFlow(sender, c, p, false)
|
||||
c.InjectUDPPacket(p)
|
||||
|
|
@ -475,10 +484,11 @@ func (r *R) RouteForAllUntilTxTun(receiver *nebula.Control) []byte {
|
|||
} else {
|
||||
// we are a udp tx, route and continue
|
||||
p := rx.Interface().(*udp.Packet)
|
||||
c := r.getControl(cm[x].GetUDPAddr(), p.To, p)
|
||||
a := cm[x].GetUDPAddr()
|
||||
c := r.getControl(a, p.To, p)
|
||||
if c == nil {
|
||||
r.Unlock()
|
||||
panic("No control for udp tx")
|
||||
panic(fmt.Sprintf("No control for udp tx %s", p.To))
|
||||
}
|
||||
fp := r.unlockedInjectFlow(cm[x], c, p, false)
|
||||
c.InjectUDPPacket(p)
|
||||
|
|
@ -711,30 +721,42 @@ func (r *R) getControl(fromAddr, toAddr netip.AddrPort, p *udp.Packet) *nebula.C
|
|||
}
|
||||
|
||||
func (r *R) formatUdpPacket(p *packet) string {
|
||||
packet := gopacket.NewPacket(p.packet.Data, layers.LayerTypeIPv4, gopacket.Lazy)
|
||||
v4 := packet.Layer(layers.LayerTypeIPv4).(*layers.IPv4)
|
||||
if v4 == nil {
|
||||
panic("not an ipv4 packet")
|
||||
var packet gopacket.Packet
|
||||
var srcAddr netip.Addr
|
||||
|
||||
packet = gopacket.NewPacket(p.packet.Data, layers.LayerTypeIPv6, gopacket.Lazy)
|
||||
if packet.ErrorLayer() == nil {
|
||||
v6 := packet.Layer(layers.LayerTypeIPv6).(*layers.IPv6)
|
||||
if v6 == nil {
|
||||
panic("not an ipv6 packet")
|
||||
}
|
||||
srcAddr, _ = netip.AddrFromSlice(v6.SrcIP)
|
||||
} else {
|
||||
packet = gopacket.NewPacket(p.packet.Data, layers.LayerTypeIPv4, gopacket.Lazy)
|
||||
v6 := packet.Layer(layers.LayerTypeIPv4).(*layers.IPv4)
|
||||
if v6 == nil {
|
||||
panic("not an ipv6 packet")
|
||||
}
|
||||
srcAddr, _ = netip.AddrFromSlice(v6.SrcIP)
|
||||
}
|
||||
|
||||
from := "unknown"
|
||||
srcAddr, _ := netip.AddrFromSlice(v4.SrcIP)
|
||||
if c, ok := r.vpnControls[srcAddr]; ok {
|
||||
from = c.GetUDPAddr().String()
|
||||
}
|
||||
|
||||
udp := packet.Layer(layers.LayerTypeUDP).(*layers.UDP)
|
||||
if udp == nil {
|
||||
udpLayer := packet.Layer(layers.LayerTypeUDP).(*layers.UDP)
|
||||
if udpLayer == nil {
|
||||
panic("not a udp packet")
|
||||
}
|
||||
|
||||
data := packet.ApplicationLayer()
|
||||
return fmt.Sprintf(
|
||||
" %s-->>%s: src port: %v<br/>dest port: %v<br/>data: \"%v\"\n",
|
||||
strings.Replace(from, ":", "-", 1),
|
||||
strings.Replace(p.to.GetUDPAddr().String(), ":", "-", 1),
|
||||
udp.SrcPort,
|
||||
udp.DstPort,
|
||||
normalizeName(from),
|
||||
normalizeName(p.to.GetUDPAddr().String()),
|
||||
udpLayer.SrcPort,
|
||||
udpLayer.DstPort,
|
||||
string(data.Payload()),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue