1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
package main
import (
"encoding/hex"
"fmt"
"log"
"time"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
)
var (
device string = "en0"
snapshot_len int32 = 1024
promiscuous bool = false
err error
timeout time.Duration = 30 * time.Second
handle *pcap.Handle
ethLayer layers.Ethernet
ipLayer layers.IPv4
tcpLayer layers.TCP
udpLayer layers.UDP
tlsLayer layers.TLS
ipv6Layer layers.IPv6
)
func main() {
handle, err = pcap.OpenLive(device, snapshot_len, promiscuous, timeout)
if err != nil {
log.Fatal(err)
}
defer handle.Close()
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
printPacket(packet)
}
}
func printPacket(packet gopacket.Packet) {
parser := gopacket.NewDecodingLayerParser(
layers.LayerTypeEthernet,
ðLayer,
&ipLayer,
&tcpLayer,
&udpLayer,
&tlsLayer,
&ipv6Layer,
&gopacket.Payload{},
)
foundLayerTypes := []gopacket.LayerType{}
err := parser.DecodeLayers(packet.Data(), &foundLayerTypes)
if err != nil {
fmt.Println("Trouble decoding layers: ", err)
}
for _, layerType := range foundLayerTypes {
switch layerType {
case layers.LayerTypeEthernet:
fmt.Println("Ethernet: ", ethLayer.SrcMAC, "->", ethLayer.DstMAC)
case layers.LayerTypeIPv4:
fmt.Println("IPv4: ", ipLayer.SrcIP, "->", ipLayer.DstIP)
case layers.LayerTypeTCP:
fmt.Println("TCP Port: ", tcpLayer.SrcPort, "->", tcpLayer.DstPort)
fmt.Println("TCP SYN:", tcpLayer.SYN, " | ACK:", tcpLayer.ACK)
case layers.LayerTypeUDP:
fmt.Println("UDP Port: ", udpLayer.SrcPort, "->", udpLayer.DstPort)
case layers.LayerTypeTLS:
fmt.Println("TLS Info:", tlsLayer.Handshake)
case layers.LayerTypeIPv6:
fmt.Println("IPv6: ", ipv6Layer.SrcIP, "->", ipv6Layer.DstIP)
}
if appLayer := packet.ApplicationLayer(); appLayer != nil {
payload := appLayer.Payload()
fmt.Println("Payload:", hex.EncodeToString(payload))
}
}
}
|