BastionGuard/thirdparty/bastionguard-secure-connection/daemon/include/bsc/net/SockDiag.hpp
specialworld83 f0f913a209 Release 2.0
2026-07-15 10:52:22 +02:00

59 lines
2.2 KiB
C++

/*
* BastionGuard™ Secure Connection
* Copyright (C) 2025–2026 Calogero Scarnà
* GPL-3.0
*
* Lookup veloce e senza race delle informazioni di un socket usando
* NETLINK_SOCK_DIAG (sock_diag). E' l'API che `ss` e `iproute2` usano
* internamente: chiede direttamente al kernel il socket e ottiene l'
* inode senza scansionare /proc.
*
* Workflow per risolvere un flow → PID:
* 1. Query sock_diag con (family=AF_INET/INET6, proto=TCP/UDP,
* saddr:sport, daddr:dport) → il kernel ritorna l'inode del socket
* 2. Ricerca dell'inode nei /proc/<pid>/fd/ (questo passaggio e'
* comunque necessario: non c'e' API kernel che mappi socket->PID
* senza passare da /proc, ma almeno ora l'inode e' quello GIUSTO)
*
* Vantaggi rispetto al parsing di /proc/net/tcp:
* - Quando NFQUEUE ti consegna il SYN, sock_diag risponde sempre
* (il kernel ha l'inode in memoria). /proc/net/tcp invece viene
* aggiornato in modo visibile dopo un brief delay.
* - Zero parsing di testo. Struttura binaria diretta.
* - Filtering su 4-tupla diretto nel kernel.
*/
#pragma once
#include <cstdint>
#include <optional>
#include <string>
namespace bsc::net {
struct SockInfo {
std::uint32_t inode{0};
std::uint32_t uid{0xFFFFFFFFu};
};
/**
* Risolve un flow TCP (saddr:sport → daddr:dport) al suo inode + uid
* tramite NETLINK_SOCK_DIAG.
*
* @param src_ip/src_port Endpoint locale (stringa IPv4 o IPv6)
* @param dst_ip/dst_port Endpoint remoto
* @return SockInfo con inode e uid, o nullopt se il kernel non trova il socket
*
* Thread-safe. Ogni chiamata crea/chiude il proprio netlink socket
* (operazione molto leggera).
*/
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);
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);
} // namespace bsc::net