Skip to content

Commit 335f2a7

Browse files
netstat: allow to list XDP sockets
- daemon: Allow to dump XDP sockets from kernel. - ui: Added options to filter by RAW protocol and AF_XDP family. - Bumped vishvananda/netlink version to v1.3.0. - Updated go.mod and go.sum
1 parent c5e24c0 commit 335f2a7

5 files changed

Lines changed: 50 additions & 15 deletions

File tree

‎daemon/go.mod‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ require (
1010
github.com/google/uuid v1.3.0
1111
github.com/iovisor/gobpf v0.2.0
1212
github.com/varlink/go v0.4.0
13-
github.com/vishvananda/netlink v1.1.1-0.20220115184804-dd687eb2f2d4
14-
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae
13+
github.com/vishvananda/netlink v1.3.0
14+
github.com/vishvananda/netns v0.0.4
1515
golang.org/x/net v0.17.0
1616
golang.org/x/sys v0.13.0
1717
google.golang.org/grpc v1.32.0
18+
google.golang.org/protobuf v1.26.0
1819
)
1920

2021
require (
@@ -27,6 +28,5 @@ require (
2728
golang.org/x/text v0.13.0 // indirect
2829
golang.org/x/tools v0.6.0 // indirect
2930
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 // indirect
30-
google.golang.org/protobuf v1.26.0 // indirect
3131
honnef.co/go/tools v0.2.2 // indirect
3232
)

‎daemon/go.sum‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,10 @@ github.com/mdlayher/socket v0.0.0-20211102153432-57e3fa563ecb/go.mod h1:nFZ1EtZY
7676
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
7777
github.com/varlink/go v0.4.0 h1:+/BQoUO9eJK/+MTSHwFcJch7TMsb6N6Dqp6g0qaXXRo=
7878
github.com/varlink/go v0.4.0/go.mod h1:DKg9Y2ctoNkesREGAEak58l+jOC6JU2aqZvUYs5DynU=
79-
github.com/vishvananda/netlink v1.1.1-0.20220115184804-dd687eb2f2d4 h1:fB26rIBlWTVJyEB6ONHdoEvUbvwoudH0/cMEXHiD1RU=
80-
github.com/vishvananda/netlink v1.1.1-0.20220115184804-dd687eb2f2d4/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
81-
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae h1:4hwBBUfQCFe3Cym0ZtKyq7L16eZUtYKs+BaHDN6mAns=
82-
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
79+
github.com/vishvananda/netlink v1.3.0 h1:X7l42GfcV4S6E4vHTsw48qbrV+9PVojNfIhZcwQdrZk=
80+
github.com/vishvananda/netlink v1.3.0/go.mod h1:i6NetklAujEcC6fK0JPjT8qSwWyO0HLn4UKG+hGqeJs=
81+
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
82+
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
8383
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
8484
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
8585
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -134,8 +134,6 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
134134
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
135135
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
136136
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
137-
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
138-
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
139137
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
140138
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
141139
golang.org/x/sys v0.0.0-20201118182958-a01c418693c7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -154,6 +152,8 @@ golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBc
154152
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
155153
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
156154
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
155+
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
156+
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
157157
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
158158
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
159159
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=

‎daemon/netlink/socket_xdp.go‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package netlink
2+
3+
import (
4+
vnl "github.com/vishvananda/netlink"
5+
)
6+
7+
// SocketGetXDP dumps all the opened XDP sockets from kernel
8+
func SocketGetXDP() ([]*vnl.XDPDiagInfoResp, error) {
9+
// TODO: enable filtering
10+
return vnl.SocketDiagXDP()
11+
}

‎daemon/tasks/socketsmonitor/dump.go‎

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"syscall"
99

1010
"github.com/evilsocket/opensnitch/daemon/log"
11-
daemonNetlink "github.com/evilsocket/opensnitch/daemon/netlink"
11+
"github.com/evilsocket/opensnitch/daemon/netlink"
1212
"github.com/evilsocket/opensnitch/daemon/netstat"
1313
"github.com/evilsocket/opensnitch/daemon/procmon"
1414
"golang.org/x/sys/unix"
@@ -22,7 +22,7 @@ const (
2222

2323
// Socket represents every socket dumped from the kernel for the given filter.
2424
type Socket struct {
25-
Socket *daemonNetlink.Socket
25+
Socket *netlink.Socket
2626
Iface string
2727
PID int
2828
Mark uint32
@@ -40,6 +40,7 @@ func (pm *SocketsMonitor) dumpSockets() *SocketsTable {
4040
socketList := &SocketsTable{}
4141
socketList.Table = make([]*Socket, 0)
4242
socketList.Processes = make(map[int]*procmon.Process, 0)
43+
4344
for n, opt := range options {
4445
if exclude(pm.Config.Family, opt.Fam) {
4546
continue
@@ -48,7 +49,7 @@ func (pm *SocketsMonitor) dumpSockets() *SocketsTable {
4849
continue
4950
}
5051

51-
sockList, err := daemonNetlink.SocketsDump(opt.Fam, opt.Proto)
52+
sockList, err := netlink.SocketsDump(opt.Fam, opt.Proto)
5253
if err != nil {
5354
log.Debug("[sockmon][%d] fam: %d, proto: %d, error: %s", n, opt.Fam, opt.Proto, err)
5455
continue
@@ -73,6 +74,26 @@ func (pm *SocketsMonitor) dumpSockets() *SocketsTable {
7374
wg.Wait()
7475
}
7576

77+
if !exclude(pm.Config.Family, unix.AF_XDP) && !exclude(pm.Config.Proto, syscall.IPPROTO_RAW) {
78+
xdpList, err := netlink.SocketGetXDP()
79+
if err == nil {
80+
var wg sync.WaitGroup
81+
for _, xdp := range xdpList {
82+
s := netlink.Socket{}
83+
s.Family = unix.AF_XDP
84+
s.INode = uint32(xdp.XDPDiagMsg.Ino)
85+
s.UID = uint32(xdp.XDPInfo.UID)
86+
s.ID = netlink.SocketID{
87+
Interface: xdp.XDPInfo.Ifindex,
88+
Cookie: xdp.XDPDiagMsg.Cookie,
89+
}
90+
wg.Add(1)
91+
go addSocketToTable(pm.Ctx, &wg, syscall.IPPROTO_RAW, socketList, s)
92+
}
93+
wg.Wait()
94+
}
95+
}
96+
7697
if exclude(pm.Config.Family, unix.AF_PACKET) {
7798
return socketList
7899
}
@@ -90,11 +111,11 @@ func (pm *SocketsMonitor) dumpSockets() *SocketsTable {
90111
pktList[n] = struct{}{}
91112

92113
wg.Add(1)
93-
s := daemonNetlink.Socket{}
114+
s := netlink.Socket{}
94115
s.Family = unix.AF_PACKET
95116
s.INode = uint32(e.INode)
96117
s.UID = uint32(e.UserId)
97-
s.ID = daemonNetlink.SocketID{
118+
s.ID = netlink.SocketID{
98119
Interface: uint32(e.Iface),
99120
}
100121
// TODO: report the protocol and type
@@ -109,7 +130,7 @@ func exclude(expected, what uint8) bool {
109130
return expected > AnySocket && expected != what
110131
}
111132

112-
func addSocketToTable(ctx context.Context, wg *sync.WaitGroup, proto uint8, st *SocketsTable, s daemonNetlink.Socket) {
133+
func addSocketToTable(ctx context.Context, wg *sync.WaitGroup, proto uint8, st *SocketsTable, s netlink.Socket) {
113134
inode := int(s.INode)
114135
pid := procmon.GetPIDFromINode(inode, fmt.Sprint(inode,
115136
s.ID.Source, s.ID.SourcePort, s.ID.Destination, s.ID.DestinationPort),

‎ui/opensnitch/dialogs/stats.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,7 @@ def __init__(self, parent=None, address=None, db=None, dbname="db", appicon=None
518518
self.comboNetstatProto.addItem("ICMP", 1)
519519
self.comboNetstatProto.addItem("ICMPv6", 58)
520520
self.comboNetstatProto.addItem("IGMP", 2)
521+
self.comboNetstatProto.addItem("RAW", 255)
521522

522523
# These are sockets states. Conntrack uses a different enum.
523524
self.comboNetstatStates.clear()
@@ -540,6 +541,8 @@ def __init__(self, parent=None, address=None, db=None, dbname="db", appicon=None
540541
self.comboNetstatFamily.addItem("AF_INET", 2)
541542
self.comboNetstatFamily.addItem("AF_INET6", 10)
542543
self.comboNetstatFamily.addItem("AF_PACKET", 17) # 0x11
544+
self.comboNetstatFamily.addItem("AF_XDP", 44)
545+
543546
self.comboNetstatInterval.currentIndexChanged.connect(lambda index: self._cb_combo_netstat_changed(0, index))
544547
self.comboNetstatNodes.activated.connect(lambda index: self._cb_combo_netstat_changed(1, index))
545548
self.comboNetstatProto.currentIndexChanged.connect(lambda index: self._cb_combo_netstat_changed(2, index))

0 commit comments

Comments
 (0)