|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "C" |
| 5 | + "log" |
| 6 | + "net" |
| 7 | + "os" |
| 8 | + "os/signal" |
| 9 | + "time" |
| 10 | + |
| 11 | + "github.com/cilium/ebpf" |
| 12 | + "github.com/cilium/ebpf/link" |
| 13 | + "github.com/cilium/ebpf/rlimit" |
| 14 | +) |
| 15 | + |
| 16 | +func main() { |
| 17 | + // Remove resource limits for kernels <5.11. |
| 18 | + if err := rlimit.RemoveMemlock(); err != nil { |
| 19 | + log.Fatal("Removing memlock:", err) |
| 20 | + } |
| 21 | + |
| 22 | + // Load the compiled eBPF ELF and load it into the kernel. |
| 23 | + var objs packetProtocolObjects |
| 24 | + if err := loadPacketProtocolObjects(&objs, nil); err != nil { |
| 25 | + log.Fatal("Loading eBPF objects:", err) |
| 26 | + } |
| 27 | + defer objs.Close() |
| 28 | + |
| 29 | + ifname := "eno2" // Change this to an interface on your machine. |
| 30 | + iface, err := net.InterfaceByName(ifname) |
| 31 | + if err != nil { |
| 32 | + log.Fatalf("Getting interface %s: %s", ifname, err) |
| 33 | + } |
| 34 | + |
| 35 | + // Attach count_packets to the network interface. |
| 36 | + link, err := link.AttachXDP(link.XDPOptions{ |
| 37 | + Program: objs.GetPacketProtocol, |
| 38 | + Interface: iface.Index, |
| 39 | + }) |
| 40 | + if err != nil { |
| 41 | + log.Fatal("Attaching XDP:", err) |
| 42 | + } |
| 43 | + defer link.Close() |
| 44 | + |
| 45 | + log.Printf("Analysing packets on %s..", ifname) |
| 46 | + |
| 47 | + tick := time.Tick(time.Second) |
| 48 | + stop := make(chan os.Signal, 5) |
| 49 | + signal.Notify(stop, os.Interrupt) |
| 50 | + for { |
| 51 | + select { |
| 52 | + case <-tick: |
| 53 | + // log.Print(objs.ProtocolCount) |
| 54 | + printMap(objs.ProtocolCount) |
| 55 | + if err != nil { |
| 56 | + log.Fatal("Map lookup:", err) |
| 57 | + } |
| 58 | + case <-stop: |
| 59 | + log.Print("Received signal, exiting..") |
| 60 | + return |
| 61 | + } |
| 62 | + } |
| 63 | +} |
| 64 | + |
| 65 | +func printMap(protocol_map *ebpf.Map) { |
| 66 | + |
| 67 | + // Iterate through the map |
| 68 | + var key uint32 |
| 69 | + var value uint64 |
| 70 | + iterator := protocol_map.Iterate() |
| 71 | + for iterator.Next(&key, &value) { |
| 72 | + if value != 0 && key != 0 { |
| 73 | + protocolName := translate(int(key)) |
| 74 | + log.Printf("Key: %d, Protocol Name: %s Value: %d\n", key, protocolName, value) |
| 75 | + } |
| 76 | + } |
| 77 | + if err := iterator.Err(); err != nil { |
| 78 | + log.Fatalf("Error during map iteration: %v", err) |
| 79 | + } |
| 80 | +} |
| 81 | + |
| 82 | +func translate(protocolNumber int) string { |
| 83 | + if name, exists := ProtocolMap[protocolNumber]; exists { |
| 84 | + return name |
| 85 | + } |
| 86 | + return "Unknown" |
| 87 | +} |
| 88 | + |
| 89 | +var ProtocolMap = map[int]string{ |
| 90 | + 0: "HOPOPT", |
| 91 | + 1: "ICMP", |
| 92 | + 2: "IGMP", |
| 93 | + 3: "GGP", |
| 94 | + 4: "IPv4", |
| 95 | + 5: "ST", |
| 96 | + 6: "TCP", |
| 97 | + 7: "CBT", |
| 98 | + 8: "EGP", |
| 99 | + 9: "IGP", |
| 100 | + 10: "BBN-RCC-MON", |
| 101 | + 11: "NVP-II", |
| 102 | + 12: "PUP", |
| 103 | + 13: "ARGUS", |
| 104 | + 14: "EMCON", |
| 105 | + 15: "XNET", |
| 106 | + 16: "CHAOS", |
| 107 | + 17: "UDP", |
| 108 | + 18: "MUX", |
| 109 | + 19: "DCN-MEAS", |
| 110 | + 20: "HMP", |
| 111 | + 21: "PRM", |
| 112 | + 22: "XNS-IDP", |
| 113 | + 23: "TRUNK-1", |
| 114 | + 24: "TRUNK-2", |
| 115 | + 25: "LEAF-1", |
| 116 | + 26: "LEAF-2", |
| 117 | + 27: "RDP", |
| 118 | + 28: "IRTP", |
| 119 | + 29: "ISO-TP4", |
| 120 | + 30: "NETBLT", |
| 121 | + 31: "MFE-NSP", |
| 122 | + 32: "MERIT-INP", |
| 123 | + 33: "DCCP", |
| 124 | + 34: "3PC", |
| 125 | + 35: "IDPR", |
| 126 | + 36: "XTP", |
| 127 | + 37: "DDP", |
| 128 | + 38: "IDPR-CMTP", |
| 129 | + 39: "TP++", |
| 130 | + 40: "IL", |
| 131 | + 41: "IPv6", |
| 132 | + 42: "SDRP", |
| 133 | + 43: "IPv6-Route", |
| 134 | + 44: "IPv6-Frag", |
| 135 | + 45: "IDRP", |
| 136 | + 46: "RSVP", |
| 137 | + 47: "GRE", |
| 138 | + 48: "DSR", |
| 139 | + 49: "BNA", |
| 140 | + 50: "ESP", |
| 141 | + 51: "AH", |
| 142 | + 52: "I-NLSP", |
| 143 | + 53: "SWIPE: (deprecated)", |
| 144 | + 54: "NARP", |
| 145 | + 55: "Min-IPv4", |
| 146 | + 56: "TLSP", |
| 147 | + 57: "SKIP", |
| 148 | + 58: "IPv6-ICMP", |
| 149 | + 59: "IPv6-NoNxt", |
| 150 | + 60: "IPv6-Opts", |
| 151 | + 62: "CFTP", |
| 152 | + 64: "SAT-EXPAK", |
| 153 | + 65: "KRYPTOLAN", |
| 154 | + 66: "RVD", |
| 155 | + 67: "IPPC", |
| 156 | + 69: "SAT-MON", |
| 157 | + 70: "VISA", |
| 158 | + 71: "IPCV", |
| 159 | + 72: "CPNX", |
| 160 | + 73: "CPHB", |
| 161 | + 74: "WSN", |
| 162 | + 75: "PVP", |
| 163 | + 76: "BR-SAT-MON", |
| 164 | + 77: "SUN-ND", |
| 165 | + 78: "WB-MON", |
| 166 | + 79: "WB-EXPAK", |
| 167 | + 80: "ISO-IP", |
| 168 | + 81: "VMTP", |
| 169 | + 82: "SECURE-VMTP", |
| 170 | + 83: "VINES", |
| 171 | + 84: "IPTM", |
| 172 | + 85: "NSFNET-IGP", |
| 173 | + 86: "DGP", |
| 174 | + 87: "TCF", |
| 175 | + 88: "EIGRP", |
| 176 | + 89: "OSPFIGP", |
| 177 | + 90: "Sprite-RPC", |
| 178 | + 91: "LARP", |
| 179 | + 92: "MTP", |
| 180 | + 93: "AX.25", |
| 181 | + 94: "IPIP", |
| 182 | + 95: "MICP", |
| 183 | + 96: "SCC-SP", |
| 184 | + 97: "ETHERIP", |
| 185 | + 98: "ENCAP", |
| 186 | + 100: "GMTP", |
| 187 | + 101: "IFMP", |
| 188 | + 102: "PNNI", |
| 189 | + 103: "PIM", |
| 190 | + 104: "ARIS", |
| 191 | + 105: "SCPS", |
| 192 | + 106: "QNX", |
| 193 | + 107: "A/N", |
| 194 | + 108: "IPComp", |
| 195 | + 109: "SNP", |
| 196 | + 110: "Compaq-Peer", |
| 197 | + 111: "IPX-in-IP", |
| 198 | + 112: "VRRP", |
| 199 | + 113: "PGM", |
| 200 | + 115: "L2TP", |
| 201 | + 116: "DDX", |
| 202 | + 117: "IATP", |
| 203 | + 118: "STP", |
| 204 | + 119: "SRP", |
| 205 | + 120: "UTI", |
| 206 | + 121: "SMP", |
| 207 | + 122: "SM: (deprecated)", |
| 208 | + 123: "PTP", |
| 209 | + 124: "ISIS: over: IPv4", |
| 210 | + 125: "FIRE", |
| 211 | + 126: "CRTP", |
| 212 | + 127: "CRUDP", |
| 213 | + 128: "SSCOPMCE", |
| 214 | + 129: "IPLT", |
| 215 | + 130: "SPS", |
| 216 | + 131: "PIPE", |
| 217 | + 132: "SCTP", |
| 218 | + 133: "FC", |
| 219 | + 134: "RSVP-E2E-IGNORE", |
| 220 | + 135: "Mobility: Header", |
| 221 | + 136: "UDPLite", |
| 222 | + 137: "MPLS-in-IP", |
| 223 | + 138: "manet", |
| 224 | + 139: "HIP", |
| 225 | + 140: "Shim6", |
| 226 | + 141: "WESP", |
| 227 | + 142: "ROHC", |
| 228 | + 143: "Ethernet", |
| 229 | + 144: "AGGFRAG", |
| 230 | + 145: "NSH", |
| 231 | + 255: "Reserved", |
| 232 | +} |
0 commit comments