Skip to content
API Documentation
BastionGuard™
SockDiag.hpp
Go to the documentation of this file.
1/*
2 * BastionGuard™ Secure Connection
3 * Copyright (C) 2025–2026 Calogero Scarnà
4 * GPL-3.0
5 *
6 * Lookup veloce e senza race delle informazioni di un socket usando
7 * NETLINK_SOCK_DIAG (sock_diag). E' l'API che `ss` e `iproute2` usano
8 * internamente: chiede direttamente al kernel il socket e ottiene l'
9 * inode senza scansionare /proc.
10 *
11 * Workflow per risolvere un flow → PID:
12 * 1. Query sock_diag con (family=AF_INET/INET6, proto=TCP/UDP,
13 * saddr:sport, daddr:dport) → il kernel ritorna l'inode del socket
14 * 2. Ricerca dell'inode nei /proc/<pid>/fd/ (questo passaggio e'
15 * comunque necessario: non c'e' API kernel che mappi socket->PID
16 * senza passare da /proc, ma almeno ora l'inode e' quello GIUSTO)
17 *
18 * Vantaggi rispetto al parsing di /proc/net/tcp:
19 * - Quando NFQUEUE ti consegna il SYN, sock_diag risponde sempre
20 * (il kernel ha l'inode in memoria). /proc/net/tcp invece viene
21 * aggiornato in modo visibile dopo un brief delay.
22 * - Zero parsing di testo. Struttura binaria diretta.
23 * - Filtering su 4-tupla diretto nel kernel.
24 */
25
26#pragma once
27#include <cstdint>
28#include <optional>
29#include <string>
30
31namespace bsc::net {
32
33struct SockInfo {
34 std::uint32_t inode{0};
35 std::uint32_t uid{0xFFFFFFFFu};
36};
37
38/**
39 * Risolve un flow TCP (saddr:sport → daddr:dport) al suo inode + uid
40 * tramite NETLINK_SOCK_DIAG.
41 *
42 * @param src_ip/src_port Endpoint locale (stringa IPv4 o IPv6)
43 * @param dst_ip/dst_port Endpoint remoto
44 * @return SockInfo con inode e uid, o nullopt se il kernel non trova il socket
45 *
46 * Thread-safe. Ogni chiamata crea/chiude il proprio netlink socket
47 * (operazione molto leggera).
48 */
49std::optional<SockInfo> sockdiag_lookup_tcp(const std::string& src_ip,
50 std::uint16_t src_port,
51 const std::string& dst_ip,
52 std::uint16_t dst_port);
53
54std::optional<SockInfo> sockdiag_lookup_udp(const std::string& src_ip,
55 std::uint16_t src_port,
56 const std::string& dst_ip,
57 std::uint16_t dst_port);
58
59} // namespace bsc::net
std::optional< SockInfo > sockdiag_lookup_tcp(const std::string &src_ip, std::uint16_t src_port, const std::string &dst_ip, std::uint16_t dst_port)
Definition SockDiag.cpp:118
std::optional< SockInfo > sockdiag_lookup_udp(const std::string &src_ip, std::uint16_t src_port, const std::string &dst_ip, std::uint16_t dst_port)
Definition SockDiag.cpp:130
std::uint32_t uid
Definition SockDiag.hpp:35
std::uint32_t inode
Definition SockDiag.hpp:34