Tipicamente la configurazione di un host in rete prevede pochi dati fondamentali: Indirizzo IP, subnet mask, default gateway e DNS server.
Esistono molteplici metodi per configurare il servizio di rete in Linux, molto di quanto viene qui riportato si applica a tutti gli Unix:
- editare i singoli file di configurazione del networking (ristartare il servizio per applicare le modifiche);
- usare comandi shell come ifconfig
, route
- utilizzare strumenti di configurazione con interfaccia a finestra come netconfig, linuxconf, webmin e altri facilmente individuabili su desktop KDE o GNOME.
File di configurazione:
/etc/sysconfig/network
Contiene le principali configurazioni per il Networking: hostname, domainname, default gateway (tipico di RedHat).
/etc/sysconfig/network-script/ifcfg-XXX
Directory contenente i file di configurazione delle singole interfacce (tipico di RedHat).
/etc/hosts
Contiene il mapping statico fra indirizzi e hostname ed alias. Segue un esempio.
/etc/services
Contiene il mapping tra i numeri di porta e i nomi dei servizi.
E' un file che solitamente non si modifica, salvo l'aggiunta di porte e protocolli custom.
/etc/host.conf
Specifica l'ordine secondo il quale il sistema effettuerà la ricerca di informazioni per risolvere gli indirizzi. Usato dalla resolver library in sistemi con libc versione 5.
order hosts,bind ; specifica di usare prima /etc/hosts e poi il DNS per risolvere gli IP.
/etc/nsswitch.conf
Stessa funzione di host.conf nei sistemi con libc versione 6 (glibc). In pratica è sempe meglio avere entrambi i file correttamente configurati.
/etc/resolv.conf
File di configurazione del client DNS ovvero contiene gli indirizzi del server DNS e un possibile dominio dell'host e l'ordine di ricerca
Comandi comuni
Tipicamente su Linux e su Unix i comandi che bastano per configurare la rete (con privilegi da root (sono:
ifconfig [interface] [options] | address
Permette di configurare le interfacce di rete dell'host. Es: ifconfig eth0 192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255 up
. NOTA: Non esiste nessun controllo sulla corrispondenza fra netmask e broadcast.
route [ opzioni ] [comando] [parametri]
Permette di manipolare la tabella di routing del kernel. Es: route add -net 0.0.0.0/0 gw 192.168.0.1
/etc/init.d/network
Script di avvio/stop del networking. Es: Per riavviare il subsystem rete dopo una riconfigurazione basta scrivere /etc/init.d/network restart
.
ip [ opzioni ] oggetto { comando }
Comando estremamente potente e flessibile disponibile a chi ha installato i tool iproute2
E' possibile associare più indirizzi ip appartenenti alla stessa rete su un'unica interfaccia, ovvero è possibile associare più Alias a interfacce di rete.
Ifconfig serve essenzialmente a configurare l'indirizzo ip di un'interfaccia di rete, tipicamente una ethernet.
Un computer può avere più di un indirizzo IP. Ad ogni interface può corrispondere uno o più indirizzi IP.
per esempio potremmo avere un computer con due ethernet interface e avremmo quindi una eth0 e una eth1 (quindi due indirizzi), ma potremmo avere anche degli alias, quindi eth0:1, eth0:2 e così via.
Con ifconfig si possono configurare altri aspetti di un'interface, anche se molti parametri saranno difficilmente cambiati. Per esempio si possono cambiare e MTU e metrica, abilitare o disabilitare il multicast e la modalità promiscqua (di solito attivata automaticamente da programmi di sniffing). Sulla manuale (man ifconfig) si possono trovare queste opzioni, che consiglio di leggere.
Sicuramente i comandi dati sono sufficienti ad una configurazione standard.
Vediamo una panoramica dei principali comandi per utilizzare ifconfig:
ifconfig [interface] options | address
ifconfig -a
mostra la configurazione IP di tutte le interface. Su molti sistemi è sufficiente digitare ifconfig, senza l'opzione -a. Un esempio dell'output di ifconfig può essere questo (i commenti spiegano le varie righe):
eth0 Link encap:Ethernet HWaddr 00:50:8B:B0:15:7F
indica il tipo di hardware e il suo indirizzo fisico (MAC address)
inet addr:192.168.0.1 Bcast:192.168.1.255 Mask:255.255.255.0
indica indirizzo IP, indirizzo di broadcast e maschera della rete.
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Indica lo stato (UP) e le opzioni attive (accetta broadcast e multicast) l'MTU e la Metrica.
RX packets:2590603 errors:0 dropped:0 overruns:0 frame:0
TX packets:2713120 errors:0 dropped:0 overruns:1 carrier:0
collisions:0 txqueuelen:100
RX bytes:987732693 (941.9 Mb) TX bytes:1198865677 (1143.3 Mb)
Mostra le statistiche in ricezione (RX) e trasmissione (TX)
Interrupt:12 Base address:0x6100
Mostra l'indirizzo hardware della scheda
ifconfig interface
mostra la configurazione della interface specificata. Per esempio ifconfig eth0.
ifconfig interface ip netmask broadcast up/down
attiva disattiva una determinata interface. Con questo comando possiamo facilmente configuare e attivare una interface. Questo si applica sia come indirizzo primario che come alias, consentendoci di creare più alias alla stessa interfaccia.
Vediamo qualche esempio:
ifconfig eth0 192.168.0.1 up
assegna l'indirizzo IP 192.168.0.1 e attiva l'interface (di default viene assegnata la classe C in questo caso, che sarebbe stata una classe A se avessimo usato 10.0.0.1)
ifconfig eth0:1 192.168.0.1 up
assegna l'indirizzo IP 192.168.0.1 alla eth0:1 e attiva l'interface. Eseguendo questo comando di fatto assegniamo un'altro indirizzo IP alla interface.
ifconfig eth0 192.168.0.1 netmask 255.255.255.128 broadcast 192.168.0.127 up
assegna l'indirizzo IP 192.168.0.1 e attiva l'interface, creando una mask 192.168.0.0/25 (In questo modo la Classe C è divisa in due subnet di 126 indirizzi) e assegnando come indirizzo di broadcast 192.168.0.127.
Route è il comando Linux che viene utilizzato per manipolare le tabelle di routing. Permette di aggiungere ed eliminare route statiche e default gateway, oltre che semplicemente visualizzare la tabella di routing di un sistema.
Non è comune in altri Unix.
route add [-net|-host] indirizzo [gw gateway] [netmask netmask] [mss mss] [metric metric] [dev device]
route del indirizzo
Per aggiungere una route statica per un'intera rete si usa l'opzione add e si devinisce la rete con -net. Per esempio:
route add -net 192.168.0.0 netmask 255.255.255.0 gw 10.0.0.254
Aggiunge una route statica per la rete 192.168.0.0/24 usando come gateway 10.0.0.254.
Per impostare il default gateway si può digitare qualcosa come:
route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.0.0.1
oppure:
route add default gw 10.0.0.1
Per cancellare una route esistente basta indicare il nome della rete:
route del -net 192.168.0.0
Per visualizzare la tabella di route basta: route
, se si vuole evitare il reverse lookup degli IP e velocizzare l'operazione scrivere: route -n
Per visualizzare la cache del sistema sulle route usate: route -C
Diagnosticare problemi di rete è attività che difficilmente si spiega a parole.
Per essere in grado di affrontare problematiche di rete complesse (ma anche quelle relativamente triviali) sono necessari diversi skill, non tutti tramandabili facilmente:
1 - Solide basi teoriche e conoscenza dello stack TCP/IP.
Inutile fingere, si deve poter diagnosticare in fretta un problema di DNS rispetto a quello dovuto ad un cavo scollegato, un problema di routing rispetto ad un problema dovuto a troppi errori su una interfaccia.
Per farlo, a prescindere dai sistemi usati, è sempre necessario avere in mente network layers e protocolli.
2 - Esperienza.
Come sempre, i trucchi migliori sono quelli che si acquisiscono sul campo e la familiarità con ambienti e dispositivi specifici ci rende più efficaci e rapidi nelle scelte e nelle implementazioni.
3 - Conoscenza degli strumenti a disposizione.
Qui possiamo dare qualche indicazione utile, valida per quasi tutti gli Unix e anche sistemi Windows:
- ping, traceroute, telnet sono utili per diagnosticare problemi di raggiungibilità di sistemi remoti
- ifconfig, route servono per identificare la configurazione di rete corrente ed evidenziare routing particolari o problemi di errori a livello di interfaccia fisica.
- arp e le arp cache sono sempre da considerare quando si cambia IP di una macchina o la macchina associata ad un IP
- netstat è uno strumento flessibile per identificare connessioni di rete attive e errori e statistiche di traffico su IP, TCP, UDP e ICMP.
- tcpdump, snoop e altri sniffer sono fondamentali quando si devono analizzare nel dettagli dei flussi di pacchetti in rete
- nslookup e dig sono fondamentali per diagnosticare problemi di DNS.
Netstat è un comando polifunzionale che ti permettere di verificare le connessioni, le route e statistiche del proprio sistema. Un comando che ogni sys adm deve conoscere alla perfezione, utile per diagnostica e controllo del sistema.
netstat [information-type] [options]
netstat {--help|-h}
Richiama l'help
Per selezionare il tipo di informazioni da visualizzare, bisogna mettere come primo argomento una delle seguenti opzioni. Se non si specifica nulla il comando visualizzera' la lista delle socket aperte, opzione di default.
Information Type
--route , -r
Visualizza le route impostate sul sistema
--groups , -g
Visualizza informazioni riguardanti i multicast group membership (ipv4 e ipv6)
--interface=iface , -i
Visualizza le statistiche di tutte le interfacce o della singola interfaccia specificata
--masquerade , -M
Verifica le connessioni che hanno subito masquerading
--statistics , -s
Visuallizza un sommario di statistiche
Options
--verbose , -v
Abilita il verbose mode.
--numeric , -n
Non risolve gli Ip e il numero delle porte, risparmiando i tempi per query DNS.
--protocol=family , -A
Opzione per specificare l'address family quando si vuole visualizzare le connessioni.
-c, --continuous
Esegue il comando ogni secondo (o ogni intervallo di secondi specificato).
-p, --program
Mostra il PID, ed il nome del programma proprietario della socket. Utile per capire, per esempio, quale programma utilizza una specifica porta TCP.
-l, --listening
Mostra solo le conessioni in LISTENING
-a, --all
Mostra tutte le connessioni (LISTENING e non), se abbinato al flag -i visualizza le informazioni per tutte le interfacce
Comando che ti permette di visualizzare e manipolare le voci di arp nella cache del sistema.
Come la maggior parte dei comandi relativi alla network ottiene informazioni dal proc file-system (/proc/net/arp)
Visualizzazione del contenuto di tutta la cache, oppure specificando l'host solo l'arp del suddetto host
arp [opzioni] -a [hostname]
Cancellazzione dell'arp di uno specifico host
arp [opzioni] -d hostname
Creazione manuale di uno specifico arp di un host
arp [opzioni] -s hostname hw_addr [opzioni]
Options
-v, --verbose
Abilita il verbose mode
-n, --numeric
Non esegue il DNS lookup degli indirizzi ip
-H type, --hw-type type, -t type
Specifica quale classe di arp deve visualizzare,cancellare inserire. ( ARCnet (arcnet) , PROnet (pronet) , AX.25 (ax25) and NET/ROM (netrom). Default=ether)
-i If, --device If
Specifica l'interfaccia
-e
Visualizza il risultato in linux standard
Tcpdump è un ottimo sniffer che permette di monitorare il traffico di rete con filtri flessibili per limitare l'output a video secondo varie regole di matching di pacchetti.
tcpdump [ options ] [ expression ]
-a
Tenta di risolvere network e broadcast address
-c [count]
Esegue l'exit dopo aver raccolto tot pacc
-F [file]
Specifica di utilizzare un file in input per le expression
-i
Specifica l'interfaccia da cui sniffare
-n
Non risolve gli indirizzi ip
-nn
Non risolve ne gli ip ne il numero delle porte
-p
Non abilita il promiscuous mode sull'interfacce da cui tcpdump e' in ascolto
-v,-vv,-vvv
Abilita il verbose mode
-x
Printa ogni paccheto sniffato
Le expression servono per limitare il matching dei pacchetti
proto
Specifica il protocollo [tcp,udp,ether etc...]
dst host [host]
Specifica l'host di destinazione dei pacchetti
dst net
Specifica la network di destinazione dei pacchetti
dst port
Specifica la porta di destinazione dei pacchetti
src host [host]
Specifica l'host sorgente dei pacchetti
src net
Specifica la network sorgente dei pacchetti
src port
Specifica la porta sorgente dei pacchetti
`!' o `not'
Simbolo di negazione, ovvero inverte il matching
`&&' or `and'
Simbolo di concatenazione, visualizza il pacchetto che fa il match di tutte le regole concatenate
`||' or `or
Simbolo di alternanza, visualizza il paccheto o con questa opzione o con quest'altra