Aggiunta opzione dei socket IP introdotta con kernel 2.6.34, ed
authorSimone Piccardi <piccardi@gnulinux.it>
Fri, 26 Mar 2010 21:46:58 +0000 (21:46 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Fri, 26 Mar 2010 21:46:58 +0000 (21:46 +0000)
aggiunto un po' di materiale sul TTL dei pacchetti IP e sui pacchetti
ICMP.

netlayer.tex
sockctrl.tex

index 3344c6f531e034cc5d879e366b616138dcb8c07b..e74c1aa3d36858c00098fb7162de04b939538a46 100644 (file)
@@ -288,25 +288,49 @@ pacchetto (cio
 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
@@ -314,14 +338,40 @@ questo campo.
   \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}
@@ -1195,7 +1245,7 @@ tab.~\ref{tab:IP_ipv6_nexthead}.
       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.\\
@@ -1519,7 +1569,6 @@ direttamente su IP, ma proprio per questa sua caratteristica di protocollo di
 servizio è da considerarsi a tutti gli effetti appartenente al livello di
 rete.
 
-
 \subsection{L'intestazione di ICMP}
 \label{sec:ICMP_header}
 
@@ -1533,8 +1582,10 @@ struttura dell'intestazione di un pacchetto ICMP generico.
   \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
@@ -1546,49 +1597,56 @@ struttura dell'intestazione di un pacchetto ICMP generico.
     \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
@@ -1598,33 +1656,33 @@ struttura dell'intestazione di un pacchetto ICMP generico.
     \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.}
@@ -1641,7 +1699,7 @@ struttura dell'intestazione di un pacchetto ICMP generico.
 % 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
@@ -1651,7 +1709,7 @@ struttura dell'intestazione di un pacchetto ICMP generico.
 % 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
index 43314d8c6075584e31a51a4421835cfb547f01ee..4b24620b5b7e135c117a6900e37bcd973e2a9de8 100644 (file)
@@ -2764,6 +2764,8 @@ sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file.
       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}& 
@@ -2880,12 +2882,13 @@ sez.~\ref{sec:net_sendmsg}).
   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
@@ -2897,12 +2900,32 @@ sez.~\ref{sec:net_sendmsg}).
   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