Come Trasformare un Server Linux in un Router per Gestire il Traffico in Modo Statico e Dinamico – Parte 10

Come abbiamo anticipato nei precedenti tutorial di questa serie LFCE (Linux Foundation Certified Engineer), in questo articolo discuteremo del routing del traffico IP staticamente e dinamicamente con applicazioni specifiche.

Linux Foundation Certified Engineer – Part 10
Presentazione del Programma di Certificazione della Linux Foundation

Prima di tutto, chiariremo alcune definizioni:

  1. In parole semplici, un pacchetto è l’unità di base utilizzata per trasmettere informazioni all’interno di una rete. Le reti che utilizzano TCP/IP come protocollo di rete seguono le stesse regole per la trasmissione dei dati: le informazioni effettive vengono divise in pacchetti composti sia da dati che dall’indirizzo a cui devono essere inviati.
  2. Routing è il processo di “guida” dei dati dalla sorgente alla destinazione all’interno di una rete.
  3. Routing statico richiede un insieme di regole configurate manualmente definite in una tabella di routing. Queste regole sono fisse e vengono utilizzate per definire il percorso che un pacchetto deve seguire mentre viaggia da una macchina all’altra.
  4. Routing dinamico, o routing intelligente (se preferisci), significa che il sistema può modificare automaticamente, se necessario, il percorso che un pacchetto segue.

Configurazione avanzata di IP e dispositivi di rete

Il pacchetto iproute fornisce un insieme di strumenti per gestire la rete e il controllo del traffico che utilizzeremo in questo articolo in quanto rappresentano la sostituzione degli strumenti legacy come ifconfig e route.

La utility centrale nella suite iproute è chiamata semplicemente ip. La sua sintassi di base è la seguente:

# ip object command

Dove oggetto può essere solo uno dei seguenti (vengono mostrati solo gli oggetti più frequenti – puoi fare riferimento a man ip per un elenco completo):

  1. link: dispositivo di rete.
  2. addr: indirizzo del protocollo (IP o IPv6) su un dispositivo.
  3. route: voce della tabella di routing.
  4. rule: regola nel database di politica di routing.

Mentre comando rappresenta un’azione specifica che può essere eseguita sull’oggetto. Puoi eseguire il seguente comando per visualizzare l’elenco completo dei comandi che possono essere applicati a un particolare oggetto:

# ip object help

Ad esempio,

# ip link help
IP Command Help

L’immagine sopra mostra, ad esempio, che è possibile cambiare lo stato di un’interfaccia di rete con il seguente comando:

# ip link set interface {up | down}

Per altri esempi di comando ‘ip‘, leggi 10 Comandi Utili ‘ip’ per Configurare l’Indirizzo IP

Esempio 1: Disabilitazione e abilitazione di un’interfaccia di rete

In questo esempio, disabiliteremo e abiliteremo eth1:

# ip link show
# ip link set eth1 down
# ip link show
Disable eth0 Interface

Se desideri riabilitare eth1,

# ip link set eth1 up

Invece di visualizzare tutte le interfacce di rete, possiamo specificarne una:

# ip link show eth1

Che restituirà tutte le informazioni per eth1.

Esempio 2: Visualizzazione della tabella di routing principale

Puoi visualizzare la tua attuale tabella di routing principale con uno qualsiasi dei seguenti 3 comandi:

# ip route show
# route -n
# netstat -rn
Check Linux Route Table

La prima colonna nell’output dei tre comandi indica la rete di destinazione. L’output di ip route show (seguendo la parola chiave dev) presenta anche i dispositivi di rete che fungono da gateway fisico per quelle reti.

Anche se oggi il comando ip è preferito rispetto a route, è comunque possibile fare riferimento a man ip-route e man route per una spiegazione dettagliata del resto delle colonne.

Esempio 3: Utilizzo di un server Linux per instradare pacchetti tra due reti private

Vogliamo instradare pacchetti icmp (ping) da dev2 a dev4 e viceversa (nota che entrambe le macchine client si trovano su reti diverse). Il nome di ciascuna scheda di rete, insieme al relativo indirizzo IPv4, è fornito tra parentesi quadre.

Il nostro ambiente di test è il seguente:

Client 1: CentOS 7 [enp0s3: 192.168.0.17/24] - dev1
Router: Debian Wheezy 7.7 [eth0: 192.168.0.15/24, eth1: 10.0.0.15/24] - dev2
Client 2: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

Visualizziamo la tabella di instradamento in dev1 (CentOS box):

# ip route show

e quindi modifichiamola per utilizzare la sua scheda di rete enp0s3 e la connessione a 192.168.0.15 per accedere agli host nella rete 10.0.0.0/24:

# ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3

Che essenzialmente si traduce in “Aggiungi un percorso alla rete 10.0.0.0/24 tramite l’interfaccia di rete enp0s3 utilizzando 192.168.0.15 come gateway”.

Route Network in Linux

Analogamente in dev4 (openSUSE box) per fare ping agli host nella rete 192.168.0.0/24:

# ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3
Network Routing in Linux

Infine, è necessario abilitare l’inoltro nel nostro router Debian:

# echo 1 > /proc/sys/net/ipv4/ip_forward

Ora facciamo ping:

Check Network Routing

e,

Route Ping Status

Per rendere queste impostazioni persistenti durante il boot, modifica /etc/sysctl.conf sul router e assicurati che la variabile net.ipv4.ip_forward sia impostata su true come segue:

net.ipv4.ip_forward = 1

Configura le schede di rete su entrambi i client (cerca il file di configurazione all’interno di /etc/sysconfig/network su openSUSE e /etc/sysconfig/network-scripts su CentOS – in entrambi i casi si chiama ifcfg-enp0s3).

Ecco il file di configurazione dalla macchina openSUSE:

BOOTPROTO=static
BROADCAST=10.0.0.255
IPADDR=10.0.0.18
NETMASK=255.255.255.0
GATEWAY=10.0.0.15
NAME=enp0s3
NETWORK=10.0.0.0
ONBOOT=yes
Esempio 4: Utilizzo di un server Linux per instradare pacchetti tra reti private e Internet

Un altro scenario in cui una macchina Linux può essere utilizzata come router è quando è necessario condividere la connessione Internet con una LAN privata.

Router: Debian Wheezy 7.7 [eth0: Public IP, eth1: 10.0.0.15/24] - dev2
Client: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

Oltre a configurare l’inoltro dei pacchetti e la tabella di routing statico nel client come nell’esempio precedente, è necessario aggiungere alcune regole iptables nel router:

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Il primo comando aggiunge una regola alla catena POSTROUTING nella tabella nat (Network Address Translation), indicando che la scheda eth0 dovrebbe essere utilizzata per i pacchetti in uscita.

MASQUERADE indica che questa scheda ha un IP dinamico e che prima di inviare il pacchetto al “mondo selvaggio” di Internet, l’indirizzo sorgente privato del pacchetto deve essere cambiato con quello dell’IP pubblico del router.

In una LAN con molti host, il router tiene traccia delle connessioni stabilite in /proc/net/ip_conntrack in modo da sapere dove inviare la risposta da Internet.

Solo una parte dell’output di:

# cat /proc/net/ip_conntrack

è mostrata nello screenshot seguente.

Route Packages in Linux

Dove l’origine (IP privato della macchina openSUSE) e la destinazione (Google DNS) dei pacchetti sono evidenziati. Questo è stato il risultato dell’esecuzione di:

# curl www.tecmint.com

sulla macchina openSUSE.

Come puoi immaginare, il router utilizza l’8.8.8.8 di Google come nameserver, il che spiega perché la destinazione dei pacchetti in uscita punta a quell’indirizzo.

Nota: I pacchetti in ingresso da Internet vengono accettati solo se fanno parte di una connessione già stabilita (comando n. 2), mentre i pacchetti in uscita sono permessi in modo “libero” (comando n. 3).

Non dimenticare di rendere persistenti le regole iptables seguendo i passaggi descritti in Parte 8 – Configurare il firewall iptables di questa serie.

Routing dinamico con Quagga

Attualmente, lo strumento più utilizzato per il routing dinamico in Linux è quagga. Consente agli amministratori di sistema di implementare, con un server Linux a relativamente basso costo, la stessa funzionalità fornita dai potenti (e costosi) router Cisco.

Lo strumento stesso non gestisce il routing, ma modifica piuttosto la tabella di routing del kernel mentre apprende nuove migliori rotte per gestire i pacchetti.

Dato che è un fork di zebra, un programma il cui sviluppo è cessato tempo fa, per ragioni storiche mantiene gli stessi comandi e la stessa struttura di zebra. È per questo che vedrai molti riferimenti a zebra da questo punto in poi.

Si noti che non è possibile coprire il routing dinamico e tutti i protocolli correlati in un singolo articolo, ma sono sicuro che il contenuto presentato qui servirà come punto di partenza per costruire su di esso.

Installazione di Quagga in Linux

Per installare quagga sulla tua distribuzione scelta:

# aptitude update && aptitude install quagga 				[On Ubuntu]
# yum update && yum install quagga 					[CentOS/RHEL]
# zypper refresh && zypper install quagga 				[openSUSE]

Utilizzeremo lo stesso ambiente come nell’Esempio n. 3, con l’unica differenza che eth0 è collegato a un router gateway principale con IP 192.168.0.1.

Successivamente, modifica /etc/quagga/daemons con,

zebra=1
ripd=1

Ora crea i seguenti file di configurazione.

# /etc/quagga/zebra.conf
# /etc/quagga/ripd.conf

e aggiungi queste righe (sostituisci con un nome host e password a tua scelta):

service quagga restart
hostname    	dev2
password    	quagga
# service quagga restart
Start Quagga Service

Nota: Che ripd.conf è il file di configurazione per il Protocollo di Informazioni di Routing, che fornisce al router le informazioni su quali reti possono essere raggiunte e a che distanza (in termini di numero di hop) si trovano.

Nota che questo è solo uno dei protocolli che possono essere utilizzati insieme a quagga, e l’ho scelto per questo tutorial per la facilità d’uso e perché la maggior parte dei dispositivi di rete lo supporta, anche se ha lo svantaggio di passare le credenziali in testo normale. Per questo motivo, è necessario assegnare le autorizzazioni adeguate al file di configurazione:

# chown quagga:quaggavty /etc/quagga/*.conf
# chmod 640 /etc/quagga/*.conf 
Esempio 5: Configurazione di quagga per instradare il traffico IP dinamicamente

In questo esempio utilizzeremo la seguente configurazione con due router (assicurati di creare i file di configurazione per router #2 come spiegato in precedenza):

Configure Quagga

Importante: Non dimenticare di ripetere la seguente configurazione per entrambi i router.

Connettiti a zebra (in ascolto sulla porta 2601), che è l’intermediario logico tra il router e il kernel:

# telnet localhost 2601

Inserisci la password impostata nel file /etc/quagga/zebra.conf, e quindi abilita la configurazione:

enable
configure terminal

Inserisci l’indirizzo IP e la maschera di rete di ciascuna NIC:

inter eth0
ip addr 192.168.0.15
inter eth1
ip addr 10.0.0.15
exit
exit
write
Configure Router

Ora dobbiamo connetterci al terminale del demone RIP (porta 2602):

# telnet localhost 2602

Inserisci nome utente e password come configurato nel file /etc/quagga/ripd.conf, e poi digita i seguenti comandi in grassetto (i commenti sono aggiunti per chiarezza):

enable turns on privileged mode command.
configure terminal changes to configuration mode. This command is the first step to configuration
router rip enables RIP.
network 10.0.0.0/24 sets the RIP enable interface for the 10.0.0.0/24 network. 
exit
exit
write writes current configuration to configuration file.
Enable Router

Nota: Che in entrambi i casi la configurazione viene aggiunta alle righe che abbiamo aggiunto in precedenza (/etc/quagga/zebra.conf e /etc/quagga/ripd.conf).

Infine, connettiti nuovamente al servizio zebra su entrambi i router e nota come ciascuno di essi ha “imparato” il percorso alla rete che si trova dietro l’altro, e qual è il prossimo salto per raggiungere quella rete, eseguendo il comando show ip route:

# show ip route
Check IP Routing

Se desideri provare diversi protocolli o configurazioni, potresti voler consultare il sito del progetto Quagga per ulteriori documentazioni.

Conclusione

In questo articolo abbiamo spiegato come configurare il routing statico e dinamico, utilizzando un router Linux. Sentiti libero di aggiungere quanti router desideri e di sperimentare quanto vuoi. Non esitare a contattarci utilizzando il modulo di contatto qui sotto se hai commenti o domande.

Source:
https://www.tecmint.com/setup-linux-as-router/