Skip to content

Commit

Permalink
extend AS support
Browse files Browse the repository at this point in the history
  • Loading branch information
p- committed Jul 29, 2024
1 parent 9f2cd48 commit cd271f6
Show file tree
Hide file tree
Showing 8 changed files with 111 additions and 474,320 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ bin/**/socket-connect-bpf
bpf_*_bpfeb.go
bpf_*_bpfel.go

ip2asn-v6.tsv
*.tsv
2 changes: 1 addition & 1 deletion as/asnumbersIPv4.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (

var asMap = make(map[uint8][]ASInfo)

// ParseASNumbers parses the autonomous system (AS) Numbers and IP ranges from a .tsv file
// ParseASNumbersIPv4 parses the autonomous system (AS) Numbers and IPv4 ranges from a .tsv file
func ParseASNumbersIPv4(asTsvFile string) {
csvFile, err := os.Open(asTsvFile)

Expand Down
74 changes: 74 additions & 0 deletions as/asnumbersIPv6.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package as

import (
"bufio"
"bytes"
"fmt"
"net"
"os"
"strconv"
"strings"
)

var asList []ASInfoIPv6

// ParseASNumbersIPv6 parses the autonomous system (AS) Numbers and IPv6 ranges from a .tsv file
func ParseASNumbersIPv6(asTsvFile string) {
csvFile, err := os.Open(asTsvFile)

if err != nil {
fmt.Println("Could not read AS Number file")
fmt.Println(err)
return
}

defer csvFile.Close()

scanner := bufio.NewScanner(csvFile)
for scanner.Scan() {
fields := strings.Fields(scanner.Text())
if len(fields) != 5 {
continue // Skip invalid lines
}

start := net.ParseIP(fields[0])
end := net.ParseIP(fields[1])
if start == nil || end == nil {
continue // Skip invalid IP ranges
}

asNumber, _ := strconv.ParseUint(fields[2], 10, 32)

asList = append(asList, ASInfoIPv6{
StartIP: start,
EndIP: end,
AsNumber: uint32(asNumber),
Name: fields[4],
})
}

if err := scanner.Err(); err != nil {
fmt.Println("Could not read AS Number file")
fmt.Println(err)
return
}
}

// GetASInfoIPv6 returns information about an autonomous system (AS) of which the given IP is part of.
func GetASInfoIPv6(ip net.IP) ASInfoIPv6 {
for _, r := range asList {
if bytes.Compare(ip, r.StartIP) >= 0 && bytes.Compare(ip, r.EndIP) <= 0 {
return r
}
}
var empty ASInfoIPv6
return empty
}

// ASInfoIPv6 contains information about an autonomous system (AS)
type ASInfoIPv6 struct {
StartIP net.IP
EndIP net.IP
AsNumber uint32
Name string
}
20 changes: 20 additions & 0 deletions as/asnumbersIPv6_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package as

import (
"net"
"testing"
)

func TestIP6ToAsRange(t *testing.T) {
ParseASNumbersIPv6("./ip2asn-v6.tsv")
ip := "2620:2d:4000:1::1"
got := GetASInfoIPv6(net.ParseIP(ip))
wantName := "CANONICAL-AS"
if got.Name != wantName {
t.Errorf("GetASInfo(%s) = %s; want %s", ip, got.Name, wantName)
}
wantAsNumber := uint32(41231)
if got.AsNumber != wantAsNumber {
t.Errorf("GetASInfo(%s) = %d; want %d", ip, got.AsNumber, wantAsNumber)
}
}
474,311 changes: 0 additions & 474,311 deletions as/ip2asn-v4-u32.tsv

This file was deleted.

14 changes: 12 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ func setupOutput() {
flag.Parse()
if *printAll {
as.ParseASNumbersIPv4("./as/ip2asn-v4-u32.tsv")
as.ParseASNumbersIPv6("./as/ip2asn-v6.tsv")
}
out = newOutput(*printAll)
}
Expand Down Expand Up @@ -171,7 +172,8 @@ func readIP4Events(rd *perf.Reader) bool {
eventPayload := newGenericEventPayload(&event.Event)
eventPayload.DestIP = conv.ToIP4(event.Daddr)
eventPayload.DestPort = event.Dport
eventPayload.ASInfo = as.GetASInfoIPv4(eventPayload.DestIP)
asInfo := as.GetASInfoIPv4(eventPayload.DestIP)
eventPayload.ASNameInfo = ASNameInfo{Name: asInfo.Name, AsNumber: asInfo.AsNumber}
out.PrintLine(eventPayload)
return true
}
Expand Down Expand Up @@ -200,6 +202,8 @@ func readIP6Events(rd *perf.Reader) bool {
eventPayload := newGenericEventPayload(&event.Event)
eventPayload.DestIP = conv.ToIP6(event.Daddr1, event.Daddr2)
eventPayload.DestPort = event.Dport
asInfo := as.GetASInfoIPv6(eventPayload.DestIP)
eventPayload.ASNameInfo = ASNameInfo{Name: asInfo.Name, AsNumber: asInfo.AsNumber}
out.PrintLine(eventPayload)
return true
}
Expand Down Expand Up @@ -294,5 +298,11 @@ type eventPayload struct {
Host string
DestIP net.IP
DestPort uint16
ASInfo as.ASInfo
ASNameInfo ASNameInfo
}

// ASNameInfo contains the name and number of an autonomous system (AS)
type ASNameInfo struct {
AsNumber uint32
Name string
}
6 changes: 2 additions & 4 deletions output.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package main
import (
"fmt"
"strconv"

"github.com/p-/socket-connect-bpf/as"
)

type output interface {
Expand Down Expand Up @@ -43,8 +41,8 @@ func (t tableOutput) PrintLine(e eventPayload) {

if t.printAll {
var asText = ""
if (as.ASInfo{}) != e.ASInfo {
asText = "AS" + strconv.Itoa(int(e.ASInfo.AsNumber)) + " (" + e.ASInfo.Name + ")"
if (ASNameInfo{}) != e.ASNameInfo {
asText = "AS" + strconv.Itoa(int(e.ASNameInfo.AsNumber)) + " (" + e.ASNameInfo.Name + ")"
}
header = "%-9s %-9s %-6d %-42s %-16s %-20s %s\n"
args = []interface{}{time, e.AddressFamily, e.Pid, e.ProcessPath + " " + e.ProcessArgs, e.User, dest, asText}
Expand Down
2 changes: 1 addition & 1 deletion updateASData.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ cd as/
download_and_unzip () {
filename=$1
wget https://iptoasn.com/data/$filename.gz
rm $filename
rm -f $filename
gunzip $filename.gz
}

Expand Down

0 comments on commit cd271f6

Please sign in to comment.