Il campo TOS definisce il cosiddetto \textit{Type of Service}; questo permette
di definire il tipo di traffico contenuto nei pacchetti, e può essere
utilizzato dai router per dare diverse priorità in base al valore assunto da
-questo campo.
+questo campo. Abbiamo già visto come il valore di questo campo può essere
+impostato sul singolo socket con l'opzione \const{IP\_TOS} (vedi
+sez.~\ref{sec:sock_ipv4_options}), esso inoltre può essere manipolato sia dal
+sistema del \textit{netfilter} di Linux con il comando \texttt{iptables} che
+dal sistema del routing avanzato del comando \texttt{ip route} per consentire
+un controllo più dettagliato dell'instradamento dei pacchetti e l'uso di
+priorità e politiche di distribuzione degli stessi.
\begin{table}[!htb]
\centering
\footnotesize
- \begin{tabular}[c]{|l|p{6 cm}|}
+ \begin{tabular}{|l|l|p{8cm}|}
\hline
- \textbf{Costante} & \textbf{Significato} \\
+ \multicolumn{2}{|c|}{\textbf{Valore}}&\textbf{Significato}\\
\hline
\hline
- \const{IPTOS\_LOWDELAY} & Minimizza i ritardi per il traffico
- interattivo. \\
- \const{IPTOS\_THROUGHPUT} & Ottimizza la trasmissione per il massimo
- flusso di dati.\\
- \const{IPTOS\_RELIABILITY}& Ottimizza per l'affidabilità della
- trasmissione. \\
- \const{IPTOS\_MINCOST} & Usato per dati di riempimento, dove non
- interessa se c'è una bassa velocità di
- trasmissione.\\
+ \const{IPTOS\_LOWDELAY} &\texttt{0x10}& Minimizza i ritardi
+ per rendere più veloce
+ possibile la ritrasmissione
+ dei pacchetti (usato per
+ traffico interattivo di
+ controllo come SSH).\\
+ \const{IPTOS\_THROUGHPUT} &\texttt{0x8} & Ottimizza la trasmissione
+ per rendere il più elevato
+ possibile il flusso netto di
+ dati (usato su traffico dati,
+ come quello di FTP).\\
+ \const{IPTOS\_RELIABILITY} &\texttt{0x4} & Ottimizza la trasmissione
+ per ridurre al massimo le
+ perdite di pacchetti (usato su
+ traffico soggetto a rischio di
+ perdita di pacchetti come TFTP
+ o DHCP).\\
+ \const{IPTOS\_MINCOST} &\texttt{0x2} & Indica i dati di riempimento,
+ dove non interessa se si ha
+ una bassa velocità di
+ trasmissione, da utilizzare
+ per i collegamenti con minor
+ costo (usato per i protocolli
+ di streaming).\\
+ \textit{Normal-Service}&\texttt{0x0} & Nessuna richiesta specifica.\\
+ \hline
+
\hline
\end{tabular}
\caption{Le costanti che definiscono alcuni valori standard per il campo TOS
\label{tab:IP_TOS_values}
\end{table}
+I possibili valori del campo TOS, insieme al relativo significato ed alle
+costanti numeriche ad esso associati, sono riportati in
+tab.~\ref{tab:IP_TOS_values}. Per il valore nullo, usato di default per tutti
+i pacchetti, e relativo al traffico normale, non esiste nessuna costante
+associata.
+Il campo TTL, acromino di \textit{Time To Live}, viene utilizzato per
+stabilire una sorta di tempo di vita massimo dei pacchetti sulla rete. In
+realtà più che di un tempo, il campo serve a limitare il numero massimo di
+salti (i cosiddetti \textit{hop}) che un pacchetto IP può compiere nel passare
+da un router ad un altro nel suo attraversamento della rete verso la
+destinazione.
-\subsection{Le opzioni di IP}
-\label{sec:IP_options}
+Il protocollo IP prevede infatti che il valore di questo campo venga
+decrementato di uno da ciascun router che ritrasmette il pacchetto verso la
+sua destinazione, e che quando questo diventa nullo il router lo debba
+scartare, inviando all'indirizzo sorgente un pacchetto ICMP di tipo
+\textit{time-exceeded} con un codice \textit{ttl-zero-during-transit} se
+questo avviene durante il transito sulla rete o
+\textit{ttl-zero-during-reassembly} se questo avviene alla destinazione finale
+(vedi sez.~\ref{sec:ICMP_protocol}).
+In sostanza grazie all'uso di questo accorgimento un pacchetto non può
+continuare a vagare indefinitamente sulla rete, e viene comunque scartato dopo
+un certo tempo, o meglio, dopo che ha attraversato in certo numero di
+router. Nel caso di Linux il valore iniziale utilizzato normalmente è 64 (vedi
+sez.~\ref{sec:sock_ipv4_sysctl}).
+\subsection{Le opzioni di IP}
+\label{sec:IP_options}
+
+Da fare ...
\section{Il protocollo IPv6}
0 & & Riservato.\\
& HBH & Hop by Hop.\\
1 & ICMP & Internet Control Message (IPv4 o IPv6).\\
- 2 & ICMP & Internet Group Management (IPv4).\\
+ 2 & IGMP & Internet Group Management (IPv4).\\
3 & GGP & Gateway-to-Gateway.\\
4 & IP & IP in IP (IPv4 encapsulation).\\
5 & ST & Stream.\\
servizio è da considerarsi a tutti gli effetti appartenente al livello di
rete.
-
\subsection{L'intestazione di ICMP}
\label{sec:ICMP_header}
\label{fig:ICMP_header}
\end{figure}
-
-
+Ciascun pacchetto ICMP è contraddistinto dal valore del primo campo, il tipo,
+che indica appunto che tipo di messaggio di controllo viene veicolato dal
+pacchetto in questione; i valori possibili per questo campo, insieme al
+relativo significato, sono riportati in tab.~\ref{tab:ICMP_type}.
\begin{table}[!htb]
\centering
\hline
\texttt{any} & -- & Seleziona tutti i possibili valori \\
\hline
- \texttt{echo-reply} &0& Inviato in risposta ad un ICMP
+ \textit{echo-reply} &0& Inviato in risposta ad un ICMP
\textit{echo-request}.\\
- \texttt{destination-unreachable}&3& Segnala una destinazione
+ \textit{destination-unreachable}&3& Segnala una destinazione
irraggiungibile, viene
inviato all'IP sorgente di un
pacchetto quando un router realizza
che questo non può essere inviato a
destinazione.\\
- \texttt{source-quench} &4& Inviato in caso di congestione della
+ \textit{source-quench} &4& Inviato in caso di congestione della
rete per indicare all'IP sorgente di
diminuire il traffico inviato.\\
- \texttt{redirect} &5& Inviato per segnalare un errore di
+ \textit{redirect} &5& Inviato per segnalare un errore di
routing, richiede che la macchina
sorgente rediriga il traffico ad un
altro router da esso specificato.\\
- \texttt{echo-request} &8& Richiede l'invio in risposta di un
- \texttt{echo-reply}.\\
-% \texttt{router-advertisement} & & \\
-% \texttt{router-solicitation} & & \\
- \texttt{time-exceeded} &11& Inviato quando il TTL di un pacchetto
+ \textit{echo-request} &8& Richiede l'invio in risposta di un
+ \textit{echo-reply}.\\
+% \textit{router-advertisement} & & \\
+% \textit{router-solicitation} & & \\
+ \textit{time-exceeded} &11& Inviato quando il TTL di un pacchetto
viene azzerato.\\
- \texttt{parameter-problem} &12& Inviato da un router che rileva dei
+ \textit{parameter-problem} &12& Inviato da un router che rileva dei
problemi con l'intestazione di un
pacchetto.\\
- \texttt{timestamp-request} &13& Richiede l'invio in risposta di un
- \texttt{timestamp-reply}.\\
- \texttt{timestamp-reply} &14& Inviato in risposta di un
- \texttt{timestamp-request}.\\
- \texttt{info-request} &15& Richiede l'invio in risposta di un
- \texttt{info-reply}.\\
- \texttt{info-reply} &16& Inviato in risposta di un
- \texttt{info-request}.\\
- \texttt{address-mask-request} &17& Richiede l'invio in risposta di un
- \texttt{address-mask-reply}.\\
- \texttt{address-mask-reply} &18& Inviato in risposta di un
- \texttt{address-mask-request}.\\
+ \textit{timestamp-request} &13& Richiede l'invio in risposta di un
+ \textit{timestamp-reply}.\\
+ \textit{timestamp-reply} &14& Inviato in risposta di un
+ \textit{timestamp-request}.\\
+ \textit{info-request} &15& Richiede l'invio in risposta di un
+ \textit{info-reply}.\\
+ \textit{info-reply} &16& Inviato in risposta di un
+ \textit{info-request}.\\
+ \textit{address-mask-request} &17& Richiede l'invio in risposta di un
+ \textit{address-mask-reply}.\\
+ \textit{address-mask-reply} &18& Inviato in risposta di un
+ \textit{address-mask-request}.\\
\hline
\end{tabular}
\caption{I valori del \textsl{tipo} per i pacchetti ICMP.}
\label{tab:ICMP_type}
\end{table}
-
+Per alcuni tipi di messaggi ICMP, esiste un secondo campo, detto codice, che
+specifica ulteriormente la natura del messaggio; i soli messaggi che
+utilizzano un valore per questo campo sono quelli di tipo
+\textit{destination-unreachable}, \textit{redirect}, \textit{time-exceeded} e
+\textit{parameter-problem}. I possibili valori del codice relativi a ciascuno
+di essi sono stati riportati nelle quattro sezioni in cui si è suddivisa
+tab.~\ref{tab:ICMP_code}, rispettivamente nell'ordine con cui sono appena
+elencati i tipi a cui essi fanno riferimento.
\begin{table}[!htb]
\centering
\textbf{Valore}&\textbf{Codice}\\
\hline
\hline
- \texttt{network-unreachable} &0\\
- \texttt{host-unreachable} &1\\
- \texttt{protocol-unreachable} &2\\
- \texttt{port-unreachable} &3 \\
- \texttt{fragmentation-needed} &4\\
- \texttt{source-route-failed} &5\\
- \texttt{network-unknown} &6\\
- \texttt{host-unknown} &7\\
- \texttt{host-isolated} &8\\
- \texttt{network-prohibited} &9\\
- \texttt{host-prohibited} &10 \\
- \texttt{TOS-network-unreachable} &11 \\
- \texttt{TOS-host-unreachable} &12 \\
- \texttt{communication-prohibited} &13 \\
- \texttt{host-precedence-violation}&14 \\
- \texttt{precedence-cutoff} &15 \\
+ \textit{network-unreachable} &0\\
+ \textit{host-unreachable} &1\\
+ \textit{protocol-unreachable} &2\\
+ \textit{port-unreachable} &3 \\
+ \textit{fragmentation-needed} &4\\
+ \textit{source-route-failed} &5\\
+ \textit{network-unknown} &6\\
+ \textit{host-unknown} &7\\
+ \textit{host-isolated} &8\\
+ \textit{network-prohibited} &9\\
+ \textit{host-prohibited} &10 \\
+ \textit{TOS-network-unreachable} &11 \\
+ \textit{TOS-host-unreachable} &12 \\
+ \textit{communication-prohibited} &13 \\
+ \textit{host-precedence-violation}&14 \\
+ \textit{precedence-cutoff} &15 \\
\hline
- \texttt{network-redirect} &0 \\
- \texttt{host-redirect} &1 \\
- \texttt{TOS-network-redirect} &2 \\
- \texttt{TOS-host-redirect} &3 \\
+ \textit{network-redirect} &0 \\
+ \textit{host-redirect} &1 \\
+ \textit{TOS-network-redirect} &2 \\
+ \textit{TOS-host-redirect} &3 \\
\hline
- \texttt{ttl-zero-during-transit} &0 \\
- \texttt{ttl-zero-during-reassembly}&1 \\
+ \textit{ttl-zero-during-transit} &0 \\
+ \textit{ttl-zero-during-reassembly}&1 \\
\hline
- \texttt{ip-header-bad} &0 \\
- \texttt{required-option-missing} &1 \\
+ \textit{ip-header-bad} &0 \\
+ \textit{required-option-missing} &1 \\
\hline
\end{tabular}
\caption{Valori del campo \textsl{codice} per il protocollo ICMP.}
% LocalWords: destination identification fragment checksum TCP UDP ICMPv type
% LocalWords: service head total fragmentation protocol broadcast broadcasting
% LocalWords: multicasting path MTU discovery NSAP IPX based geografic local
-% LocalWords: routing format prefix Registry Subscriber Intra Regional
+% LocalWords: routing format prefix Registry Subscriber Intra Regional SSH
% LocalWords: Register INTERNIC NCC APNIC subscriber Interface MAC address Reg
% LocalWords: Subnet Naz Prov Subscr FEBF bootstrap FEC FEFF DNS socket FFFF
% LocalWords: sull'host loopback scop all nodes routers rip cbt name dhcp HBH
% LocalWords: Encrypted Security IGRP OSPF Short First tunnelling FFFFFF hash
% LocalWords: news FTP NFS authentication Parameter Index ICV Integrity Value
% LocalWords: padding Option gateway dell'MD keyed Encripted IEEE ethernet any
-% LocalWords: Solicitation
+% LocalWords: Solicitation netfilter iptables TFTP streaming Normal IGMP
% LocalWords: stateless solicitation Advertisement stateful Transfer Unit echo
% LocalWords: l'autoconfigurazione reply request unreachable all'IP quench TTL
% LocalWords: redirect exceeded parameter problem timestamp info mask port ttl
Imposta il valore del campo TOS.\\
\const{IP\_TTL} &$\bullet$&$\bullet$& &\texttt{int}&
Imposta il valore del campo TTL.\\
+ \const{IP\_MINTTL} &$\bullet$&$\bullet$& &\texttt{int}&
+ Imposta il valore minimo del TTL per i pacchetti accettati.\\
\const{IP\_HDRINCL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Passa l'intestazione di IP nei dati.\\
\const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
supportata per socket di tipo \const{SOCK\_STREAM}.
\item[\const{IP\_TOS}] L'opzione consente di leggere o impostare il campo
- \textit{Type of Service} dell'intestazione IP (vedi
- sez.~\ref{sec:IP_header}) che permette di indicare le priorità dei
- pacchetti. Se impostato il valore verrà mantenuto per tutti i pacchetti del
- socket; alcuni valori (quelli che aumentano la priorità) richiedono i
- privilegi di amministrazione con la \itindex{capabilities} capability
- \const{CAP\_NET\_ADMIN}.
+ \textit{Type of Service} dell'intestazione IP (per una trattazione più
+ dettagliata, che riporta anche i valori possibili e le relative costanti di
+ definizione si veda sez.~\ref{sec:IP_header}) che permette di indicare le
+ priorità dei pacchetti. Se impostato il valore verrà mantenuto per tutti i
+ pacchetti del socket; alcuni valori (quelli che aumentano la priorità)
+ richiedono i privilegi di amministrazione con la \itindex{capabilities}
+ capability \const{CAP\_NET\_ADMIN}.
Il campo TOS è di 8 bit e l'opzione richiede per \param{optval} un intero
che ne contenga il valore. Sono definite anche alcune costanti che
dal protocollo utilizzando l'opzione \const{SO\_PRIORITY} illustrata in
sez.~\ref{sec:sock_generic_options}.
-\item[\const{IP\_TTL}] L'opzione consente di leggere o impostare il campo
- \textit{Time to Live} dell'intestazione IP (vedi sez.~\ref{sec:IP_header})
- per tutti i pacchetti associati al socket. Il campo TTL è di 8 bit e
+\item[\const{IP\_TTL}] L'opzione consente di leggere o impostare per tutti i
+ pacchetti associati al socket il campo \textit{Time to Live}
+ dell'intestazione IP che indica il numero massimo di \textit{hop} (passaggi
+ da un router ad un altro) restanti al paccheto (per una trattazione più
+ estesa si veda sez.~\ref{sec:IP_header}). Il campo TTL è di 8 bit e
l'opzione richiede che \param{optval} sia un intero, che ne conterrà il
valore.
+\item[\const{IP\_MINTTL}] L'opzione, introdotta con il kernel 2.6.34, imposta
+ un valore minimo per il campo \textit{Time to Live} dei pacchetti associati
+ al socket su cui è attivata, che se non rispettato ne causa lo scarto
+ automatico. L'opzione è nata per implementare
+ l'\href{http://www.ietf.org/rfc/rfc5082.txt}{RFC~5082} che la prevede come
+ forma di protezione per i router che usano il protocollo BGP poiché questi,
+ essendo in genere adiacenti, possono, impostando un valore di 255, scartare
+ automaticamente tutti gli eventuali pacchetti falsi creati da un attacco a
+ questo protocollo, senza doversi curare di verificarne la
+ validità.\footnote{l'attacco viene in genere portato per causare un
+ \textit{Denial of Service} aumentando il consumo di CPU del router nella
+ verifica dell'autenticità di un gran numero di pacchetti di pacchetti
+ falsi; questi, arrivando da sorgenti diverse da un router adiacente, non
+ potrebbero più avere un TTL di 255 anche qualora questo fosse stato il
+ valore di partenza, e l'impostazione dell'opzione consente di scartarli
+ senza carico aggiuntivo sulla CPU (che altrimenti dovrebbe calcolare una
+ checksum).}
+
\item[\const{IP\_HDRINCL}] Se abilitata l'utente deve fornire lui stesso
l'intestazione IP in cima ai propri dati. L'opzione è valida soltanto per
socket di tipo \const{SOCK\_RAW}, e quando utilizzata eventuali valori