Quality of Service (QoS)#

NethSecurity QoS fornisce funzionalità di Active Queue Management (AQM) e Flow Queuing (FQ) per garantire che le risorse di rete vengano utilizzate in modo efficiente ed equo.

Principi di funzionamento#

NethSecurity QoS è progettato per sfruttare al meglio la banda disponibile, senza imporre limiti rigidi o shaping del traffico come impostazione predefinita. Funziona secondo i seguenti principi:

  • Utilizzo della larghezza di banda: QoS si impegna a sfruttare al massimo la banda disponibile. Per impostazione predefinita, non impone limiti rigorosi alla larghezza di banda della rete. Invece, si adatta dinamicamente alle condizioni della rete, garantendo che la banda non utilizzata venga sfruttata in modo efficiente.

  • Gestione dei flussi: QoS gestisce attivamente i flussi di rete per evitare che un singolo client o applicazione monopolizzi la banda disponibile. Questo garantisce un accesso equo e imparziale alle risorse di rete per tutti gli utenti.

Configurazione#

La gestione della banda viene gestita in modo dinamico e automatico dal sistema. La configurazione è semplice e consiste nell’impostare i valori di larghezza di banda in upload e download per ciascuna interfaccia sotto QoS.

Sebbene il QoS possa essere configurato su qualsiasi interfaccia, generalmente funziona in modo ottimale sulle interfacce di tipo WAN, impostando le velocità di upload e download ai valori della connessione dati a Internet.

Per garantire la resilienza contro le fluttuazioni del servizio, è consigliabile mantenere un margine di sicurezza configurando questi parametri al 10% in meno rispetto ai valori misurati.

Configurazione avanzata#

QoS si basa su un classificatore eBPF (Extended Berkeley Packet Filter) per impostare i campi Differentiated Services Code Point (DSCP) nei pacchetti. Questa classificazione aiuta a dare priorità e a gestire il traffico di rete in modo efficiente. Per massimizzare l’efficienza, QoS opera nello spazio kernel utilizzando la tecnologia eBPF. Questo garantisce un overhead minimo e un impatto minimo sulle prestazioni del sistema. Oltre alle regole basate su IP e porta, QoS consente di definire regole di traffico basate su nomi DNS, offrendo un controllo granulare su come il traffico viene classificato e gestito.

Sebbene Qosify funzioni efficacemente senza una configurazione approfondita, può essere ulteriormente ottimizzato impostando limiti di banda e regole. Una regolazione fine dei parametri QoS può portare a prestazioni di rete ancora migliori.

Le modifiche al comportamento standard, tuttavia, possono essere utili solo in scenari molto limitati, per i quali, attualmente, è possibile intervenire esclusivamente tramite la riga di comando.

Classi di priorità#

QoS utilizza quattro classi di priorità, ciascuna delle quali può utilizzare una percentuale massima di banda definita dalla propria soglia.

  • Bulk (CS1, LE nel kernel v5.9+): Questa classe è progettata per il traffico a bassa priorità, con una soglia del 6,25%.

  • Best Effort (Generale): Questa classe ha una soglia del 100% ed è utilizzata per il traffico tipico, non prioritario.

  • Video (AF4x, AF3x, CS3, AF2x, CS2, TOS4, TOS1): Il traffico video rientra in questa classe, con una soglia del 50%.

  • Voce (CS7, CS6, EF, VA, CS5, CS4): Il traffico voce riceve la massima priorità, con una soglia del 25%.

QoS può temporaneamente ridurre la priorità di un flusso se questo genera una quantità significativa di traffico, parametro che è configurabile. Ad esempio, un flusso potrebbe essere temporaneamente spostato alla priorità Bulk se invia un numero elevato di pacchetti in un breve periodo di tempo. QoS può anche dare priorità ai pacchetti di piccole dimensioni per garantire una trasmissione a bassa latenza dei dati sensibili al tempo.

Oltre alle regole basate su IP e porta, QoS consente di definire regole di traffico basate su nomi DNS, offrendo un controllo granulare su come il traffico viene classificato e gestito.

Per eseguire l’override della classificazione DSCP, creare un file /etc/qosify/10-custom.conf con le mappature: ogni riga contiene due campi separati da uno spazio, match e dscp.

La corrispondenza è una delle seguenti:

  • tcp:<porta>[-<porta-finale>]

    Porta TCP singola, o intervallo da <port> a <endport>

  • udp:<porta>[-<portafine>]

    Porta UDP singola, o intervallo da <port> a <endport>

  • <ipaddr>

    Indirizzo IPv4, ad esempio 1.1.1.1

  • <ipv6addr>

    Indirizzo IPv6, ad es. ff01::1

  • dns:<pattern>

    Modello fnmatch() che supporta * e ? come caratteri jolly

  • dns:/<regex>

    Espressione regolare estesa POSIX.2 per la corrispondenza dei nomi host. Funziona solo se le ricerche DNS vengono passate a qosify tramite la chiamata ubus add_dns_host.

  • dns_c:...

    Come dns, ma corrisponde solo alle voci cname

Il dscp può essere un valore grezzo oppure un codepoint come CS0. Aggiungendo un + davanti al valore si indica a qosify di sovrascrivere il valore DSCP solo se è zero.

Esempio:

tcp:80                +voice
216.58.204.238        video
dns:nethesis.it       +CS7

Risoluzione dei problemi#

Ispezionare lo stato di qosify con qosify-status, verificare i pacchetti nelle 4 classi.