From: Simone Piccardi Date: Fri, 26 Mar 2010 21:46:58 +0000 (+0000) Subject: Aggiunta opzione dei socket IP introdotta con kernel 2.6.34, ed X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=94694d98edcc5cb0954f17408efccdc1aeba2c5f Aggiunta opzione dei socket IP introdotta con kernel 2.6.34, ed aggiunto un po' di materiale sul TTL dei pacchetti IP e sui pacchetti ICMP. --- diff --git a/netlayer.tex b/netlayer.tex index 3344c6f..e74c1aa 100644 --- a/netlayer.tex +++ b/netlayer.tex @@ -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 diff --git a/sockctrl.tex b/sockctrl.tex index 43314d8..4b24620 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -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