Libero
Avanti Indietro Indice

3. Nuovi match

In questa sezione si cercherà di spiegare come utilizzare i nuovi match di netfilter, le patch appariranno in ordine alfabetico, inoltre non saranno spiegate quelle patch che corrompono le altre, ciò potrebbe avvenire più avanti.

Parlando in termini generali, e a riguardo dei match, si possono ottenere dei suggerimenti sull'utilizzo di un particolare modulo utilizzando:

# iptables -m il_match_desiderato --help

Questo comando dovrebbe visualizzare il messaggio di aiuto classico di iptables e alla fine le informazioni di aiuto riguardanti il match ``il_match_desiderato''.

3.1 ah-esp patch

Questa patch di Yon Uriarte <yon@astaro.de> aggiunge 2 nuovi match:

Questa patch potrebbe essere di grande aiuto alle persone che utilizzano IPSEC e che desiderano discriminare le connessioni in base allo SPI.

Ad esempio, per scartare tutti i pacchetti AH che hanno uno SPI uguale a 500 si utilizzi:

# iptables -A INPUT -p 51 -m ah --ahspi 500 -j DROP

# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       ipv6-auth--  anywhere             anywhere           ah spi:500

Le opzioni supportare dal match ah sono:

--ahspi [!] spi[:spi]

-> spi da selezionare (intervallo)

Il match esp funziona esattamente allo stesso modo:

# iptables -A INPUT -p 50 -m esp --espspi 500 -j DROP

# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       ipv6-crypt--  anywhere             anywhere           esp spi:500

Le opzioni supportate dal match esp sono:

--espspi [!] spi[:spi]

-> spi da utilizzare per la selezione (intervallo)

Non si dimentichi, quando si utilizzano i match ah oppure esp, di specificare il protocollo appropriato utilizzando ``-p 50'' oppure ``-p 51'' (rispettivamente per esp & ah), altrimenti l'inserimento della regola fallirà per ovvi motivi.

3.2 conntrack patch

Questa patch di Marc Boucher <marc+nf@mbsi.ca> aggiunge un nuovo modulo conntrack (un'estensione del match state) che consente di selezionare i pacchetti in base ad ulteriori informazioni di tracciamento.

Ad esempio, se si desidera consentire tutte le connessioni RELATED che utilizzano esclusivamente il protocollo TCP si proceda in questo modo:

# iptables -A FORWARD -m conntrack --ctstate RELATED --ctproto tcp -j ACCEPT

# iptables --list
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere           ctstate RELATED

Le opzioni supportate dal match conntrack sono:

[!] --ctstate [INVALID|ESTABLISHED|NEW|RELATED|SNAT|DNAT][,...]

-> Stato(i) da utilizzare. Gli stati "new" `SNAT' e `DNAT' sono virtuali, sono soddisfatti se l'indirizzo sorgente originale differisce dalla destinazione del pacchetto di risposta, oppure se la destinazione originale differisce dalla sorgente del pacchetto di risposta.

[!] --ctproto proto

-> Protocollo che deve essere soddisfatto, indicato per numero o nome, es. `tcp'.

--ctorigsrc [!] address[/mask]

-> Sorgente originale.

--ctorigdst [!] address[/mask]

-> Destinazione originale.

--ctreplsrc [!] address[/mask]

-> Sorgente del pacchetto di risposta.

--ctrepldst [!] address[/mask]

-> Destinazione del pacchetto di risposta.

[!] --ctstatus [NONE|EXPECTED|SEEN_REPLY|ASSURED][,...]

-> Condizione(i) del match.

[!] --ctexpire time[:time]

-> Durata rimanente del match espressa in secondi utilizzando uno o un intervallo di valori (estremi inclusi).

3.3 iplimit patch

Questa patch di Gerd Knorr <kraxel@bytesex.org> aggiunge un nuovo match che consente di limitare il numero di connessioni TCP parallele provenienti da un particolare host o da una determinata rete.

Ad esempio, per limitare a 4 il numero di connessioni HTTP parallele provenienti da un singolo indirizzo IP si utilizzi:

# iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-above 4 -j REJECT

# iptables --list
Chain INPUT (policy ACCEPT)
target   prot opt source    destination         
REJECT   tcp  --  anywhere  anywhere     tcp dpt:http flags:SYN,RST,ACK/SYN #conn/32 > 4 reject-with icmp-port-unreachable

Si potrebbe anche desiderare di limitare il numero di connessioni parallele provenienti da un'intera classe A, esempio:

# iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-mask 8 --iplimit-above 4 -j REJECT

# iptables --list
Chain INPUT (policy ACCEPT)
target   prot opt source    destination         
REJECT   tcp  --  anywhere  anywhere     tcp dpt:http flags:SYN,RST,ACK/SYN #conn/8 > 4 reject-with icmp-port-unreachable

Le opzioni supportare dalla patch iplimit sono:

[!] --iplimit-above n

-> regola soddisfatta se il numero di connessioni tcp (non) è maggiore di n.

--iplimit-mask n

-> gruppo di host utilizzando la maschera

3.4 ipv4options patch

Questa patch realizzata da Fabrice MARIE <fabrice@celestix.com> aggiunge un nuovo match che consente di selezionare i pacchetti in base alle opzioni IP impostate.

Ad esempio, per scartare tutti i pacchetti che hanno le opzioni IP record-route o timestamp impostate si utilizzi:

# iptables -A INPUT -m ipv4options --rr -j DROP
# iptables -A INPUT -m ipv4options --ts -j DROP

# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere            IPV4OPTS RR
DROP       all  --  anywhere             anywhere            IPV4OPTS TS

Le opzioni supportare dal match ipv4options sono:

--ssrr

-> seleziona in base all'opzione strict source route.

--lsrr

-> seleziona in base all'opzione loose source route.

--no-srr

-> seleziona i pacchetti no source route.

--rr

-> seleziona in base all'opzione record route.

[!] --ts

-> seleziona in base all'opzione timestamp.

[!] --ra

-> seleziona in base all'opzione router-alert.

[!] --any-opt

-> seleziona i pacchetti aventi almeno un'opzione IP (o che non presentano alcuna opzione IP nel caso si utilizzi ! ).

3.5 length patch

Questa patch realizzata da James Morris <jmorris@intercode.com.au> aggiunge un nuovo match che consente di selezionare un pacchetto in base alla sua dimensione.

Ad esempio, scartiamo tutti i ping aventi una dimensione maggiore di 85 byte:

# iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 85:0xffff -j DROP

# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       icmp --  anywhere             anywhere           icmp echo-request length 85:65535

Le opzioni supportate dal match length sono le seguenti:

[!] --length length[:length]

-> seleziona i pacchetti in base al valore o all'intervallo di valori (estremi inclusi) specificati.

I valori dell'intervallo non specificati sono sottointesi. Il valore minimo sottointeso è 0 mentre il valore massimo è 65535.

3.6 mport patch

Questa patch realizzata da Andreas Ferber <af@devcon.net> aggiunge un nuovo match che consente di specificare le porte utilizzando un mix tra intervalli di porte e porte singole per protocolli UDP e TCP.

Ad esempio, se si desidera bloccare ftp, ssh, telnet e http utilizzando un solo comando si utilizzi:

# iptables -A INPUT -p tcp -m mport --ports 20:23,80 -j DROP

# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  --  anywhere             anywhere           mport ports ftp-data:telnet,http

Le opzioni supportate dal match mport sono le seguenti:

--source-ports port[,port:port,port...]

-> porta(e) sorgenti che devono essere soddisfatte

--sports port[,port:port,port...]

-> porta(e) sorgenti

--destination-ports port[,port:port,port...]

-> porta(e) destinazione

--dports port[,port:port,port...]

-> porta(e) destinazione

--ports port[,port:port,port]

-> porte(e) sia sorgenti sia di destinazione

3.7 nth patch

Questa patch sviluppata da Fabrice MARIE <fabrice@celestix.com> aggiunge un nuovo match che consente di selezionare un particolare n-esimo pacchetto ricevuto da una regola.

Ad esempio, se si desidera scartare ogni 2 pacchetti ping si può utilizzare il comando:

# iptables -A INPUT -p icmp --icmp-type echo-request -m nth --every 2 -j DROP

# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  anywhere             anywhere           icmp echo-request every 2th 

Le estensioni di Richard Wagner <rwagner@cloudnet.com> mettono a disposizione un metodo rapido e semplice per implementare il load-balancing sia per le connessioni in entrata che in uscita.

Ad esempio, se si desidera bilanciare il traffico tra i 3 indirizzi 10.0.0.5, 10.0.0.6 e 10.0.0.7 si possono utilizzare i seguenti comandi:

# iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 0 -j SNAT --to-source 10.0.0.5
# iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 1 -j SNAT --to-source 10.0.0.6
# iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 2 -j SNAT --to-source 10.0.0.7

# iptables -t nat --list
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  anywhere             anywhere           every 3th packet #0 to:10.0.0.5 

SNAT       all  --  anywhere             anywhere           every 3th packet #1 to:10.0.0.6 
SNAT       all  --  anywhere             anywhere           every 3th packet #2 to:10.0.0.7 

Le opzioni supportate dal match nth sono:

--every Nth

-> seleziona un pacchetto ogni Nth pacchetti.

[--counter] num

-> Usa un contatore 0-15 (default: 0).

[--start] num

-> Inizializza il contatore con il valore `num' invece che con 0. Deve essere compreso tra 0 e (Nth-1).

[--packet] num

-> Seleziona il pacchetto numero `num'. Deve essere compreso tra 0 e Nth-1. Se si utilizza `--packet' come contatore, allora dovranno essere presenti Nth regole con specificata l'opzione --packet, in modo da coprire tutti i valori tra 0 e (Nth-1) compresi.

3.8 pkttype patch

Questa patch di Michal Ludvig <michal@logix.cz> aggiunge un nuovo match che consente di selezionare i pacchetti in base al loro tipo: host/broadcast/multicast.

Se si desidera ad esempio scartare silenziosamente tutti i pacchetti broadcast:

# iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP

# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere           PKTTYPE = broadcast 

Le opzioni supportate dal match sono:

--pkt-type [!] packettype

-> seleziona i pacchetti in base ad uno dei seguenti tipi:

host

-> un computer in particolare

broadcast

-> tutti

multicast

-> gruppo di computer

3.9 pool patch

Patch sviluppata da Patrick Schaaf <bof@bof.de>. Joakim Axelsson e Patrick stanno riscrivendo questa patch quindi completeranno questa sezione appena terminato.

3.10 psd patch

Questa patch realizzata da Dennis Koslowski <dkoslowski@astaro.de> aggiunge un nuovo match da utilizzare per scoprire eventuali scansioni delle porte.

Nella sua forma di utilizzo più semplice il match psd può essere utilizzato in questo modo:

# iptables -A INPUT -m psd -j DROP

# iptables --list
Chain INPUT (policy ACCEPT)
target  prot opt source    destination
DROP    all  --  anywhere  anywhere    psd weight-threshold: 21 delay-threshold: 300 lo-ports-weight: 3 hi-ports-weight: 1

Le opzioni disponibili per il match psd sono le seguenti:

[--psd-weight-threshold threshold]

-> soglia che indica un caso di portscan

[--psd-delay-threshold delay]

-> soglia di ritardo che indica un caso di portscan

[--psd-lo-ports-weight lo]

-> "Peso" porte privilegiate

[--psd-hi-ports-weight hi]

-> "Peso" porte non privilegiate

3.11 quota patch

Questa patch realizzata da Sam Johnston <samj@samj.net> aggiunge un nuovo match che consente di impostare una quota. Una volta raggiunta la quota specificata la regola non sarà più soddisfatta.

Ad esempio, se si desidera limitare la quota di traffico http in entrata a 50MB si utilizzi:

# iptables -A INPUT -p tcp --dport 80 -m quota --quota 52428800 -j ACCEPT
# iptables -A INPUT -p tcp --dport 80 -j DROP
    
# iptables --list 
Chain INPUT (policy ACCEPT) 
target     prot opt source               destination          
ACCEPT     tcp  --  anywhere             anywhere           tcp dpt:http quota: 52428800 bytes 
DROP       tcp  --  anywhere             anywhere           tcp dpt:http  

Le opzioni disponibili per il match quota sono le seguenti:

--quota quota

-> Quota che si desidera impostare

3.12 random patch

Questa patch realizzata da Fabrice MARIE <fabrice@celestix.com> aggiunge un nuovo match che consente di selezionare un pacchetto in modo casuale in base ad una data probabilità.

Ad esempio, se si desidera scartare il 50% dei ping in modo casuale si può utilizzare il seguente comando:

# iptables -A INPUT -p icmp --icmp-type echo-request -m random --average 50 -j DROP

# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source       destination
DROP       icmp --  anywhere     anywhere        icmp echo-request  random 50%

Le opzioni disponibili con il match random sono le seguenti:

[--average percent]

-> Probabilità di selezione espressa in percentuale. Se non specificata, sarà utilizzata una percentuale del 50%. Il valore percentuale deve essere compreso nel seguente intervallo: 1 <= % <= 99.

3.13 realm patch

Questa patch realizzata da Sampsa Ranta <sampsa@netsonic.fi> aggiunge un nuovo match che consente di utilizzare una realm key di instradamento come criterio di selezione di un pacchetto in modo simile a quanto avviene con i classificatori di pacchetto.

Ad esempio, per registrare tutti i pacchetti in uscita aventi una realm di 10 si potrebbe utilizzare:

# iptables -A OUTPUT -m realm --realm 10 -j LOG

# iptables --list
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere           REALM match 0xa LOG level warning

Le opzioni disponibili con il match realm sono le seguenti:

--realm [!] value[/mask]

-> valore realm

3.14 recent patch

Questa patch realizzata da Stephen Frost <sfrost@snowman.net> aggiunge un nuovo match che consente di creare dinamicamente una lista di indirizzi IP e quindi di effettuare in base ad essa, e in diversi modi, la selezione dei pacchetti.

Ad esempio, si può creare una lista `badguy' di persone che cercano di stabilire una connessione alla porta 139 del proprio firewall e quindi scartare (DROP) tutti i pacchetti futuri provenienti da essi senza neppure considerarli.

 
# iptables -A FORWARD -m recent --name badguy --rcheck --seconds 60 -j DROP 
# iptables -A FORWARD -p tcp -i eth0 --dport 139 -m recent --name badguy --set -j DROP 
    
# iptables --list 
Chain FORWARD (policy ACCEPT) 
target     prot opt source               destination 
DROP       all  --  anywhere             anywhere           recent: CHECK seconds: 60 
DROP       tcp  --  anywhere             anywhere           tcp dpt:netbios-ssn recent: SET 

Le opzioni supportate dal match recent sono le seguenti:

--name name

-> Serve per specificare il nome della lista da utilizzare per i comandi. Se non viene specificato alcun nome allora sarà utilizzato 'DEFAULT'.

[!] --set

-> Questa opzione aggiunge l'indirizzo sorgente del pacchetto alla lista. Se l'indirizzo sorgente è già presente nella lista, questa opzione effettuerà l'aggiornamento della voce. Sarà sempre restituito un valore di successo oppure fallimento nel caso si utilizzi `!'.

[!] --rcheck

-> Se si specifica questa opzione allora sarà controllato se l'indirizzo sorgente del pacchetto è già presente nella lista, inoltre verrà restituito vero se presente, falso in caso contrario. L'opposto se si specifica `!'.

[!] --update

-> Questa opzione controlla se l'indirizzo sorgente del pacchetto è già presente nella lista, in caso affermativo la voce sarà aggiornata e la regola restituirà un valore vero. Se invece l'indirizzo sorgente non è presente allora la regola restituirà falso. L'opposto se si specifica `!'.

[!] --remove

-> Questa opzione controlla che l'indirizzo sorgente del pacchetto sia già nella lista e in caso affermativo provvede a rimuoverlo ed a restituire vero. Se l'indirizzo non viene trovato allora sarà restituito falso. L'opposto se si specifica `!'.

[!] --seconds seconds

-> Questa opzione deve essere utilizzata in congiunzione con `rcheck' oppure `update'. Quando specificata limiterà l'utilizzo del match, i pacchetti saranno selezionati solo quando l'indirizzo sarà trovato nella lista e sarà visto entro l'ultimo intervallo di secondi specificato. L'opposto se si specifica `!'.

[!] --hitcount hits

-> Questa opzione deve essere utilizzata in congiunzione con `rcheck' oppure `update'. Quando specificata limiterà l'utilizzo del match, i pacchetti saranno selezionati solo quando l'indirizzo sarà trovato nella lista e i pacchetti ricevuti saranno in numero uguale o maggiore al valore indicato. Questa opzione può essere utilizzata assieme a `seconds' per creare un criterio di selezione più restrittivo ossia che richieda un certo numero di pacchetti entro un certo intervallo di tempo. L'opposto se si specifica `!'.

--rttl

-> Questa opzione deve essere utilizzata in congiunzione con `rcheck' oppure `update'. Quando specificata limiterà l'utilizzo del match, i pacchetti saranno selezionati solo quando l'indirizzo sarà trovato nella lista e il TTL del pacchetto corrente corrisponderà al pacchetto che ha soddisfatto la regola --set. Ciò può essere utile se si hanno problemi con persone che falsificano l'indirizzo sorgente dei pacchetti allo scopo di sfruttare questo modulo per effettuare un DoS e quindi cercando di impedire altri accessi al proprio sito.

3.15 record-rpc patch

Questa patch di Marcelo Barbosa Lima <marcelo.lima@dcc.unicamp.br> aggiunge un nuovo match che consente di selezionare un pacchetto se la sorgente ha richiesto in precedenza questa porta attraverso il portmapper, oppure se è una nuova richiesta GET, consentendo quindi un effettivo filtraggio del protocollo RPC.

Per selezionare in base alle informazioni di tracciamento del protocollo RPC si utilizzi:

# iptables -A INPUT -m record_rpc -j ACCEPT

# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Il match record_rpc non ha opzioni.

Non ci si preoccupi se le informazioni sul match non vengono visualizzate ciò è dovuto al fatto che il corpo della funzione print() del match è vuoto.

/* Prints out the union ipt_matchinfo. */
static void
print(const struct ipt_ip *ip,
      const struct ipt_entry_match *match,
      int numeric)
{
}

3.16 string patch

Questa patch realizzata da Emmanuel Roger <winfield@freegates.be> aggiunge un nuovo match che consente di selezionare i pacchetti in base ad una stringa presente ovunque nel pacchetto.

Per esempio, per selezionare i pacchetti che contengono la stringa ``cmd.exe'' ovunque al loro interno e per accodarli verso un IDS nello userland si può utilizzare:

# iptables -A INPUT -m string --string 'cmd.exe' -j QUEUE

# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
QUEUE      all  --  anywhere             anywhere           STRING match cmd.exe 

Si utilizzi questo match con cautela, molte persone potrebbero pensare di utilizzare questo match per bloccare i worm sfruttando il target DROP ma ciò sarebbe un grosso errore, potrebbe essere infatti raggirato attraverso uno qualsiasi dei metodi di evasione applicabile agli IDS.

Molte persone utilizzano questo match come sistema principale per bloccare particolari funzionalità dell'HTTP quali POST o GET scartando qualsiasi pacchetto contenente la stringa POST. Si presti però attenzione al fatto che un filtering proxy gestisce in modo migliore questo sistema. In aggiunta si tenga presente che sarà scartato assieme alla parola POST anche qualsiasi altro contenuto HTML. Questo match è stato pensato per accodare e rendere disponibile allo userland quei pacchetti di un certo interesse per effettuarne un'analisi più accurata, questo è quanto. Il sistema di scartare i pacchetti può essere raggirato con uno qualsiasi dei metodi di evasione degli IDS.

Le opzioni supportate dal match string sono:

--string [!] string

-> Seleziona un pacchetto in base alla stringa indicata.

3.17 time patch

Questa patch realizzata da Fabrice MARIE <fabrice@celestix.com> aggiunge un nuovo metodo che consente di selezionare un pacchetto in base all'orario di arrivo oppure di partenza (nel caso di pacchetti generati localmente).

Ad esempio, per accettare i pacchetti che hanno un orario di arrivo compreso tra le 8:00 e le 18:00 di uno dei giorni compresi tra Lunedì e Venerdì si utilizzi:

# iptables -A INPUT -m time --timestart 8:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT

# iptables --list 
Chain INPUT (policy ACCEPT)
target     prot opt source           destination
ACCEPT     all  --  anywhere         anywhere        TIME from 8:0 to 18:0 on Mon,Tue,Wed,Thu,Fri 

Le opzioni supportate dal match time sono:

--timestart value

-> orario di apertura, formato HH:MM

--timestop value

-> orario di chiusura, formato HH:MM

--days listofdays

-> un elenco dei giorni in cui applicare la regola (case sensitive).

3.18 ttl patch

Questa patch di Harald Welte <laforge@gnumonks.org> aggiunge un nuovo match che consente di selezionare un pacchetto in base al campo TTL.

Ad esempio per registrare qualsiasi pacchetto avente un TTL inferiore a 5 si utilizzi:

# iptables -A INPUT -m ttl --ttl-lt 5 -j LOG

# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere           TTL match TTL < 5 LOG level warning

Le opzioni supportate dal match ttl sono:

--ttl-eq value

-> Valore time to live da utilizzare per la selezione

--ttl-lt value

-> Seleziona i pacchetti con TTL < value

--ttl-gt value

-> Seleziona i pacchetti con TTL > value


Avanti Indietro Indice