Cos'è tc?

tc (Traffic Control)

tc è un potente strumento della riga di comando in Linux utilizzato per configurare il controllo del traffico nel kernel. Permette di modellare il traffico di rete, dando priorità a specifici tipi di pacchetti, limitando la larghezza di banda e simulando la perdita di pacchetti. In sostanza, tc ti permette di definire come i pacchetti vengono gestiti in entrata (ingress) e in uscita (egress) dalle tue interfacce di rete.

A cosa serve?

tc viene utilizzato per una vasta gamma di scopi, tra cui:

  • Quality of Service (QoS): Garantire che i servizi critici ricevano una larghezza di banda sufficiente.
  • Traffic Shaping: Modellare il traffico per evitare la congestione della rete.
  • Bandwidth Limiting: Limitare la larghezza di banda utilizzata da specifici utenti o applicazioni.
  • Simulating Network Conditions: Simulare una rete lenta o con perdite per testare le applicazioni.
  • Prioritizzazione del traffico: Assegnare priorità differenti a diversi tipi di traffico di rete.

Componenti principali di tc:

  • qdisc (Queueing Discipline): Determina come i pacchetti vengono accodati prima di essere trasmessi. Esempi comuni includono pfifo_fast, htb e fq_codel. qdisc sono il nucleo della configurazione tc. Ogni interfaccia di rete ha una qdisc radice.

  • class: Divide una qdisc in sottoclassi, consentendo di applicare regole diverse a diversi tipi di traffico. Le class sono organizzate in una struttura gerarchica, con una qdisc radice e poi class figlie.

  • filter: Definisce quali pacchetti appartengono a quale class. I filter utilizzano criteri come indirizzi IP, porte, protocolli, e TOS (Type of Service) per classificare i pacchetti.

Sintassi di base:

La sintassi generale di tc è la seguente:

tc [ OPTIONS ] OBJECT COMMAND [ ARGUMENTS ]

Dove:

  • OBJECT è l'oggetto su cui si vuole agire (es. qdisc, class, filter).
  • COMMAND è l'azione da eseguire (es. add, change, del, show).
  • ARGUMENTS sono i parametri specifici per l'oggetto e il comando.

Esempi di utilizzo:

  • Visualizzare le qdisc configurate su un'interfaccia:

    tc qdisc show dev eth0
    
  • Aggiungere una qdisc htb all'interfaccia eth0:

    tc qdisc add dev eth0 root handle 1: htb default 10
    
  • Aggiungere una class all'interno della qdisc htb:

    tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit
    
  • Aggiungere un filter per indirizzare il traffico sulla porta 80 verso la class 1:1:

    tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 80 0xffff flowid 1:1
    

Argomenti importanti:

  • htb (Hierarchical Token Bucket): Una qdisc potente e flessibile, ampiamente utilizzata per il traffic shaping gerarchico. Permette di definire una gerarchia di classi con diverse velocità e priorità.

  • fq_codel (Fair Queueing Controlled Delay): Una qdisc che riduce la latenza e la jitter, particolarmente adatta per connessioni interattive. Utilizza algoritmi di "fair queueing" per garantire che nessuna connessione soffochi le altre.

  • rate: Definisce la velocità minima garantita per una class.

  • ceil: Definisce la velocità massima che una class può raggiungere.

  • prio: La priorità del filtro (più basso è il valore, maggiore è la priorità).

Avvertenze:

La configurazione di tc può essere complessa e richiede una buona comprensione dei concetti di networking. Una configurazione errata può degradare le prestazioni della rete o addirittura bloccare il traffico. È consigliabile studiare a fondo la documentazione e testare le configurazioni in un ambiente di prova prima di applicarle a un sistema di produzione.

Ricorda che le modifiche apportate con tc sono generalmente temporanee e vengono perse al riavvio del sistema. Per rendere le modifiche permanenti, è necessario salvarle in un file di configurazione e caricarle all'avvio del sistema. Il metodo per farlo varia a seconda della distribuzione Linux.