From 12a828dea2e4ab64915721d2e80404403b5026b6 Mon Sep 17 00:00:00 2001 From: Eugen Biegler Date: Wed, 25 Jul 2018 23:46:42 +0200 Subject: [PATCH 1/4] Use predefined DecodeLayers --- decoder/decoder.go | 347 ++++++++++++++++++++++++--------------------- 1 file changed, 183 insertions(+), 164 deletions(-) diff --git a/decoder/decoder.go b/decoder/decoder.go index 1eb336d..b258634 100644 --- a/decoder/decoder.go +++ b/decoder/decoder.go @@ -5,6 +5,7 @@ import ( "net" "runtime/debug" "strings" + "time" "github.com/coocood/freecache" "github.com/google/gopacket" @@ -21,6 +22,7 @@ type Decoder struct { asm *reassembly.Assembler defrag4 *ip4defrag.IPv4Defragmenter defrag6 *ip6defrag.IPv6Defragmenter + parser *gopacket.DecodingLayerParser layerType gopacket.LayerType nodeID uint32 nodePW []byte @@ -66,7 +68,23 @@ func (c *Context) GetCaptureInfo() gopacket.CaptureInfo { return c.CaptureInfo } +var sll layers.LinuxSLL +var d1q layers.Dot1Q +var gre layers.GRE +var eth layers.Ethernet +var ip4 layers.IPv4 +var ip6 layers.IPv6 +var ip6frag layers.IPv6Fragment +var tcp layers.TCP +var udp layers.UDP +var dns layers.DNS +var payload gopacket.Payload + +var netFlow gopacket.Flow +var decodedLayers = make([]gopacket.LayerType, 0, 12) + var PacketQueue = make(chan *Packet, 20000) + var SIPCache = freecache.NewCache(20 * 1024 * 1024) // 20 MB var SDPCache = freecache.NewCache(30 * 1024 * 1024) // 30 MB var RTCPCache = freecache.NewCache(30 * 1024 * 1024) // 30 MB @@ -82,19 +100,25 @@ func NewDecoder(datalink layers.LinkType) *Decoder { lt = layers.LayerTypeEthernet } - debug.SetGCPercent(50) // TODO: make a flag for this + debug.SetGCPercent(50) + streamFactory := &tcpStreamFactory{} streamPool := reassembly.NewStreamPool(streamFactory) assembler := reassembly.NewAssembler(streamPool) + decoder := gopacket.NewDecodingLayerParser( + lt, &sll, &d1q, &gre, ð, &ip4, &ip6, &tcp, &udp, &dns, &payload, + ) + d := &Decoder{ asm: assembler, + defrag4: ip4defrag.NewIPv4Defragmenter(), + defrag6: ip6defrag.NewIPv6Defragmenter(), + parser: decoder, nodeID: uint32(config.Cfg.HepNodeID), nodePW: []byte(config.Cfg.HepNodePW), layerType: lt, - defrag4: ip4defrag.NewIPv4Defragmenter(), - defrag6: ip6defrag.NewIPv6Defragmenter(), filter: strings.Split(strings.ToUpper(config.Cfg.DiscardMethod), ","), } @@ -103,6 +127,14 @@ func NewDecoder(datalink layers.LinkType) *Decoder { return d } +func (d *Decoder) defragIP4(i4 layers.IPv4, t time.Time) (*layers.IPv4, error) { + return d.defrag4.DefragIPv4WithTimestamp(&i4, t) +} + +func (d *Decoder) defragIP6(i6 layers.IPv6, i6frag layers.IPv6Fragment, t time.Time) (*layers.IPv6, error) { + return d.defrag6.DefragIPv6WithTimestamp(&i6, &i6frag, t) +} + func (d *Decoder) Process(data []byte, ci *gopacket.CaptureInfo) { pkt := &Packet{ NodeID: d.nodeID, @@ -136,195 +168,185 @@ func (d *Decoder) Process(data []byte, ci *gopacket.CaptureInfo) { } } - packet := gopacket.NewPacket(data, d.layerType, gopacket.DecodeOptions{Lazy: true, NoCopy: true}) - logp.Debug("layer", "\n%v", packet) - logp.Debug("payload", "\n%s", packet.Data()) - - if greLayer := packet.Layer(layers.LayerTypeGRE); greLayer != nil { - gre, ok := greLayer.(*layers.GRE) - if !ok { - return - } - - if config.Cfg.Iface.WithErspan { - packet = gopacket.NewPacket(gre.Payload[8:], d.layerType, gopacket.DecodeOptions{Lazy: true, NoCopy: true}) - } else { - packet = gopacket.NewPacket(gre.Payload, d.layerType, gopacket.DecodeOptions{Lazy: true, NoCopy: true}) - } - logp.Debug("layer", "\nlayer inside GRE\n%v", packet) - } - - if dot1qLayer := packet.Layer(layers.LayerTypeDot1Q); dot1qLayer != nil { - dot1q, ok := dot1qLayer.(*layers.Dot1Q) - if !ok { - return - } - pkt.Vlan = dot1q.VLANIdentifier - } - - if ipv4Layer := packet.Layer(layers.LayerTypeIPv4); ipv4Layer != nil { - ip4, ok := ipv4Layer.(*layers.IPv4) - if !ok { - return - } - - ip4Len := ip4.Length - pkt.Version = 0x02 - pkt.Protocol = uint8(ip4.Protocol) - pkt.SrcIP = ip4.SrcIP - pkt.DstIP = ip4.DstIP - d.ip4Count++ - - ip4New, err := d.defrag4.DefragIPv4WithTimestamp(ip4, ci.Timestamp) - if err != nil { - logp.Warn("%v, srcIP: %s, dstIP: %s\n\n", err, pkt.SrcIP.String(), pkt.DstIP.String()) - return - } else if ip4New == nil { - d.fragCount++ - return - } - - if ip4New.Length != ip4Len { - logp.Debug("fragment", "Fragmented packet layers:\n%v\nFragmented packet payload:\n%v\nRe-assembled packet payload:\n%v\nRe-assembled packet length:\n%v\n\n", - packet, string(packet.ApplicationLayer().Payload()), string(ip4New.Payload[8:]), ip4New.Length, - ) - - pkt.Version = 0x02 - pkt.Protocol = uint8(ip4New.Protocol) - pkt.SrcIP = ip4New.SrcIP - pkt.DstIP = ip4New.DstIP + d.parser.DecodeLayers(data, &decodedLayers) + logp.Debug("layer", "\n%v", decodedLayers) + foundIPLayer := false + foundGRELayer := false + + for i := 0; i < len(decodedLayers); i++ { + switch decodedLayers[i] { + case layers.LayerTypeDot1Q: + pkt.Vlan = d1q.VLANIdentifier + + case layers.LayerTypeGRE: + if config.Cfg.Iface.WithErspan { + d.parser.DecodeLayers(gre.Payload[8:], &decodedLayers) + if !foundGRELayer { + i = 0 + } + foundGRELayer = true - pb, ok := packet.(gopacket.PacketBuilder) - if !ok { - logp.Err("Not a PacketBuilder") - return + } else { + d.parser.DecodeLayers(gre.Payload, &decodedLayers) + if !foundGRELayer { + i = 0 + } + foundGRELayer = true } - nextDecoder := ip4New.NextLayerType() - nextDecoder.Decode(ip4New.Payload, pb) - } - } - - if ipv6Layer := packet.Layer(layers.LayerTypeIPv6); ipv6Layer != nil { - ip6, ok := ipv6Layer.(*layers.IPv6) - if !ok { - return - } - ip6Len := ip6.Length - pkt.Version = 0x0a - pkt.Protocol = uint8(ip6.NextHeader) - pkt.SrcIP = ip6.SrcIP - pkt.DstIP = ip6.DstIP - d.ip6Count++ - - if ipv6LayerFragment := packet.Layer(layers.LayerTypeIPv6Fragment); ipv6LayerFragment != nil { - ip6Fragment, ok := ipv6LayerFragment.(*layers.IPv6Fragment) - if !ok { - return - } + case layers.LayerTypeIPv4: + ip4Len := ip4.Length + pkt.Version = 0x02 + pkt.Protocol = uint8(ip4.Protocol) + pkt.SrcIP = ip4.SrcIP + pkt.DstIP = ip4.DstIP + d.ip4Count++ - ip6New, err := d.defrag6.DefragIPv6WithTimestamp(ip6, ip6Fragment, ci.Timestamp) + ip4New, err := d.defragIP4(ip4, ci.Timestamp) if err != nil { logp.Warn("%v, srcIP: %s, dstIP: %s\n\n", err, pkt.SrcIP.String(), pkt.DstIP.String()) return - } else if ip6New == nil { + } else if ip4New == nil { d.fragCount++ return } - if ip6New.Length != ip6Len { - logp.Debug("fragment", "Fragmented packet layers:\n%v\nFragmented packet payload:\n%v\nRe-assembled packet payload:\n%v\nRe-assembled packet length:\n%v\n\n", - packet, string(packet.ApplicationLayer().Payload()), string(ip6New.Payload[8:]), ip6New.Length, + if ip4New.Length != ip4Len { + logp.Debug("fragment", "fragment layer: %v with payload:\n%s\nre-assembled payload:\n%s\nRe-assembled packet length:\n%d\n\n", + decodedLayers, ip4.Payload, ip4New.Payload[8:], ip4New.Length, ) - pkt.Version = 0x0a - pkt.Protocol = uint8(ip6New.NextHeader) - pkt.SrcIP = ip6New.SrcIP - pkt.DstIP = ip6New.DstIP - - pb, ok := packet.(gopacket.PacketBuilder) - if !ok { - logp.Err("Not a PacketBuilder") + pkt.Version = 0x02 + pkt.Protocol = uint8(ip4New.Protocol) + pkt.SrcIP = ip4New.SrcIP + pkt.DstIP = ip4New.DstIP + + if ip4New.Protocol == layers.IPProtocolUDP { + nextUDP := gopacket.NewDecodingLayerParser(layers.LayerTypeUDP, &udp) + nextUDP.DecodeLayers(ip4New.Payload, &decodedLayers) + } else if ip4New.Protocol == layers.IPProtocolTCP { + nextTCP := gopacket.NewDecodingLayerParser(layers.LayerTypeTCP, &tcp) + nextTCP.DecodeLayers(ip4New.Payload, &decodedLayers) + } else { + // Protocol not supported return } - nextDecoder := ip6New.NextLayerType() - nextDecoder.Decode(ip6New.Payload, pb) } - } - } + netFlow = ip4.NetworkFlow() + foundIPLayer = true + + case layers.LayerTypeIPv6: + ip6Len := ip6.Length + pkt.Version = 0x0a + pkt.Protocol = uint8(ip6.NextHeader) + pkt.SrcIP = ip6.SrcIP + pkt.DstIP = ip6.DstIP + d.ip6Count++ + + for _, lt := range decodedLayers { + if lt == layers.LayerTypeIPv6Fragment { + ip6New, err := d.defragIP6(ip6, ip6frag, ci.Timestamp) + if err != nil { + logp.Warn("%v, srcIP: %s, dstIP: %s\n\n", err, pkt.SrcIP.String(), pkt.DstIP.String()) + return + } else if ip6New == nil { + d.fragCount++ + return + } - if udpLayer := packet.Layer(layers.LayerTypeUDP); udpLayer != nil { - udp, ok := udpLayer.(*layers.UDP) - if !ok { - return - } - if len(udp.Payload) < 16 { - logp.Warn("received too small UDP packet with len %d", len(udp.Payload)) - return - } + if ip6New.Length != ip6Len { + logp.Debug("fragment", "fragment layer: %v with payload:\n%s\nre-assembled payload:\n%s\nRe-assembled packet length:\n%d\n\n", + decodedLayers, ip6.Payload, ip6New.Payload[8:], ip6New.Length, + ) + + pkt.Version = 0x0a + pkt.Protocol = uint8(ip6New.NextHeader) + pkt.SrcIP = ip6New.SrcIP + pkt.DstIP = ip6New.DstIP + + if ip6New.NextHeader == layers.IPProtocolUDP { + nextUDP := gopacket.NewDecodingLayerParser(layers.LayerTypeUDP, &udp) + nextUDP.DecodeLayers(ip6New.Payload, &decodedLayers) + } else if ip6New.NextHeader == layers.IPProtocolTCP { + nextTCP := gopacket.NewDecodingLayerParser(layers.LayerTypeTCP, &tcp) + nextTCP.DecodeLayers(ip6New.Payload, &decodedLayers) + } else { + // Protocol not supported + return + } + } + } + } - pkt.SrcPort = uint16(udp.SrcPort) - pkt.DstPort = uint16(udp.DstPort) - pkt.Payload = udp.Payload - d.udpCount++ + netFlow = ip6.NetworkFlow() + foundIPLayer = true - if config.Cfg.Mode == "SIPLOG" { - if udp.DstPort == 514 { - pkt.Payload, pkt.CID, pkt.ProtoType = correlateLOG(udp.Payload) - if pkt.Payload != nil && pkt.CID != nil { - PacketQueue <- pkt - } - return - } else if udp.SrcPort == 2223 || udp.DstPort == 2223 { - pkt.Payload, pkt.CID, pkt.ProtoType = correlateNG(udp.Payload) - if pkt.Payload != nil { - PacketQueue <- pkt - } + case layers.LayerTypeUDP: + logp.Debug("payload", "\n%s", udp.Payload) + if len(udp.Payload) < 16 { + logp.Warn("received too small UDP packet with len %d", len(udp.Payload)) return } - } - if config.Cfg.Mode != "SIP" { - cacheSDPIPPort(udp.Payload) - if (udp.Payload[0]&0xc0)>>6 == 2 { - if (udp.Payload[1] == 200 || udp.Payload[1] == 201 || udp.Payload[1] == 207) && udp.SrcPort%2 != 0 && udp.DstPort%2 != 0 { - pkt.Payload, pkt.CID, pkt.ProtoType = correlateRTCP(pkt.SrcIP, pkt.SrcPort, udp.Payload) - if pkt.Payload != nil { - d.rtcpCount++ + + pkt.SrcPort = uint16(udp.SrcPort) + pkt.DstPort = uint16(udp.DstPort) + pkt.Payload = udp.Payload + d.udpCount++ + + if config.Cfg.Mode == "SIPLOG" { + if udp.DstPort == 514 { + pkt.Payload, pkt.CID, pkt.ProtoType = correlateLOG(udp.Payload) + if pkt.Payload != nil && pkt.CID != nil { PacketQueue <- pkt - return } - d.rtcpFailCount++ return - } else if udp.SrcPort%2 == 0 && udp.DstPort%2 == 0 { - logp.Debug("rtp", "\n%v", protos.NewRTP(udp.Payload)) - pkt.Payload = nil + } else if udp.SrcPort == 2223 || udp.DstPort == 2223 { + pkt.Payload, pkt.CID, pkt.ProtoType = correlateNG(udp.Payload) + if pkt.Payload != nil { + PacketQueue <- pkt + } return } } - } - } else if tcpLayer := packet.Layer(layers.LayerTypeTCP); tcpLayer != nil { - tcp, ok := tcpLayer.(*layers.TCP) - if !ok { + if config.Cfg.Mode != "SIP" { + cacheSDPIPPort(udp.Payload) + if (udp.Payload[0]&0xc0)>>6 == 2 { + if (udp.Payload[1] == 200 || udp.Payload[1] == 201 || udp.Payload[1] == 207) && udp.SrcPort%2 != 0 && udp.DstPort%2 != 0 { + pkt.Payload, pkt.CID, pkt.ProtoType = correlateRTCP(pkt.SrcIP, pkt.SrcPort, udp.Payload) + if pkt.Payload != nil { + d.rtcpCount++ + PacketQueue <- pkt + return + } + d.rtcpFailCount++ + return + } else if udp.SrcPort%2 == 0 && udp.DstPort%2 == 0 { + logp.Debug("rtp", "\n%v", protos.NewRTP(udp.Payload)) + pkt.Payload = nil + return + } + } + } + + case layers.LayerTypeTCP: + logp.Debug("payload", "\n%s", tcp.Payload) + d.tcpCount++ + if foundIPLayer { + c := Context{ + CaptureInfo: *ci, + } + d.asm.AssembleWithContext(netFlow, &tcp, &c) + } return - } - d.tcpCount++ - c := Context{ - CaptureInfo: *ci, - } - d.asm.AssembleWithContext(packet.NetworkLayer().NetworkFlow(), tcp, &c) - return - } - if config.Cfg.Mode == "SIPDNS" { - if dnsLayer := packet.Layer(layers.LayerTypeDNS); dnsLayer != nil { - dns, ok := dnsLayer.(*layers.DNS) - if !ok { + case layers.LayerTypeDNS: + if config.Cfg.Mode == "SIPDNS" { + pkt.ProtoType = 53 + pkt.Payload = protos.ParseDNS(&dns) + d.dnsCount++ + PacketQueue <- pkt return } - - pkt.ProtoType = 53 - pkt.Payload = protos.ParseDNS(dns) - d.dnsCount++ } } @@ -338,8 +360,5 @@ func (d *Decoder) Process(data []byte, ci *gopacket.CaptureInfo) { PacketQueue <- pkt } else { d.unknownCount++ - if err := packet.ErrorLayer(); err != nil { - logp.Err("%v: layer: %v", err, packet) - } } } From 8c395364bed449b48698aae5cb70fda9d26648e3 Mon Sep 17 00:00:00 2001 From: negbie Date: Thu, 26 Jul 2018 18:16:36 +0200 Subject: [PATCH 2/4] Fix fragmented ipv6 --- config/config.go | 1 + decoder/correlator.go | 4 +- decoder/decoder.go | 145 ++++++++++++++++++++-------------------- decoder/tcpassembler.go | 5 +- decoder/util.go | 6 -- main.go | 1 + sniffer/sniffer.go | 10 +-- 7 files changed, 84 insertions(+), 88 deletions(-) diff --git a/config/config.go b/config/config.go index 5bd0fac..6de9c3b 100644 --- a/config/config.go +++ b/config/config.go @@ -21,6 +21,7 @@ type Config struct { HepNodeID uint Network string Protobuf bool + Reassembly bool } type InterfacesConfig struct { diff --git a/decoder/correlator.go b/decoder/correlator.go index 2280ab2..795946b 100644 --- a/decoder/correlator.go +++ b/decoder/correlator.go @@ -10,6 +10,8 @@ import ( "github.com/negbie/logp" ) +var ipPort bytes.Buffer + // cacheSDPIPPort will extract the source IP, source Port from SDP body and CallID from SIP header. // It will do this only for SIP messages which have the strings "c=IN IP4 " and "m=audio " in the SDP body. // If there is one rtcp attribute in the SDP body it will use it as RTCP port. Otherwise it will add 1 to @@ -17,7 +19,7 @@ import ( func cacheSDPIPPort(payload []byte) { if posSDPIP := bytes.Index(payload, []byte("c=IN IP")); posSDPIP > 0 { if posSDPPort := bytes.Index(payload, []byte("m=audio ")); posSDPPort > 0 { - var ipPort bytes.Buffer + ipPort.Reset() restIP := payload[posSDPIP:] // Minimum IPv4 length of "c=IN IP4 1.1.1.1" = 16 if posRestIP := bytes.Index(restIP, []byte("\r\n")); posRestIP >= 16 { diff --git a/decoder/decoder.go b/decoder/decoder.go index b258634..42ebdc0 100644 --- a/decoder/decoder.go +++ b/decoder/decoder.go @@ -74,14 +74,20 @@ var gre layers.GRE var eth layers.Ethernet var ip4 layers.IPv4 var ip6 layers.IPv6 -var ip6frag layers.IPv6Fragment var tcp layers.TCP var udp layers.UDP var dns layers.DNS var payload gopacket.Payload -var netFlow gopacket.Flow var decodedLayers = make([]gopacket.LayerType, 0, 12) +var parserOnlyUDP = gopacket.NewDecodingLayerParser( + layers.LayerTypeUDP, + &udp, +) +var parserOnlyTCP = gopacket.NewDecodingLayerParser( + layers.LayerTypeTCP, + &tcp, +) var PacketQueue = make(chan *Packet, 20000) @@ -136,13 +142,6 @@ func (d *Decoder) defragIP6(i6 layers.IPv6, i6frag layers.IPv6Fragment, t time.T } func (d *Decoder) Process(data []byte, ci *gopacket.CaptureInfo) { - pkt := &Packet{ - NodeID: d.nodeID, - NodePW: d.nodePW, - Tsec: uint32(ci.Timestamp.Unix()), - Tmsec: uint32(ci.Timestamp.Nanosecond() / 1000), - } - if config.Cfg.Dedup { if len(data) > 384 { _, err := SIPCache.Get(data[42:]) @@ -170,22 +169,19 @@ func (d *Decoder) Process(data []byte, ci *gopacket.CaptureInfo) { d.parser.DecodeLayers(data, &decodedLayers) logp.Debug("layer", "\n%v", decodedLayers) - foundIPLayer := false foundGRELayer := false for i := 0; i < len(decodedLayers); i++ { switch decodedLayers[i] { - case layers.LayerTypeDot1Q: - pkt.Vlan = d1q.VLANIdentifier - case layers.LayerTypeGRE: if config.Cfg.Iface.WithErspan { - d.parser.DecodeLayers(gre.Payload[8:], &decodedLayers) - if !foundGRELayer { - i = 0 + if len(gre.Payload) > 8 { + d.parser.DecodeLayers(gre.Payload[8:], &decodedLayers) + if !foundGRELayer { + i = 0 + } + foundGRELayer = true } - foundGRELayer = true - } else { d.parser.DecodeLayers(gre.Payload, &decodedLayers) if !foundGRELayer { @@ -196,91 +192,86 @@ func (d *Decoder) Process(data []byte, ci *gopacket.CaptureInfo) { case layers.LayerTypeIPv4: ip4Len := ip4.Length - pkt.Version = 0x02 - pkt.Protocol = uint8(ip4.Protocol) - pkt.SrcIP = ip4.SrcIP - pkt.DstIP = ip4.DstIP d.ip4Count++ ip4New, err := d.defragIP4(ip4, ci.Timestamp) if err != nil { - logp.Warn("%v, srcIP: %s, dstIP: %s\n\n", err, pkt.SrcIP.String(), pkt.DstIP.String()) + logp.Warn("%v, srcIP: %s, dstIP: %s\n\n", err, ip4.SrcIP, ip4.DstIP) return } else if ip4New == nil { d.fragCount++ return } - if ip4New.Length != ip4Len { - logp.Debug("fragment", "fragment layer: %v with payload:\n%s\nre-assembled payload:\n%s\nRe-assembled packet length:\n%d\n\n", - decodedLayers, ip4.Payload, ip4New.Payload[8:], ip4New.Length, + if ip4New.Length == ip4Len { + d.processTransport(&decodedLayers, &udp, &tcp, ip4.NetworkFlow(), ci, 0x02, uint8(ip4.Protocol), ip4.SrcIP, ip4.DstIP) + } else { + logp.Debug("fragment", "%d byte fragment layer: %s with payload:\n%s\n%d byte re-assembled payload:\n%s\n\n", + ip4Len, decodedLayers, ip4.Payload, ip4New.Length, ip4New.Payload, ) - pkt.Version = 0x02 - pkt.Protocol = uint8(ip4New.Protocol) - pkt.SrcIP = ip4New.SrcIP - pkt.DstIP = ip4New.DstIP - if ip4New.Protocol == layers.IPProtocolUDP { - nextUDP := gopacket.NewDecodingLayerParser(layers.LayerTypeUDP, &udp) - nextUDP.DecodeLayers(ip4New.Payload, &decodedLayers) + parserOnlyUDP.DecodeLayers(ip4New.Payload, &decodedLayers) } else if ip4New.Protocol == layers.IPProtocolTCP { - nextTCP := gopacket.NewDecodingLayerParser(layers.LayerTypeTCP, &tcp) - nextTCP.DecodeLayers(ip4New.Payload, &decodedLayers) + parserOnlyTCP.DecodeLayers(ip4New.Payload, &decodedLayers) } else { - // Protocol not supported + logp.Warn("unsupported ipv4fragment layer") return } + d.processTransport(&decodedLayers, &udp, &tcp, ip4New.NetworkFlow(), ci, 0x02, uint8(ip4New.Protocol), ip4New.SrcIP, ip4New.DstIP) } - netFlow = ip4.NetworkFlow() - foundIPLayer = true case layers.LayerTypeIPv6: ip6Len := ip6.Length - pkt.Version = 0x0a - pkt.Protocol = uint8(ip6.NextHeader) - pkt.SrcIP = ip6.SrcIP - pkt.DstIP = ip6.DstIP d.ip6Count++ - for _, lt := range decodedLayers { - if lt == layers.LayerTypeIPv6Fragment { - ip6New, err := d.defragIP6(ip6, ip6frag, ci.Timestamp) + if ip6.NextHeader != layers.IPProtocolIPv6Fragment { + d.processTransport(&decodedLayers, &udp, &tcp, ip6.NetworkFlow(), ci, 0x0a, uint8(ip6.NextHeader), ip6.SrcIP, ip6.DstIP) + } else { + packet := gopacket.NewPacket(data, d.layerType, gopacket.DecodeOptions{Lazy: true, NoCopy: true}) + if ip6frag := packet.Layer(layers.LayerTypeIPv6Fragment).(*layers.IPv6Fragment); ip6frag != nil { + ip6New, err := d.defragIP6(ip6, *ip6frag, ci.Timestamp) if err != nil { - logp.Warn("%v, srcIP: %s, dstIP: %s\n\n", err, pkt.SrcIP.String(), pkt.DstIP.String()) + logp.Warn("%v, srcIP: %s, dstIP: %s\n\n", err, ip6.SrcIP, ip6.DstIP) return } else if ip6New == nil { d.fragCount++ return } - if ip6New.Length != ip6Len { - logp.Debug("fragment", "fragment layer: %v with payload:\n%s\nre-assembled payload:\n%s\nRe-assembled packet length:\n%d\n\n", - decodedLayers, ip6.Payload, ip6New.Payload[8:], ip6New.Length, - ) - - pkt.Version = 0x0a - pkt.Protocol = uint8(ip6New.NextHeader) - pkt.SrcIP = ip6New.SrcIP - pkt.DstIP = ip6New.DstIP - - if ip6New.NextHeader == layers.IPProtocolUDP { - nextUDP := gopacket.NewDecodingLayerParser(layers.LayerTypeUDP, &udp) - nextUDP.DecodeLayers(ip6New.Payload, &decodedLayers) - } else if ip6New.NextHeader == layers.IPProtocolTCP { - nextTCP := gopacket.NewDecodingLayerParser(layers.LayerTypeTCP, &tcp) - nextTCP.DecodeLayers(ip6New.Payload, &decodedLayers) - } else { - // Protocol not supported - return - } + logp.Debug("fragment", "%d byte fragment layer: %s with payload:\n%s\n%d byte re-assembled payload:\n%s\n\n", + ip6Len, decodedLayers, ip6.Payload, ip6New.Length, ip6New.Payload, + ) + + if ip6New.NextHeader == layers.IPProtocolUDP { + parserOnlyUDP.DecodeLayers(ip6New.Payload, &decodedLayers) + } else if ip6New.NextHeader == layers.IPProtocolTCP { + parserOnlyTCP.DecodeLayers(ip6New.Payload, &decodedLayers) + } else { + logp.Warn("unsupported ipv6fragment layer") + return } + d.processTransport(&decodedLayers, &udp, &tcp, ip6New.NetworkFlow(), ci, 0x0a, uint8(ip6New.NextHeader), ip6New.SrcIP, ip6New.DstIP) } } + } + } +} - netFlow = ip6.NetworkFlow() - foundIPLayer = true +func (d *Decoder) processTransport(foundLayerTypes *[]gopacket.LayerType, udp *layers.UDP, tcp *layers.TCP, flow gopacket.Flow, ci *gopacket.CaptureInfo, IPVersion, IPProtocol uint8, sIP, dIP net.IP) { + pkt := &Packet{ + Version: IPVersion, + Protocol: IPProtocol, + SrcIP: sIP, + DstIP: dIP, + NodeID: d.nodeID, + NodePW: d.nodePW, + Tsec: uint32(ci.Timestamp.Unix()), + Tmsec: uint32(ci.Timestamp.Nanosecond() / 1000), + } + for _, layerType := range *foundLayerTypes { + switch layerType { case layers.LayerTypeUDP: logp.Debug("payload", "\n%s", udp.Payload) if len(udp.Payload) < 16 { @@ -330,14 +321,22 @@ func (d *Decoder) Process(data []byte, ci *gopacket.CaptureInfo) { case layers.LayerTypeTCP: logp.Debug("payload", "\n%s", tcp.Payload) + pkt.SrcPort = uint16(tcp.SrcPort) + pkt.DstPort = uint16(tcp.DstPort) + pkt.Payload = tcp.Payload d.tcpCount++ - if foundIPLayer { - c := Context{ - CaptureInfo: *ci, + + if config.Cfg.Reassembly { + d.asm.AssembleWithContext(flow, tcp, &Context{CaptureInfo: *ci}) + flushOptions := reassembly.FlushOptions{ + T: ci.Timestamp.Add(-2 * time.Second), + TC: ci.Timestamp.Add(-1 * time.Second), + } + if d.tcpCount%128 == 0 { + d.asm.FlushWithOptions(flushOptions) } - d.asm.AssembleWithContext(netFlow, &tcp, &c) + return } - return case layers.LayerTypeDNS: if config.Cfg.Mode == "SIPDNS" { diff --git a/decoder/tcpassembler.go b/decoder/tcpassembler.go index 36893ee..d9bde8d 100644 --- a/decoder/tcpassembler.go +++ b/decoder/tcpassembler.go @@ -132,14 +132,13 @@ func (t *tcpStream) ReassembledSG(sg reassembly.ScatterGather, ac reassembly.Ass PacketQueue <- pkt } return - } else if config.Cfg.Mode != "SIP" { - cacheSDPIPPort(pkt.Payload) } if bytes.Contains(pkt.Payload, []byte("CSeq")) { pkt.ProtoType = 1 + PacketQueue <- pkt + cacheSDPIPPort(pkt.Payload) } - PacketQueue <- pkt } else { if length != 0 { logp.Warn("received TCP packet with unusual length %d", length) diff --git a/decoder/util.go b/decoder/util.go index 9fa4bd6..f75982e 100644 --- a/decoder/util.go +++ b/decoder/util.go @@ -10,7 +10,6 @@ import ( "strconv" "time" - "github.com/google/gopacket/reassembly" "github.com/negbie/logp" ) @@ -52,14 +51,9 @@ func isPrivIP(IP net.IP) (p bool) { } func (d *Decoder) flushFragments() { - aTick := time.Tick(1 * time.Second) dTick := time.Tick(1 * time.Minute) for { select { - case <-aTick: - d.asm.FlushWithOptions(reassembly.FlushOptions{ - T: time.Now().Add(-1 * time.Minute), TC: time.Now().Add(-1 * time.Hour), - }) case <-dTick: d.defrag4.DiscardOlderThan(time.Now().Add(-1 * time.Minute)) d.defrag6.DiscardOlderThan(time.Now().Add(-1 * time.Minute)) diff --git a/main.go b/main.go index 35e1b5d..8ae15fa 100644 --- a/main.go +++ b/main.go @@ -62,6 +62,7 @@ func init() { flag.UintVar(&config.Cfg.HepNodeID, "hi", 2002, "HEP node ID") flag.StringVar(&config.Cfg.Network, "nt", "udp", "Network types are [udp, tcp, tls]") flag.BoolVar(&config.Cfg.Protobuf, "protobuf", false, "Use Protobuf on wire") + flag.BoolVar(&config.Cfg.Reassembly, "tcpassembly", false, "If true, tcp assembly will be enabled") flag.Parse() config.Cfg.Iface = &ifaceConfig diff --git a/sniffer/sniffer.go b/sniffer/sniffer.go index 2965b12..24701ca 100644 --- a/sniffer/sniffer.go +++ b/sniffer/sniffer.go @@ -90,16 +90,16 @@ func (sniffer *SnifferSetup) setFromConfig() error { switch sniffer.mode { case "SIP": - sniffer.bpf = "tcp and greater 42 and portrange " + sniffer.config.PortRange + " or (udp and greater 128 and portrange " + sniffer.config.PortRange + " or ip[6:2] & 0x1fff != 0)" + sniffer.bpf = "tcp and greater 42 and portrange " + sniffer.config.PortRange + " or (udp and greater 128 and portrange " + sniffer.config.PortRange + " or ip[6:2] & 0x1fff != 0 or ip6[6]=44)" case "SIPDNS": - sniffer.bpf = "tcp and greater 42 and portrange " + sniffer.config.PortRange + " or (udp and greater 128 and portrange " + sniffer.config.PortRange + " or ip[6:2] & 0x1fff != 0) or (ip and ip[6] & 0x2 = 0 and ip[6:2] & 0x1fff = 0 and udp and udp[8] & 0xc0 = 0x80 and udp[9] >= 0xc8 && udp[9] <= 0xcc) or (greater 32 and ip and dst port 53)" + sniffer.bpf = "tcp and greater 42 and portrange " + sniffer.config.PortRange + " or (udp and greater 128 and portrange " + sniffer.config.PortRange + " or ip[6:2] & 0x1fff != 0 or ip6[6]=44) or (ip and ip[6] & 0x2 = 0 and ip[6:2] & 0x1fff = 0 and udp and udp[8] & 0xc0 = 0x80 and udp[9] >= 0xc8 && udp[9] <= 0xcc) or (greater 32 and ip and dst port 53)" case "SIPLOG": - sniffer.bpf = "tcp and greater 42 and portrange " + sniffer.config.PortRange + " or (udp and greater 128 and portrange " + sniffer.config.PortRange + " or ip[6:2] & 0x1fff != 0) or (ip and ip[6] & 0x2 = 0 and ip[6:2] & 0x1fff = 0 and udp and udp[8] & 0xc0 = 0x80 and udp[9] >= 0xc8 && udp[9] <= 0xcc) or (greater 128 and (dst port 514 or port 2223))" + sniffer.bpf = "tcp and greater 42 and portrange " + sniffer.config.PortRange + " or (udp and greater 128 and portrange " + sniffer.config.PortRange + " or ip[6:2] & 0x1fff != 0 or ip6[6]=44) or (ip and ip[6] & 0x2 = 0 and ip[6:2] & 0x1fff = 0 and udp and udp[8] & 0xc0 = 0x80 and udp[9] >= 0xc8 && udp[9] <= 0xcc) or (greater 128 and (dst port 514 or port 2223))" case "SIPRTP": - sniffer.bpf = "tcp and greater 42 and portrange " + sniffer.config.PortRange + " or (udp and greater 128 and portrange " + sniffer.config.PortRange + " or ip[6:2] & 0x1fff != 0) or (ip and ip[6] & 0x2 = 0 and ip[6:2] & 0x1fff = 0 and udp and udp[8] & 0xc0 = 0x80)" + sniffer.bpf = "tcp and greater 42 and portrange " + sniffer.config.PortRange + " or (udp and greater 128 and portrange " + sniffer.config.PortRange + " or ip[6:2] & 0x1fff != 0 or ip6[6]=44) or (ip and ip[6] & 0x2 = 0 and ip[6:2] & 0x1fff = 0 and udp and udp[8] & 0xc0 = 0x80)" default: sniffer.mode = "SIPRTCP" - sniffer.bpf = "tcp and greater 42 and portrange " + sniffer.config.PortRange + " or (udp and greater 128 and portrange " + sniffer.config.PortRange + " or ip[6:2] & 0x1fff != 0) or (ip and ip[6] & 0x2 = 0 and ip[6:2] & 0x1fff = 0 and udp and udp[8] & 0xc0 = 0x80 and udp[9] >= 0xc8 && udp[9] <= 0xcc)" + sniffer.bpf = "tcp and greater 42 and portrange " + sniffer.config.PortRange + " or (udp and greater 128 and portrange " + sniffer.config.PortRange + " or ip[6:2] & 0x1fff != 0 or ip6[6]=44) or (ip and ip[6] & 0x2 = 0 and ip[6:2] & 0x1fff = 0 and udp and udp[8] & 0xc0 = 0x80 and udp[9] >= 0xc8 && udp[9] <= 0xcc)" } if sniffer.config.WithErspan { From ecde733dae3e079d53cc3502931818209b7bd31b Mon Sep 17 00:00:00 2001 From: negbie Date: Fri, 27 Jul 2018 16:05:41 +0200 Subject: [PATCH 3/4] Move pcaps, add back VLANIdentifier --- decoder/decoder.go | 17 +++++++++++------ example/pcap/erspan_sip_ipv4_udp.pcapng | Bin 0 -> 113312 bytes .../ipv6_udp_fragmented.pcap} | Bin .../rtp_rtcp_sip_ipv4_udp.pcap} | Bin example/{ => pcap}/sip_ipv4_tcp.pcap | Bin example/pcap/sip_ipv4_tcp_retrans.pcap | Bin 0 -> 46979 bytes example/{ => pcap}/sip_ipv6_udp.pcap | Bin 7 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 example/pcap/erspan_sip_ipv4_udp.pcapng rename example/{ipv6-udp-fragmented.pcap => pcap/ipv6_udp_fragmented.pcap} (100%) rename example/{rtp_rtcp_sip.pcap => pcap/rtp_rtcp_sip_ipv4_udp.pcap} (100%) rename example/{ => pcap}/sip_ipv4_tcp.pcap (100%) create mode 100644 example/pcap/sip_ipv4_tcp_retrans.pcap rename example/{ => pcap}/sip_ipv6_udp.pcap (100%) diff --git a/decoder/decoder.go b/decoder/decoder.go index 42ebdc0..f14ff96 100644 --- a/decoder/decoder.go +++ b/decoder/decoder.go @@ -144,12 +144,12 @@ func (d *Decoder) defragIP6(i6 layers.IPv6, i6frag layers.IPv6Fragment, t time.T func (d *Decoder) Process(data []byte, ci *gopacket.CaptureInfo) { if config.Cfg.Dedup { if len(data) > 384 { - _, err := SIPCache.Get(data[42:]) + _, err := SIPCache.Get(data[34:]) if err == nil { d.dupCount++ return } - err = SIPCache.Set(data[42:], nil, 1) + err = SIPCache.Set(data[34:], nil, 1) if err != nil { logp.Warn("%v", err) } @@ -272,10 +272,12 @@ func (d *Decoder) processTransport(foundLayerTypes *[]gopacket.LayerType, udp *l for _, layerType := range *foundLayerTypes { switch layerType { + case layers.LayerTypeDot1Q: + pkt.Vlan = d1q.VLANIdentifier + case layers.LayerTypeUDP: - logp.Debug("payload", "\n%s", udp.Payload) if len(udp.Payload) < 16 { - logp.Warn("received too small UDP packet with len %d", len(udp.Payload)) + logp.Warn("received too small %d byte UDP packet with payload %s", len(udp.Payload), udp.Payload) return } @@ -283,6 +285,7 @@ func (d *Decoder) processTransport(foundLayerTypes *[]gopacket.LayerType, udp *l pkt.DstPort = uint16(udp.DstPort) pkt.Payload = udp.Payload d.udpCount++ + logp.Debug("payload", "UDP:\n%s", pkt) if config.Cfg.Mode == "SIPLOG" { if udp.DstPort == 514 { @@ -312,7 +315,9 @@ func (d *Decoder) processTransport(foundLayerTypes *[]gopacket.LayerType, udp *l d.rtcpFailCount++ return } else if udp.SrcPort%2 == 0 && udp.DstPort%2 == 0 { - logp.Debug("rtp", "\n%v", protos.NewRTP(udp.Payload)) + if config.Cfg.Mode == "SIPRTP" { + logp.Debug("rtp", "\n%v", protos.NewRTP(udp.Payload)) + } pkt.Payload = nil return } @@ -320,11 +325,11 @@ func (d *Decoder) processTransport(foundLayerTypes *[]gopacket.LayerType, udp *l } case layers.LayerTypeTCP: - logp.Debug("payload", "\n%s", tcp.Payload) pkt.SrcPort = uint16(tcp.SrcPort) pkt.DstPort = uint16(tcp.DstPort) pkt.Payload = tcp.Payload d.tcpCount++ + logp.Debug("payload", "TCP:\n%s", pkt) if config.Cfg.Reassembly { d.asm.AssembleWithContext(flow, tcp, &Context{CaptureInfo: *ci}) diff --git a/example/pcap/erspan_sip_ipv4_udp.pcapng b/example/pcap/erspan_sip_ipv4_udp.pcapng new file mode 100644 index 0000000000000000000000000000000000000000..9e08783bdb0832adcd213c34cf2a261dbf89d416 GIT binary patch literal 113312 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 NEU*u-A?(NN{{Z^mOfmof literal 0 HcmV?d00001 diff --git a/example/sip_ipv6_udp.pcap b/example/pcap/sip_ipv6_udp.pcap similarity index 100% rename from example/sip_ipv6_udp.pcap rename to example/pcap/sip_ipv6_udp.pcap From 9743d9fdad4f01bb942a366df9c2adc54486b7c1 Mon Sep 17 00:00:00 2001 From: Eugen Biegler Date: Sat, 28 Jul 2018 21:32:00 +0200 Subject: [PATCH 4/4] Reduce tcpassembly code Todo check for gaps --- decoder/decoder.go | 21 +-- decoder/tcpassembler.go | 180 ---------------------- decoder/tcpassembly.go | 106 +++++++++++++ example/pcap/sip_ipv4_tcp_fragmented.pcap | Bin 0 -> 408328 bytes main.go | 2 +- 5 files changed, 115 insertions(+), 194 deletions(-) delete mode 100644 decoder/tcpassembler.go create mode 100644 decoder/tcpassembly.go create mode 100644 example/pcap/sip_ipv4_tcp_fragmented.pcap diff --git a/decoder/decoder.go b/decoder/decoder.go index f14ff96..4891f71 100644 --- a/decoder/decoder.go +++ b/decoder/decoder.go @@ -10,7 +10,7 @@ import ( "github.com/coocood/freecache" "github.com/google/gopacket" "github.com/google/gopacket/layers" - "github.com/google/gopacket/reassembly" + "github.com/google/gopacket/tcpassembly" "github.com/negbie/heplify/config" "github.com/negbie/heplify/ip4defrag" "github.com/negbie/heplify/ip6defrag" @@ -19,7 +19,7 @@ import ( ) type Decoder struct { - asm *reassembly.Assembler + asm *tcpassembly.Assembler defrag4 *ip4defrag.IPv4Defragmenter defrag6 *ip6defrag.IPv6Defragmenter parser *gopacket.DecodingLayerParser @@ -109,9 +109,11 @@ func NewDecoder(datalink layers.LinkType) *Decoder { // TODO: make a flag for this debug.SetGCPercent(50) - streamFactory := &tcpStreamFactory{} - streamPool := reassembly.NewStreamPool(streamFactory) - assembler := reassembly.NewAssembler(streamPool) + streamFactory := &sipStreamFactory{} + streamPool := tcpassembly.NewStreamPool(streamFactory) + assembler := tcpassembly.NewAssembler(streamPool) + assembler.MaxBufferedPagesPerConnection = 1 + assembler.MaxBufferedPagesTotal = 1 decoder := gopacket.NewDecodingLayerParser( lt, &sll, &d1q, &gre, ð, &ip4, &ip6, &tcp, &udp, &dns, &payload, @@ -332,14 +334,7 @@ func (d *Decoder) processTransport(foundLayerTypes *[]gopacket.LayerType, udp *l logp.Debug("payload", "TCP:\n%s", pkt) if config.Cfg.Reassembly { - d.asm.AssembleWithContext(flow, tcp, &Context{CaptureInfo: *ci}) - flushOptions := reassembly.FlushOptions{ - T: ci.Timestamp.Add(-2 * time.Second), - TC: ci.Timestamp.Add(-1 * time.Second), - } - if d.tcpCount%128 == 0 { - d.asm.FlushWithOptions(flushOptions) - } + d.asm.AssembleWithTimestamp(flow, tcp, ci.Timestamp) return } diff --git a/decoder/tcpassembler.go b/decoder/tcpassembler.go deleted file mode 100644 index d9bde8d..0000000 --- a/decoder/tcpassembler.go +++ /dev/null @@ -1,180 +0,0 @@ -package decoder - -import ( - "bufio" - "bytes" - "encoding/binary" - "fmt" - "io" - "time" - - "github.com/google/gopacket" - "github.com/google/gopacket/layers" - "github.com/google/gopacket/reassembly" - "github.com/negbie/heplify/config" - "github.com/negbie/logp" -) - -type tcpStreamFactory struct{} -type tcpStream struct { - tcpstate *reassembly.TCPSimpleFSM - fsmerr bool - optchecker reassembly.TCPOptionCheck - net, transport gopacket.Flow - isLog bool - ident string -} - -func (factory *tcpStreamFactory) New(net, transport gopacket.Flow, tcp *layers.TCP, ac reassembly.AssemblerContext) reassembly.Stream { - logp.Debug("reassembly", "new stream %s %s\n", net, transport) - fsmOptions := reassembly.TCPSimpleFSMOptions{ - SupportMissingEstablishment: true, - } - stream := &tcpStream{ - net: net, - transport: transport, - isLog: tcp.SrcPort == 514 || tcp.DstPort == 514, - tcpstate: reassembly.NewTCPSimpleFSM(fsmOptions), - optchecker: reassembly.NewTCPOptionCheck(), - ident: fmt.Sprintf("%s:%s", net, transport), - } - return stream -} - -func (t *tcpStream) Accept(tcp *layers.TCP, ci gopacket.CaptureInfo, dir reassembly.TCPFlowDirection, acked reassembly.Sequence, start *bool, ac reassembly.AssemblerContext) bool { - // FSM - if !t.tcpstate.CheckState(tcp, dir) { - logp.Err("%s: packet rejected by FSM (state:%s)\n", t.ident, t.tcpstate.String()) - if !t.fsmerr { - t.fsmerr = true - } - // TODO: make a flag for this - if false { - return false - } - } - // Options - err := t.optchecker.Accept(tcp, ci, dir, acked, start) - if err != nil { - logp.Err("%s: packet rejected by OptionChecker: %s\n", t.ident, err) - // TODO: make a flag for this - if false { - return false - } - } - return true -} - -func (t *tcpStream) ReassembledSG(sg reassembly.ScatterGather, ac reassembly.AssemblerContext) { - var ts time.Time - if ac != nil { - ts = ac.GetCaptureInfo().Timestamp - } else { - ts = time.Now() - } - dir, start, end, skip := sg.Info() - length, saved := sg.Lengths() - // update stats - sgStats := sg.Stats() - - if sgStats.OverlapBytes != 0 && sgStats.OverlapPackets == 0 { - logp.Err("invalid overlap bytes:%d, pkts:%d\n", sgStats.OverlapBytes, sgStats.OverlapPackets) - //panic("Invalid overlap") - return - } - - if skip == -1 { - // this is allowed - } else if skip != 0 { - // Missing bytes in stream: do not even try to parse it - return - } - if len(t.transport.Src().Raw()) < 2 || len(t.transport.Dst().Raw()) < 2 { - logp.Err("port length must be 2 byte long") - return - } - - pkt := &Packet{} - pkt.Version = 0x02 - pkt.Protocol = 0x06 - - var ident string - if dir == reassembly.TCPDirClientToServer { - ident = fmt.Sprintf("%v %v(%s): ", t.net, t.transport, dir) - pkt.SrcIP = t.net.Src().Raw() - pkt.DstIP = t.net.Dst().Raw() - pkt.SrcPort = binary.BigEndian.Uint16(t.transport.Src().Raw()) - pkt.DstPort = binary.BigEndian.Uint16(t.transport.Dst().Raw()) - } else { - ident = fmt.Sprintf("%v %v(%s): ", t.net.Reverse(), t.transport.Reverse(), dir) - pkt.SrcIP = t.net.Reverse().Src().Raw() - pkt.DstIP = t.net.Reverse().Dst().Raw() - pkt.SrcPort = binary.BigEndian.Uint16(t.transport.Reverse().Src().Raw()) - pkt.DstPort = binary.BigEndian.Uint16(t.transport.Reverse().Dst().Raw()) - } - - if len(pkt.SrcIP) > 4 || len(pkt.DstIP) > 4 { - pkt.Version = 0x0a - } - pkt.Tsec = uint32(ts.Unix()) - pkt.Tmsec = uint32(ts.Nanosecond() / 1000) - pkt.NodeID = uint32(config.Cfg.HepNodeID) - pkt.NodePW = []byte(config.Cfg.HepNodePW) - pkt.Payload = sg.Fetch(length) - - logp.Debug("reassembly", "%s: SG reassembled packet with %d bytes (start:%v,end:%v,skip:%d,saved:%d,nb:%d,%d,overlap:%d,%d)\n%s", - ident, length, start, end, skip, saved, sgStats.Packets, sgStats.Chunks, sgStats.OverlapBytes, sgStats.OverlapPackets, pkt.Payload) - - if length >= 16 && length <= 8192 { - if config.Cfg.Mode == "SIPLOG" && t.isLog { - pkt.Payload, pkt.CID, pkt.ProtoType = correlateLOG(pkt.Payload) - if pkt.Payload != nil && pkt.CID != nil { - PacketQueue <- pkt - } - return - } - - if bytes.Contains(pkt.Payload, []byte("CSeq")) { - pkt.ProtoType = 1 - PacketQueue <- pkt - cacheSDPIPPort(pkt.Payload) - } - } else { - if length != 0 { - logp.Warn("received TCP packet with unusual length %d", length) - } - } -} - -func (t *tcpStream) ReassemblyComplete(ac reassembly.AssemblerContext) bool { - logp.Debug("reassembly", "%s: Connection closed\n", t.ident) - // do not remove the connection to allow last ACK - return true -} - -/* func (t *tcpStream) run() { - splitPackets(t.net, t.transport, &t.reader) - io.Copy(ioutil.Discard, &t.reader) -} */ - -func splitPackets(netFlow, transFlow gopacket.Flow, r io.Reader) { - scanner := bufio.NewScanner(r) - scanner.Split(scanCRLFCRLF) - logp.Info("%v %v", netFlow, transFlow) - for scanner.Scan() { - logp.Info("%s", scanner.Text()) - } -} - -func scanCRLFCRLF(data []byte, atEOF bool) (advance int, token []byte, err error) { - if atEOF && len(data) == 0 { - return 0, nil, nil - } - if i := bytes.Index(data, []byte{'\r', '\n', '\r', '\n'}); i >= 0 { - return i + 4, data[0:i], nil - } - if atEOF { - return len(data), data, nil - } - return 0, nil, nil -} diff --git a/decoder/tcpassembly.go b/decoder/tcpassembly.go new file mode 100644 index 0000000..12f1d8f --- /dev/null +++ b/decoder/tcpassembly.go @@ -0,0 +1,106 @@ +package decoder + +import ( + "bufio" + "bytes" + "encoding/binary" + "io" + "io/ioutil" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/tcpassembly" + "github.com/google/gopacket/tcpassembly/tcpreader" + "github.com/negbie/heplify/config" + "github.com/negbie/logp" +) + +type sipStreamFactory struct{} + +type sipStream struct { + net, transport gopacket.Flow + reader tcpreader.ReaderStream +} + +func (s *sipStreamFactory) New(net, transport gopacket.Flow) tcpassembly.Stream { + st := &sipStream{ + net: net, + transport: transport, + reader: tcpreader.NewReaderStream(), + } + go st.run() + return &st.reader +} + +func (s *sipStream) run() { + splitPackets(s.net, s.transport, &s.reader) + io.Copy(ioutil.Discard, &s.reader) +} + +func splitPackets(netFlow, transFlow gopacket.Flow, r io.Reader) { + scanner := bufio.NewScanner(r) + scanner.Split(scanSIP) + for scanner.Scan() { + ts := time.Now() + pkt := &Packet{} + pkt.Version = 0x02 + pkt.Protocol = 0x06 + pkt.SrcIP = netFlow.Src().Raw() + pkt.DstIP = netFlow.Dst().Raw() + sp := transFlow.Src().Raw() + dp := transFlow.Dst().Raw() + if len(sp) == 2 && len(dp) == 2 { + pkt.SrcPort = binary.BigEndian.Uint16(sp) + pkt.DstPort = binary.BigEndian.Uint16(dp) + } + if len(pkt.SrcIP) > 4 || len(pkt.DstIP) > 4 { + pkt.Version = 0x0a + } + pkt.Tsec = uint32(ts.Unix()) + pkt.Tmsec = uint32(ts.Nanosecond() / 1000) + pkt.NodeID = uint32(config.Cfg.HepNodeID) + pkt.NodePW = []byte(config.Cfg.HepNodePW) + pkt.Payload = scanner.Bytes() + if bytes.Contains(pkt.Payload, []byte("CSeq")) { + pkt.ProtoType = 1 + PacketQueue <- pkt + cacheSDPIPPort(pkt.Payload) + } + logp.Debug("tcpassembly", "%s", pkt) + } +} + +func scanSIP(data []byte, atEOF bool) (advance int, token []byte, err error) { + if atEOF && len(data) == 0 { + return 0, nil, nil + } + + for k := range startSIP { + if bytes.HasPrefix(data, startSIP[k]) && bytes.HasSuffix(data, []byte("\r\n")) || bytes.HasSuffix(data, []byte("\r\n\r\n")) { + return len(data), data, nil + } + } + + if atEOF { + return len(data), data, nil + } + return 0, nil, nil +} + +var startSIP = [][]byte{ + []byte("INVITE "), + []byte("REGISTER "), + []byte("ACK "), + []byte("BYE "), + []byte("CANCEL "), + []byte("OPTIONS "), + []byte("INFO "), + []byte("PRACK "), + []byte("SUBSCRIBE "), + []byte("NOTIFY "), + []byte("UPDATE "), + []byte("MESSAGE "), + []byte("REFER "), + []byte("PUBLISH "), + []byte("SIP/"), +} diff --git a/example/pcap/sip_ipv4_tcp_fragmented.pcap b/example/pcap/sip_ipv4_tcp_fragmented.pcap new file mode 100644 index 0000000000000000000000000000000000000000..27cc297b053b5fab12103c7da4c8e24cdce54783 GIT binary patch literal 408328 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 literal 0 HcmV?d00001 diff --git a/main.go b/main.go index 8ae15fa..fcae603 100644 --- a/main.go +++ b/main.go @@ -62,7 +62,7 @@ func init() { flag.UintVar(&config.Cfg.HepNodeID, "hi", 2002, "HEP node ID") flag.StringVar(&config.Cfg.Network, "nt", "udp", "Network types are [udp, tcp, tls]") flag.BoolVar(&config.Cfg.Protobuf, "protobuf", false, "Use Protobuf on wire") - flag.BoolVar(&config.Cfg.Reassembly, "tcpassembly", false, "If true, tcp assembly will be enabled") + flag.BoolVar(&config.Cfg.Reassembly, "tcpassembly", false, "If true, tcpassembly will be enabled") flag.Parse() config.Cfg.Iface = &ifaceConfig