IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Iptables

De SergiTurWiki
Share/Save/Bookmark
Dreceres ràpides: navegació, cerca
Alert.png Aquesta wiki forma part dels materials d'un curs
Curs: DissenyXarxesLinux, LinuxAdministracioAvancada
Fitxers: iptables.pdf (iptables.odp)
Repositori SVN: http://anonymous@acacha.org/svn/LinuxAdministracioAvan%c3%a7ada/moodle/sessio4
Usuari: anonymous
Paraula de pas: sense paraula de pas
Autors: Sergi Tur Badenas

http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html http://www.techrepublic.com/blog/10things/10-iptables-rules-to-help-secure-your-linux-box/539

Contingut

Conceptes

Chains/Cadenes

Les cadenes contenen 0 o més regles (conjunt de regles o ruleset). Es poden utilitzar les següents cadenes:

  • INPUT: Tots els paquets amb destinació a la màquina que executa iptables passen per aquesta cadena (i passen diferents cops en diferents taules)
  • OUTPUT: Tots els paquets creats pel sistema que executa iptables passen per aquesta cadena (i passen diferents cops en diferents taules)
  • FORWARD: Tots els paquets que són enrutats per la màquina que executa iptables passen per aquesta cadena (i passen diferents cops en diferents taules
  • PREROUTING: Tots els paquets d'ENTRADA passen per aquesta cadena (i passen diferents cops en diferents taules) abans d'enrutar (utilitzat per DNAT)
  • POSTROUTING: Tots els paquets de SORTIDA passen per aquesta cadena (i passen diferents cops en diferents taules) abans d'enrutar (utilitzat per SNAT)

Cada cadena té el seu objectiu i s'han d'utilitzar tenint en compte aquest objectiu:

  • Per filtrar i/o manipular paquets d'entrada ho hem de fer a la cadena INPUT.
  • Per filtrar i/o manipular paquets de sortida ho hem de fer a la cadena OUTPUT.
  • En un router per filtrar i/o manipular paquets que passen pel ruter ho hem de fer a la cadena FORWARD.
  • Si volem manipular paquets abans d'executar DNAT ho hem de fer a la cadena PREROUTING
  • Si volem manipular paquets abans d'executar SNAT ho hem de fer a la cadena POSTROUTING
  • Si volem fer translacions d'adreces (NAT) d'origen (SNAT) ho hem de fer a la cadena POSTROUTING.
  • Si volem fer translacions d'adreces (NAT) de destinació (DNAT) ho hem de fer a la cadena PREROUTING.

Veieu el següent apartat (tables) per entendre la importància dels verbs filtrar i manipular.

Tables/Taules

  • filter: Aquesta taula és la responsable del filtratge (és a dir, bloquejar o permetre que un paquet continuï o no). Tots els paquets passen per la taula de filtres. La taula filtres utilitza les cadenes INPUT, OUTPUT i FORWARD.
  • nat: Aquesta és la taula de traducció d'adreces de xarxa (NAT o ip masquerade). Aquesta taula és l'encarregada de modificar les adreces dels paquets. El primer de qualsevol connexió passa per aquesta taula. Utilitza les cadenes PREROUTING, POSTROUTING i OUTPUT chain.
  • mangle: Taula de destrossa. Aquesta taula és la responsable d'altres modificacions en els paquets (P. ex. QoS (qualitat de servei)). S'utilitza per a la resta d'usos (avançats) del firewall i utilitza totes les cadenes.
  • raw: Aquesta taula s'utilitza per configurar excepcions de paquets que no han de ser controlats pel sistema de seguiment de connexions (connection tracking).

Segons això podríem parlar d'una semàntica de iptables on:

  • Filtrar: Filtrar implica acometre una acció amb un paquet però sense modificar-lo (Podem acceptar, eliminar, fer un log) Aquesta acció s'ha de fer a les taules filter i ho podem fer amb els paquets d'entrada (INPUT Chains), paquets de sortida (OUTPUT Chain) i els paquets en encaminament (FORWARD chain).
  • Manipular (mangle): Manipular vol dir fer modificacions (sobretot en les capçaleres) en els paquets. Pot servir per controlar la qualitat de servei, marcar paquets per al seu posterior processament, etc. Mangle vol dir destrossar/trossejar. Atenció, es pot modificar tot menys les adreces d'origen i destinació.
  • Traduir (NAT): és el que fa NAT. S'encarrega de modificar les adreces de destinació i origen i de conseqüentment canviar el checksum.

Policies/Polítiques

A Netfilter parlem de polítiques per defecte per a les cadenes. Les polítiques per defecte especifiquen el comportament per defecte del firewall per aquells paquets que no coincideixen amb cap norma implícitament especificada. Tenim dues polítiques:

  • ACCEPT: Acceptar el paquet si no se li aplica cap norma.
  • DROP: Denegar el paquet si no se li aplica cap norma.

TARGETS

  • ACCEPT: El paquet és acceptat. A la cadena d'entrada (INPUT) vol dir que es permet entrar el paquet, a la de sortida (OUTPUT) que es permet sortir el paquet, i a la de redirecció (FORWARD) que es permet enrutar el paquet.
  • DROP: El paquet es descarta sense més. No s'envia cap senyal d'error.
  • QUEUE: El paquet es posa a una cua de processament. Això serveix perquè altres aplicacions analitzin el paquet. Si no hi ha cap aplicació analitzant les cues l'efecte és el mateix que DROP.
  • RETURN: Passa el paquet al final de la cadena (se li aplica la política per defecte). Per a una cadena definida per l'usuari, el recorregut continua a la cadena anterior, just després de la regla que va fer saltar aquesta cadena.

Hi ha altres destinacions anomenades d'extensió:

  • REJECT: És igual que DROP però s'envia un missatge d'error a l'emissor.
  • LOG: Aquesta destinació envia el paquet a un fitxer de LOG.
  • ULOG: Igual que lg però crea un socket per tal que aplicacions d'usuari puguin rebre i processar aquest log.
  • DNAT: Modifica la destinació del paquet (IP i opcionalment el port). Només s'utilitza a les cadenes OUTPUT i POSTROUTE i dins de la taula de nat. La decisió presa per al primer paquet d'una connexió es recorda per a la resta de paquets de la mateixa connexió.
  • SNAT: Modifica l'origen del paquet (IP i opcionalment el port). Només s'utilitza a les cadenes PREROUTE i dins de la taula nat. La decisió presa per al primer paquet d'una connexió es recorda per a la resta de paquets de la mateixa connexió.
  • MASQUERADE: És una forma especial i restringida de SNAT per adreces IP dinàmiques. Quan el router no té una adreça fixa es pot utilitzar aquest mètode que el que fa és deixar-se en l'adreça IP de la interfície.
  • REPEAT: força al paquet a tornar a entra al hook

REJECT

Segons el manual:

$ man iptables
...
aprox. línia 1476
...
 REJECT
      This is used to send back an error packet in response to the matched packet: otherwise it is equivalent to DROP so it is a  termi‐
      nating  TARGET, ending rule traversal.  This target is only valid in the INPUT, FORWARD and OUTPUT chains, and user-defined chains
      which are only called from those chains.  The following option controls the nature of the error packet returned:

      --reject-with type
             The  type  given  can  be  icmp-net-unreachable,  icmp-host-unreachable,   icmp-port-unreachable,   icmp-proto-unreachable,
             icmp-net-prohibited,  icmp-host-prohibited  or  icmp-admin-prohibited  (*)  which return the appropriate ICMP error message
             (port-unreachable is the default).  The option tcp-reset can be used on rules which  only  match  the  TCP  protocol:  this
             causes  a TCP RST packet to be sent back.  This is mainly useful for blocking ident (113/tcp) probes which frequently occur
             when sending mail to broken mail hosts (which won't accept your mail otherwise).

És a dir es pot especificar el tipus de REJECT --reject-with type'. Per exemple:

$ sudo iptables -A INPUT -p tcp --dport 84 -j REJECT --reject-with icmp-host-prohibited

o:

$ sudo iptables -A OUTPUT -d 147.83.2.3 -j REJECT --reject-with icmp-host-prohibited
ping 147.83.2.3
...
From 192.168.111.2 icmp_seq=1 Destination Host Prohibited

Consulteu també ICMP.

Seguiment de connexions (connection tracking)

El seguiment de connexions (connection tracking) li permet al nucli de Linux portar la compte de totes les connexions i/o sessions lògiques de xarxa i d'aquesta manera pot relacionar els paquets que arriben amb connexions ja establertes. NAT depèn d'aquesta informació per traduir tots els paquets relacionats amb una mateixa connexió de la mateixa forma. Aquest mode permet a iptables funcionar com un firewall stateful.

El seguiment de connexions té quatre estats per als paquets que arriben:

  • NEW: Intentant crear una connexió nova.
  • ESTABLISHED: Parteix d'una connexió ja establerta.
  • RELATED: Relacionat amb una connexió establerta però realment no és part de la connexió. (Paquets ICMP)
  • INVALID: No és part d'una connexió existent i és incapaç de crear una nova connexió.

Podem controlar l'estat d'un paquet amb iptables utilitzant --state. Del manual:

$ man iptables
...

--state state
             Where  state  is a comma separated list of the connection states
             to match.  Possible states are INVALID meaning that  the  packet
             could  not  be identified for some reason which includes running
             out of memory and ICMP errors  which  don’t  correspond  to  any
             known connection, ESTABLISHED meaning that the packet is associ‐
             ated with a connection which has seen  packets  in  both  direc‐
             tions, NEW meaning that the packet has started a new connection,
             or otherwise associated with a connection  which  has  not  seen
             packets  in both directions, and RELATED meaning that the packet
             is starting a new connection, but is associated with an existing
             connection, such as an FTP data transfer, or an ICMP error.

Vegeu l'exemple #Permetre_l.27entrada_de_paquets_que_siguin_resposta_a_una_petici.C3.B3_originada_dins_d.27una_xarxa_LAN_.28connection_tracking.29.

El següent diagrama mostra el moment en què l'estat canvia a NEW i ESTABLISHEB en el cas del protocl TCP/IP:

State-tcp-connecting.jpg

i el mateix per al tancament d'una connexió:

State-tcp-closing.jpg

Els timeouts per defecte (poden variar més o menys entre sistemes):

TimeOutsTCPConnections.jpg

Podeu trobar més informació sobre les connexions TCP a la secció Protocol TCP de l'article Nivell_de_transport_TCP/IP.

Tot i que el protocol UDP no és orientat a connexió iptables també pot fer un tracking d'una sessió UDP...

Recursos:

Comanda netstat

Abans de les versions 2.4 del kernel es podia observar la taula de connexions (connection tracking) amb:

netstat -M

o

netstat --masquerade

Des de la versió 2.4 us apareixerà l'error:

$ netstat -M
netstat: no support for `ip_masquerade' on this system.

A la web:

http://cv.intellos.net/

També a:

http://code.google.com/p/conntrack-viewer/

Trobareu un programa que us permet llegir la taula de connexions. La informació es troba al fitxer:

/proc/net/ip_conntrack

Deixar passar les connexions ja establertes

De sortida:

$ sudo iptables -A OUTPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

D'entrada:

$ sudo iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

D'un router (típic amb SNAT):

$ sudo iptables -A FORWARD -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

/proc/net/ip_conntrack

Conté la taula de connexions establertes.

Podeu monitoritzar una connexió TCP amb:

$ ssh acacha.org
$ sudo watch -n 1 "cat /proc/net/ip_conntrack | grep 87.98.230.185"

Quina mida té la taula de connexions?

Es pot consultar a:

$ cat /proc/sys/net/ipv4/ip_conntrack_max

Sembla ser de la RAM com es comenta a:

"How many connections that the connection tracking table can hold depends upon a variable that can be set through 
the ip-sysctl functions in recent kernels. The default value held by this entry varies heavily depending on how 
much memory you have. On 128 MB of RAM you will get 8192 possible entries, and at 256 MB of RAM, you will get 
16376 entries. You can read and set your settings through the /proc/sys/net/ipv4/ip_conntrack_max setting."

Una altra opció per determinar la mida és modificar el hashsize:

# modprobe ip_conntrack hashsize=4096
# cat /proc/sys/net/ipv4/ip_conntrack_max
32768

Atenció:

El fitxer també pot ser:

/proc/sys/net/ipv4/netfilter/ip_conntrack_max

o

/proc/sys/net/netfilter/nf_conntrack_max

A different way of doing this, that is more efficient, is to set the hashsize option to the ip_conntrack module once this is loaded. Under normal circumstances ip_conntrack_max equals 8 * hashsize. In other words, setting the hashsize to 4096 will result in ip_conntrack_max being set to 32768 conntrack entries. An example of this would be:

# modprobe ip_conntrack hashsize=4096
# cat /proc/sys/net/ipv4/ip_conntrack_max
32768

NOTA: El modul pot ser que s'anomeni nf_conntrack_ipv4  ?

$ lsmod | grep conn
nf_conntrack_ipv4      21900  20 iptable_nat,nf_nat
nf_conntrack           72032  5 ipt_MASQUERADE,xt_state,iptable_nat,nf_nat,nf_conntrack_ipv4

Conèixer el nombre d'entrades a la taula de connexions

$ sudo wc -l /proc/net/ip_conntrack
31 /proc/net/ip_conntrack
$ cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count 
31

Valors per defecte:

Default value of CONNTRACK_MAX
 
On i386 architecture, CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 =
RAMSIZE (in MegaBytes) * 64.
So for example, a 32 bits PC with 512MB of RAM can handle 512*1024^2/16384 =
512*64 = 32768 simultaneous netfilter connections by default.

But the real formula is:
CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (x / 32)
where x is the number of bits in a pointer (for example, 32 or 64 bits) 

Please note that:
- default CONNTRACK_MAX value will not be inferior to 128
- for systems with more than 1GB of RAM, default CONNTRACK_MAX value is
  limited to 65536 (but can of course be set to more manually).
Default value of HASHSIZE
 
By default, CONNTRACK_MAX = HASHSIZE * 8.  This means that there is an average
of 8 conntrack entries per linked list (in the optimal case, and when
CONNTRACK_MAX is reached), each linked list being a hash table entry
(a bucket). 
 
On i386 architecture, HASHSIZE = CONNTRACK_MAX / 8 =
RAMSIZE (in bytes) / 131072 = RAMSIZE (in MegaBytes) * 8.
So for example, a 32 bits PC with 512MB of RAM can store 512*1024^2/128/1024 =
512*8 = 4096 buckets (linked lists)

But the real formula is:
HASHSIZE = CONNTRACK_MAX / 8 = RAMSIZE (in bytes) / 131072 / (x / 32)
where x is the number of bits in a pointer (for example, 32 or 64 bits)

Please note that:
- default HASHSIZE value will not be inferior to 16
- for systems with more than 1GB of RAM, default HASHSIZE value is limited
  to 8192 (but can of course be set to more manually).


Reading CONNTRACK_MAX and HASHSIZE

Current CONNTRACK_MAX value can be read at runtime, via the /proc filesystem.

Before Linux kernel version 2.4.23, use:
# cat /proc/sys/net/ipv4/ip_conntrack_max

Since Linux kernel version 2.4.23 (thus Linux 2.6 as well), use:
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
 (old /proc/sys/net/ipv4/ip_conntrack_max is then deprecated!)


Current HASHSIZE is always available (for every kernel version) in syslog
messages, as the number of buckets (which is HASHSIZE) is printed there at
ip_conntrack initialization.
Since Linux kernel version 2.4.24 (thus Linux 2.6 as well), current HASHSIZE
value can be read at runtime with:
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets


Modifying CONNTRACK_MAX and HASHSIZE

Default CONNTRACK_MAX and HASHSIZE values are reasonable for a typical host,
but you may increase them on high-loaded firewalling-only systems.
So CONNTRACK_MAX and HASHSIZE values can be changed manually if needed. 

While accessing a bucket is a constant time operation (hence the interest
of having a hash of lists), keep in mind that the kernel has to iterate over
a linked list to find a conntrack entry.  So the average size of a linked
list (CONNTRACK_MAX/HASHSIZE in the optimal case when the limit is reached)
must not be too big.  This ratio is set to 8 by default (when values are
computed automatically).
On systems with enough memory and where performance really matters, you can
consider trying to get an average of one conntrack entry per hash bucket,
which means HASHSIZE = CONNTRACK_MAX. 

Setting CONNTRACK_MAX

Conntrack entries are stored in linked lists, so the maximum number of
conntrack entries (CONNTRACK_MAX) can be easily configured dynamically.
 
Before Linux kernel version 2.4.23, use:
# echo $CONNTRACK_MAX > /proc/sys/net/ipv4/ip_conntrack_max

Since Linux kernel version 2.4.23 (thus Linux 2.6 as well), use:
# echo $CONNTRACK_MAX > /proc/sys/net/ipv4/netfilter/ip_conntrack_max

where $CONNTRACK_MAX is an integer.

Setting HASHSIZE

For mathematical reasons, hash tables have static sizes.  So HASHSIZE must be
determined before the hash table is created and begins to be filled.

Before Linux kernel version 2.4.21, a prime number should be chosen for hash
size, ensuring that the hash table will be efficiently populated. Odd
non-prime numbers or even numbers are strongly discouraged, as the hash
distribution will be sub-optimal. 

Since Linux kernel version 2.4.21 (thus Linux 2.6 as well), conntrack
uses jenkins2b hash algorithm which is happy with all sizes, but power
of 2 works best.
  

If netfilter conntrack is statically compiled in the kernel, the hash table
size can be set at compile time, or (since kernel 2.6) as a boot option with
ip_conntrack.hashsize=$HASHSIZE 
  

If netfilter conntrack is compiled as a module, the hash table size can be
set at module insertion, with the following command:
# modprobe ip_conntrack hashsize=$HASHSIZE

where $HASHSIZE is an integer.  

Since 2.6.14, it is possible to set hashsize dynamically at runtime,
after boot and module load. 

Between 2.6.14 and 2.6.19 (included), use:
# echo $HASHSIZE > /sys/module/ip_conntrack/parameters/hashsize

Since 2.6.20, use:
# echo $HASHSIZE > /sys/module/nf_conntrack/parameters/hashsize

Modificar els timeouts

Fitxers:

/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_recv
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close_wait
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_last_ack
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_time_wait
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_max_retrans
...
/proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout
...
/proc/sys/net/ipv4/netfilter/ip_conntrack_icmp_timeout

Recordeu que es poden modificar amb sysctl

Recursos:

conntrack-tools

$ sudo apt-get install conntrack-tools

Ara (--acacha 11:59, 11 abr 2010 (UTC)) sembla que és:

$ sudo apt-get install conntrack

Consultar el fitxer de conntrack (/proc/net/ip_conntrack) directament

$ sudo conntrack -L

Exemples:

$ sudo conntrack -L -p tcp --dport 34856

Consultar les connexions en directe:

$ sudo conntrack -E

netstat-nat

Consulteu netstat-nat.

NAT

Per tal de consultar com es pot fer NAT amb iptables la millor font de documentació és instal·lar iptables (si per alguna raó estranya encara no el tenim ;-) ) i consultar el document HTML:

file:///usr/share/doc/iptables/html/NAT-HOWTO.html

Un altre document interessant és:

file:///usr/share/doc/iptables/html/packet-filtering-HOWTO.html

Vegeu també:

Recursos:

Exemple protocol FTP

[TODO]

Protocol FTP: Es más, mediante el uso de módulo que pueden agregarse, al seguimiento de conexión se le puede dar conocimiento de los protocolos de la capa de aplicación y así que entienda que dos o más conexiones distintas están "relacionadas". Por ejemplo, considérese el protocolo FTP. Se establece una conexión de control, pero cada vez que se transfiere información, se establece otra conexión para que la transfiera. Si se carga el módulo ip_conntrack_ftp, el primer paquete de una conexión de datos FTP se clasificará como RELATED en lugar de NEW, ya que lógicamente es parte de una conexión existente.

Iptables puede usar la información del seguimiento de conexiones para conseguir hacer reglas de filtrado de paquetes más potentes y más fáciles de manejar. La extensión de "estado" le permite a las reglas de iptables que examinen la clasificación de seguimiento de conexión para un paquete. Por ejemplo, una regla puede permitir el paso solo a paquetes NEW desde dentro del cortafuegos hacia afuera, pero permitir paquetes RELATED y ESTABLISHED en ambas direcciones. Esto permite el paso de paquetes de respuesta normales desde el exterior (ESTABLISHED), pero no permite que lleguen conexiones nuevas desde el exterior al interior. Sin embargo, si una conexión de datos FTP necesita llegar desde el exterior del cortafuegos hacia el interior, será permitido, porque el paquete se clasificará correctamente como RELATED para la conexión de control FTP, en vez de NEW.

Funcionament de Netfilter

Iptables treballa bàsicament amb les capçaleres dels protocols d'internet (IP) i transport (TCP) encara que es poden fer coses simples a nivell d'interfície de xarxa i al nivell d'aplicació.

TCPIP.jpg

El problema o inconvenient principal d'iptables és que requereix d'uns coneixements profunds de xarxes i dels protocols TCP/IP per entendre'l i treure el màxim de profit. Per exemple, com que fa un ús intensiu dels protocol TCP/IP és molt útil conèixer (encara que sigui superficialment) la capçalera IP, La capçalera TCP, la capçarela UDP i fins i tot les capçaleres ICMP.

El que cal tenir clar és per a que serveix i està dissenyat iptables i per a que no. Principalment iptables es centra en el nivell 2 de TCP/IP (nivell d'Internet) i en el seu protocol més important: IP. Per tant, el que és pot fer amb iptables és el que és pot fer amb les capçaleres IP:

Ip-headers.jpg

És a dir, filtratges per adreces IP d'origen i de destinació (Source Address i Destination Addres headers), per protocol de nivell de transport (TCP, UDP,...) i per altres opcions de les capçaleres (TTL, TOS,etc.)

Iptables també treballa amb els nivells consecutius. Per exemple pot treballar amb el protocols de transport TCP i UDP:

Tcp-headers.jpg

Udp-headers.jpg

I filtrar per ports (Source Port i Destination Port).

També treballar amb les trames del nivell d'interfície de xarxa (Ethernet):

EthernetFrame.jpg

I filtrar per adreces MAC (camps origen i destinació).

El més sofisticat que ha d'executar iptables és el que s'anomena seguiment de connexions/sessions (connection tracking). El seguiment de connexions permet relacionar els paquets entre si per saber si són de la mateixa connexió. Aquesta funcionalitat és la base d'altres funcionalitats com la translació d'adreces de xarxa (NAT).

Iptables té capacitat per fer coses per les que no està dissenyat (per exemple es pot utilitzar un filtre text per filtrar paquets que tinguin un cert text). De totes maneres està pensat per utilitza-lo amb tasques el més senzilles possibles i relacionades amb les capçaleres dels protocols de seu àmbit de treball. D'aquesta manera es pot assegurar que les tasques realitzades per iptables són de baix consum de recursos de temps, memòria i CPU.

Per altres tasques com filtrar el contingut (dades) dels paquets existeixen altres aplicacions dissenyades a tal efecte com poden ser els proxys com SQUID o els sistemes de detecció d'intrusions com SNORT. Per exemple IPTABLES no està pensat ni s'ha d'utilitzar com a antivirus.

Diagrama de flux d'iptables

Vegeu també: Bridging#Linux
http://l7-filter.sourceforge.net/PacketFlow.png

Al següent diagrama podem observar el diagrama de flux d'iptables:

Tables traverse.jpg

Iptables diagram.png

Iptables

Iptables és la comanda d'usuari encarregada de gestionar el firewall de Linux (netfilter). Hi ha moltes (masses) opcions per explicar-les totes aquí. El que trobareu en aquesta secció és alguns exemples d'ús a mode de receptari.

  • Paquet: iptables
  • Path: /sbin/iptables (podeu trobar el camí de la comanda executant which iptables)
  • Manual: man iptables

Com consultar l'estat actual d'iptables

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

L'estat que veiem és el corresponent a una política permissiva.

Com crear una política base restrictiva

Cal executar les següent comandes:

$ sudo iptables -F
$ sudo iptables -X
$ sudo iptables -Z
$ sudo iptables -t nat -F
$ sudo iptables -P INPUT DROP
$ sudo iptables -P OUTPUT DROP
$ sudo iptables -P FORWARD DROP
$ sudo iptables -t nat -P PREROUTING DROP
$ sudo iptables -t nat -P POSTROUTING DROP

La primera comanda executa un flush a totes les cadenes, o el que és equivalent, borra totes les normes una a una.

-F, --flush [chain]

             Flush the selected chain (all the chains in the table if none is given).  This is equivalent to deleting all the rules one by one.
      -X, --delete-chain [chain]
             Delete the optional user-defined chain specified.  There must be no references to the chain.  If there are, you must delete or replace  the
             referring  rules  before  the chain can be deleted.  The chain must be empty, i.e. not contain any rules.  If no argument is given, it will
             attempt to delete every non-builtin chain in the table.
-Z, --zero [chain]  
             Zero  the packet and byte counters in all chains.  It is legal to specify the -L, --list (list) option as well, to see the counters immedi‐
             ately before they are cleared. (See above.)

Com restaurar iptables a l'estat per defecte

Normalment l'estat per defecte és l'estat permissiu (cap restricció).

$ sudo iptables -F
$ sudo iptables -F -t mangle
$ sudo iptables -X
$ sudo iptables -Z
$  sudo iptables -t nat -F
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$  sudo iptables -t nat -P PREROUTING ACCEPT
$ sudo iptables -t nat -P POSTROUTING ACCEPT
$ sudo iptables -t mangle -P PREROUTING ACCEPT
$ sudo iptables -t mangle -P POSTROUTING ACCEPT

Com fer els canvis d'iptables permanents

Consulteu l'apartat Executant les normes iptables des de l'arrancada del sistema.

Com activar serveis

[TODO]

Com activar SSH

$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Recursos:

Com activar Accés a recursos de Windows (Samba)

[TODO]

Exemples d'ús d'iptables

Comments

-m comment --comment "limit ssh access"

Mostrar tota la informació sobre les regles existents

$ sudo iptables --line-numbers -nvxL
Chain INPUT (policy ACCEPT 272582 packets, 35793425 bytes)
num      pkts      bytes target     prot opt in     out     source               destination         
1          47     2804 CFG        tcp  --  *      *       192.168.1.2          0.0.0.0/0          tcp dpt:80 Records Packet's Source Interface 

2       32709  7838508 ACCEPT     all  --  !br0   *       0.0.0.0/0            0.0.0.0/0          state RELATED,ESTABLISHED 
3           0        0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0          udp dpt:5061 
4           1      438 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0          udp dpt:5060 
5          17     6540 ACCEPT     udp  --  !br0   *       0.0.0.0/0            0.0.0.0/0          udp dpt:500 
6        7587   523669 ACCEPT     udp  --  !br0   *       0.0.0.0/0            0.0.0.0/0          udp spt:10290 
7           1       48 ACCEPT     tcp  --  !br0   *       0.0.0.0/0            0.0.0.0/0          tcp spt:10290 
8           0        0 ACCEPT     udp  --  !br0   *       0.0.0.0/0            0.0.0.0/0          udp dpt:10290 
9           0        0 ACCEPT     tcp  --  !br0   *       0.0.0.0/0            0.0.0.0/0          tcp dpt:10290 
....

Cal no oblidar que per per veure la resta de taules (la taula per defecte és FILTER) cal executar:

$ sudo iptables -t nat --line-numbers -nvxL
$ sudo iptables -t mangle --line-numbers -nvxL

Inserir una norma

Primer localitzeu on voleu inserir la norma amb:

$ sudo iptables --line-numbers -nvxL

Ara si voleu inserir la norma a la posició 18, executeu

$ sudo iptables -I FORWARD  18 -s 192.168.1.2 -p tcp --dport 80 -j DROP

I comproveu-ho amb

$ sudo iptables --line-numbers -nvxL

Si us equivoqueu podeu executar:

$ sudo  iptables -D FORWARD 18

Esborrar una norma a certa posició

Primer localitzeu la norma amb:

 $ sudo iptables --line-numbers -nvxL

Si teniu moltes normes podeu utilitzar grep:

$ iptables --line-numbers -nL | grep 192.168.1.2
1    CFG        tcp  --  192.168.1.2          0.0.0.0/0          tcp dpt:80 Records Packet's Source Interface 
19   DROP       all  --  192.168.1.2          0.0.0.0/0   

Un cop localitzada la norma (per exemple volem esborrar la 19):

$ sudo  iptables -D FORWARD 19

Bloquejar pings (ICMP)

Primer comprovem que ens podem fer un ping a nosaltres mateixos:

$ ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.2 ms

Ara bloquejarem el tràfic d'entrada ICMP que provingui de la màquina local

$ sudo iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
NOTA: Aquesta comanda no només bloqueja els pings sinó que bloqueja tots els paquets del protocol [1]. La 
solució és la comanda:
$ sudo iptables -A INPUT -s 127.0.0.1 -p icmp --icmp-type echo-request -j DROP

Comprovem que s'ha afegit la nova norma a la cadena INPUT:

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  localhost            anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

Si ara provem el ping

$ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes

--- 127.0.0.1 ping statistics --- 1 packets transmitted, 0 packets received, 100% packet loss

Si provem de fer el ping des d'una altra màquina veurem que no hi ha cap problema.

Per eliminar la norma tenim dues opcions:

  • Sabem que és la única norma i executem:
$ sudo iptables -D INPUT 1

Sino hauríem d'executar sudo iptables -L per veure el nombre de línia de la norma dins la taula INPUT.

  • Copiem la comanda que vam executar a l'afegir la norma però canviem el paràmetre -A per -D:
$ sudo iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP

Suposem que tenim una altra màquina per fer proves (amb la IP 192.168.1.50):

$ sudo iptables -D INPUT -s 192.168.1.50 -p icmp -j DROP

Permetre l'entrada de paquets que siguin resposta a una petició originada dins d'una xarxa LAN (connection tracking)

Imagineu un router on:

  • eth0: és la interfície de xarxa connectada a la LAN.
  • eth1: és la interfície de xarxa connectada a la WAN (Internet)

Per permetre que el router permeti l'entrada de paquets des de l'exterior (Internet) a l'interior (LAN) hem d'executar la següent comanda d'iptables:

$ sudo iptables –A FORWARD –i eth1 –o eth0 –m state --state ESTABLISHED,RELATED –j ACCEPT

Permetre la connexió a servidors web (HTTP i SSL)

$ sudo iptables –A FORWARD –i eth1 –o eth0 –p tcp --dport 80 –j ACCEPT
$ sudo iptables –A FORWARD –i eth1 –o eth0 –p tcp --dport 443 –j ACCEPT

Amb aquesta comanda permeten la connexió a qualsevol servidor web extern a la xarxa (sempre que utilitza el ports estàndard, el 80 per HTTP i el 443 per a HTTPS):

$ cat /etc/services | grep 80

www		80/tcp		http		# WorldWideWeb HTTP
$ cat /etc/services | grep 443
https		443/tcp				# http protocol over TLS/SSL


Permetre la connexió a un servidor de DNS

$ sudo iptables -A FORWARD -i eth1 -o eth0 -p udp -d 193.20.5.10 --dport 53 -j ACCEPT

Permetem en reenviament de paquets de connexions que provinguin de la LAN i que tinguin com a destinació una màquina externa a la xarxa (193.20.5.10) per al port de destinació 53 i amb protocol UDP

Si consultem:

$ cat /etc/services | grep 53
domain		53/tcp				# name-domain server
domain		53/udp

SNAT/MaSquerade amb iptables

Si la IP del encaminador pot canviar, aleshores es millor utilitzar masquerade:

$ sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wan -j MASQUERADE

On:

  • 192.168.1.0/24: És la xarxa LAN privada que accedir a una xarxa pública compartint un encaminador (masquerada). És la xarxa "emmascarada"
  • -o wan: és la interfície de xarxa connectada cap a la xarxa pública
NOTA: La xarxa que "s'emmascara" no té per què ser una xarxa privada, tot i que és el més habitual

Si ens interessa especificar la IP cal utilitzar SNAT:

$ sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 10.36.253.3 

On en aquest cas especifiquem de forma explícita la IP 10.36.253.3. L'inconvenient d'aquest sistema és que hem de canvia la norma d'iptables si canvia la IP de l'encaminador:

NOTA: De fet la majoria de routers ADSL no tenen una IP fixe. Per tant l'única solució factible/robusta és utilitzar mascarada

NOTA: Cal tenir l'encaminament activat:

# cat /proc/sys/net/ipv4/ip_forward
1

DNAT amb iptables

Tots els ports, totes les màquines d'origen:

$ iptables -t nat -A PREROUTING -d 10.10.20.99 -j DNAT --to-destination 10.10.14.2

On:

  • 10.10.20.99: és la IP del router on estem obrint tots els ports
  • 10.10.14.2: és la IP de la màquina interna
NOTA: Alguns dispositius com routers ADSL casolans, a aquesta configuració l'anomenen DMZ (zona desmilitarizada), tot i que no és del tot correcte el nom que utilitzen

Un port concret, totes les màquines d'origen:

$ iptables -t nat -A PREROUTING -p tcp -d 10.10.20.99 --dport 80 -j DNAT --to-destination 10.10.14.2

Aquest cas és igual que l'anterior però només estem obrint el port 80.

NOTA: si la màquina destinació té un gateway diferent a la màquina a la que fem el DNAT segurament necessitareu fer Source Routing

Ús de tcpdump per debugar

Tcpdump pot ser útil com a eina de debugació de iptables. Tcpdump volca per la sortida estàndard tot el que es rep en una interfície determinada tan si està filtrat com si no.

Per exemple si tornem a fer l'exemple del ping entre dues màquines. Comprovem amb tcpdump que es reben els paquets IP. A la màquina 192.168.1.50 executem:

$ ping 1921.168.1.33

I a la màquina receptora executem:

$ sudo tcpdump
Password:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
 ................................
19:37:00.621992 IP 192.168.1.33 > 192.168.1.50: ICMP echo reply, id 3586, seq 2816, length 64
19:37:01.621817 IP 192.168.1.50 > 192.168.1.33: ICMP echo request, id 3586, seq 3072, length 64
19:37:01.621860 IP 192.168.1.33 > 192.168.1.50: ICMP echo reply, id 3586, seq 3072, length 64
19:37:02.621796 IP 192.168.1.50 > 192.168.1.33: ICMP echo request, id 3586, seq 3328, length 64
19:37:02.621839 IP 192.168.1.33 > 192.168.1.50: ICMP echo reply, id 3586, seq 3328, length 64
19:37:03.621983 IP 192.168.1.50 > 192.168.1.33: ICMP echo request, id 3586, seq 3584, length 64
19:37:03.622028 IP 192.168.1.33 > 192.168.1.50: ICMP echo reply, id 3586, seq 3584, length 64
.................................

Veiem que per cada paquet ping rebut hi ha una resposta (echo reply).

Si provem el mateix però abans executant la següent comanda a la màquina receptora (192.168.1.33):

$ sudo iptables -D INPUT -s 192.168.1.50 -p icmp -j DROP

i també executem:

$ sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
19:37:41.692647 IP 192.168.1.50 > 192.168.1.33: ICMP echo request, id 3842, seq 2048, length 64
19:37:42.692440 IP 192.168.1.50 > 192.168.1.33: ICMP echo request, id 3842, seq 2304, length 64
19:37:42.692440 IP 192.168.1.50 > 192.168.1.33: ICMP echo request, id 3842, seq 2304, length 64

No hi ha respostes degut a la intervenció d'iptables. És important observar que encara que iptables està actuant els paquets arriben a la interfície de xarxa (són descartats però arriben).

Ús de nmap per debugar

Vegeu nmap

Ús de firestarter

Amb dos ordinadors (o en parelles) es pot fer una pràctica de firewalls amb Firestaster. Firestarter és un firewall personal per a Linux.

Si abans d'instal·lar comprovem la configuració d'iptables:

$ sudo iptables -L
Password:
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

Veurem que tenim una configuració per defecte permissiva (policies ACCEPT).

Per instal·lar Firestarter podeu consultar la secció Instal·lació de l'article sobre tallafocs.

Un cop instal·lat podeu comprovar com ha canviat la configuració de iptables:

$ sudo iptables -L
Password:
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  250.Red-80-58-61.staticIP.rima-tde.net  anywhere            tcp flags:!FIN,SYN,RST,ACK/SYN 
ACCEPT     udp  --  250.Red-80-58-61.staticIP.rima-tde.net  anywhere            
ACCEPT     tcp  --  254.Red-80-58-61.staticIP.rima-tde.net  anywhere            tcp flags:!FIN,SYN,RST,ACK/SYN 
ACCEPT     udp  --  254.Red-80-58-61.staticIP.rima-tde.net  anywhere            
ACCEPT     all  --  anywhere             anywhere            
LSI        udp  --  anywhere             anywhere            udp dpt:33434 
LSI        icmp --  anywhere             anywhere            
DROP       all  --  anywhere             255.255.255.255     
DROP       all  --  anywhere             192.168.1.255       
DROP       all  --  BASE-ADDRESS.MCAST.NET/8  anywhere            
DROP       all  --  anywhere             BASE-ADDRESS.MCAST.NET/8 
DROP       all  --  255.255.255.255      anywhere            
DROP       all  --  anywhere             0.0.0.0             
DROP       all  --  anywhere             anywhere            state INVALID 
LSI        all  -f  anywhere             anywhere            limit: avg 10/min burst 5 
INBOUND    all  --  anywhere             anywhere            
LOG_FILTER  all  --  anywhere             anywhere            
LOG        all  --  anywhere             anywhere            LOG level info prefix `Unknown Input' 

Chain FORWARD (policy DROP)
target     prot opt source               destination         
LSI        udp  --  anywhere             anywhere            udp dpt:33434 
LSI        icmp --  anywhere             anywhere            
LOG_FILTER  all  --  anywhere             anywhere            
LOG        all  --  anywhere             anywhere            LOG level info prefix `Unknown Forward' 

Chain OUTPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  192.168.1.33         250.Red-80-58-61.staticIP.rima-tde.net tcp dpt:domain 
ACCEPT     udp  --  192.168.1.33         250.Red-80-58-61.staticIP.rima-tde.net udp dpt:domain 
ACCEPT     tcp  --  192.168.1.33         254.Red-80-58-61.staticIP.rima-tde.net tcp dpt:domain 
ACCEPT     udp  --  192.168.1.33         254.Red-80-58-61.staticIP.rima-tde.net udp dpt:domain 
ACCEPT     all  --  anywhere             anywhere            
DROP       all  --  BASE-ADDRESS.MCAST.NET/8  anywhere            
DROP       all  --  anywhere             BASE-ADDRESS.MCAST.NET/8 
DROP       all  --  255.255.255.255      anywhere            
DROP       all  --  anywhere             0.0.0.0             
DROP       all  --  anywhere             anywhere            state INVALID 
OUTBOUND   all  --  anywhere             anywhere            
LOG_FILTER  all  --  anywhere             anywhere            
LOG        all  --  anywhere             anywhere            LOG level info prefix `Unknown Output' 
Chain INBOUND (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     udp  --  anywhere             anywhere            state RELATED,ESTABLISHED 
LSI        all  --  anywhere             anywhere            
Chain LOG_FILTER (5 references)
target     prot opt source               destination         
Chain LSI (6 references)
target     prot opt source               destination         
LOG_FILTER  all  --  anywhere             anywhere            
LOG        tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,ACK/SYN limit: avg 1/sec burst 5 LOG level info prefix `Inbound ' 
DROP       tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,ACK/SYN 
LOG        tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,ACK/RST limit: avg 1/sec burst 5 LOG level info prefix `Inbound ' 
DROP       tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,ACK/RST 
LOG        icmp --  anywhere             anywhere            icmp echo-request limit: avg 1/sec burst 5 LOG level info prefix `Inbound ' 
DROP       icmp --  anywhere             anywhere            icmp echo-request 
LOG        all  --  anywhere             anywhere            limit: avg 5/sec burst 5 LOG level info prefix `Inbound ' 
DROP       all  --  anywhere             anywhere            

Chain LSO (0 references)
target     prot opt source               destination         
LOG_FILTER  all  --  anywhere             anywhere            
LOG        all  --  anywhere             anywhere            limit: avg 5/sec burst 5 LOG level info prefix `Outbound ' 
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable  

Chain OUTBOUND (1 references)
target     prot opt source               destination         
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     udp  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     all  --  anywhere             anywhere      

Per començar totes les POLICIES són per defecte DROP.

Al menú Sistema|Administració|Firestater podem executar el Firewall (es pot configurar aquest firewall per tal que s'executi a l'iniciar sessió). Veurem com apareix la icona de firestarter a la barra de notificació:

Firestarter1.jpg

Suposant que l'ordinador on està firestarter té la IP 192.168.1.33, des d'un altre ordinador provarem de connectar-nos via SSH a l'ordinador que té firestater en execució:

$ ssh usuari@192.168.1.33

Veurem com no connecta i com la icona de firestarter ens indica un "possible atac" o esdeveniment:

Firestarter2.jpg

Si fem click ens obrirà firestarter i si anem a la pestanya Esdeveniments podrem permetre la connexió que ha impedit firestarter:

Firestarter3.jpg

Firestarter es pot utilitzar per saber com es reflexa un permís que donem a iptables. Si suposem que la ip d'origen era la 192.168.1.34:

$ sudo iptables -L | grep -A 5 -B 5 192.168.1.34

Chain INBOUND (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     udp  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     all  --  192.168.1.34         anywhere
LSI        all  --  anywhere             anywhere            

Chain LOG_FILTER (5 references)
target     prot opt source               destination       

Aleshores veurem que el que ha fet firestarter és afegir una norma a la cadena INPUT.

Com bloquejar una MAC

$ sudo iptables -I INPUT -p icmp -m mac --mac-source AS:23:AB:11:00:00 -j DROP

Crear cadenes pròpies

Podeu crear una cadena d'usuari (user defined chains) amb:

$ sudo iptables -N nom_cadena

I ara podeu afegir-li normes. Per exemple:

$ sudo iptables -N block
$ sudo iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT
$ sudo iptables -A block -j DROP

Consulteu la cadena amb:

$ sudo iptables -nvL
...
Chain prova (0 references)
pkts bytes target     prot opt in     out     source               destination         
   0     0 ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
   0     0 ACCEPT     0    --  !ppp0  *       0.0.0.0/0            0.0.0.0/0           state NEW 
   0     0 DROP       0    --  *      *       0.0.0.0/0            0.0.0.0/0

Ara només cal fer-hi referència utilitzant l'instrucció -j:

$ sudo iptables -A INPUT -j block
$ sudo iptables -A FORWARD -j block

Bloquejar una llista d'adreces IP, llegides d'un fitxer

Podeu crear un fitxer amb una llista d'adreces IP:

$ cat llista 
# Llista d'adreces IP a bloquejar
# ******************************** 

#MEEBO
208.81.191.126
208.81.191.133

#PROXRIO
67.159.45.52

#MUNDO DEPORTIVO
194.224.66.89 

#ACCOUNT LIVE
65.55.196.248

#COUNTER STRIKE SERVERS
213.149.249.104
78.40.120.180 

#SERVERSPY
64.72.116.57 

#IMO.IM
64.13.152.67

#NETSHADOW
#netshadow.no-ip.biz

#cgm-images.adbureau.net 
#cgm-images.adbureau.net 

I amb el següent script crear les comandes d'iptables, o com és el cas, les línies necessàries a afegir a un fitxer en format iptables-save:

$ joe generate_iptables_rules.sh
#!/bin/bash
IP_LIST=llista 

grep -v "#" $IP_LIST | sed -e '/^$/d' | while read IP ; do
 echo "-A FORWARD -d $IP -j DROP"
done

Feu el fitxer executable:

$ sudo chmod +x generate_iptables_rules.sh

I l'executeu:

$ ./generate_iptables_rules.shç

Bloquejar atacs SSH

$ sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
$ sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP

Recursos http://kevin.vanzonneveld.net/techblog/article/block_brute_force_attacks_with_iptables/

Com fer proves d'iptables en un servidor remot

Afegir a crontab:

*/10 * * * * /sbin/iptables -F

Com redireccionar les peticions (Portal captiu?)

$ sudo iptables -A PREROUTING -p tcp -i eth1 -d! 192.168.0.0/255.255.0.0 -s! 192.168.1.2 --dport 80 -j DNAT --to 192.168.0.8:80

Com permetre NFS

NFS amb UDP utilitzar portmap (211) per tal de negociar de forma dinàmica el port a utilitzar. A priori no podem saber quin port s'utilitza i la única opció que quedaria és analitzar en temps reals la comunicació RPC i adaptar el firewall.

Una solució més senzilla és forçar el protocol TCP en el client, aleshores s'utilitza el port 2049. La opció a especificar al client NFS és:

proto=tcp

Recursos:

Limitar la ratio de connexions (evitar atacs de força bruta)

/sbin/iptables -A INPUT -p tcp --dport 22 --syn -m limit --limit 1/m --limit-burst 2 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 --syn -j DROP

Balanceig de càrrega. Load balancing

Consulteu Load Balancing.

Fer un log de paquets

Anem a veure com per exemple mostrar els pings que bloquegem amb:

$ sudo iptables -A INPUT -p icmp -d 127.0.0.1 -j DROP

Per fer el log podrieu fer:

$ sudo iptables -A INPUT -p icmp -d 127.0.0.1 -j LOG --log-prefix "[firewall ]: "

Però aquesta norma no es compliria mai pel fet d'anar al darrera de l'anterior. El correcte seria afegir-la abans amb un INSERT (I) en comptes d'un append (A):

$ sudo iptables -I INPUT 1 -p icmp -d 127.0.0.1 -j LOG --log-prefix "[firewall ]: "

Observeu com s'apliquen les normes amb

$ sudo watch iptables -nvL

A un altre finestra feu:

$ ping localhost

Podeu observar el log a syslog:

$ sudo tail -f /var/log/syslog
Apr 15 05:41:34 BSFHPCasa kernel: [78058.498917] [firewall ]: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=84 TOS=0x00 
PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=42019 SEQ=120 
Apr 15 05:41:35 BSFHPCasa kernel: [78059.507212] [firewall ]: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=84 TOS=0x00 
PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=42019 SEQ=121 
Apr 15 05:41:36 BSFHPCasa kernel: [78060.514161] [firewall ]: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=84 TOS=0x00 
PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=42019 SEQ=122

Fer un log amb una cadena d'usuari (user chain)

Primer cal crear la cadena:

$  sudo iptables -N LOGDROP > /dev/null 2> /dev/null
$  sudo iptables -F LOGDROP
$  sudo iptables -A LOGDROP -j LOG --log-prefix "LOGDROP "
$  sudo iptables -A LOGDROP -j DROP
The first rule in this set creates the new chain. The output is sent to /dev/null because if you attempt to run this twice on the same system, you will get an error saying the chain already exists. It's up to you if you want to see that message or not. The second rule flushes the contents of the chain, again, so that if you run it twice on the same system you don't have duplicate rules in the chain. The third rule LOGS the traffic with the added "LOGDROP" prefix and the fourth rule DROPs the traffic

Per utilitzar la cadena:

# Log and drop all connections to the HTTP port
$ sudo iptables -A INPUT -p tcp --dport 80 -j LOGDROP

Filtrar segons usuari o UID

Cal utilitzar el mòdul owner (-m owner):

$ sudo iptables -t mangle -A OUTPUT -m owner --uid-owner 500 -j MARK --set-mark 1

Vegem un exemple d'enrutament segons usuari:

Definim dos taules de rutes noves connection1 i connection2:

$ sudo joe /etc/iproute2/rt_tables 

#
# reserved values
#
255     local
254     main
253     default
0       unspec
151     connection1
152     connection2
 
#
# local
#
1       inr.ruhep

Utilitzarem iptables per marcar els paquets que sigui de l'usuari 1 amb la marca 1 i el usuari 2 amb la marca 2 i aleshores hem de definir una norma que digui que els paquets que tenen la marca 1 utilitzant la connection 1 i els que tinguin la marca 2 la connection 2:

$ sudo ip rule add fwmark 1 table connection1 
$ sudo ip rule add fwmark 2 table connection2 

Ara cal posar la marca a cada usuari. Suposem que els usuaris són sergi (UID=1000) i bego (UID=1001):

$ sudo iptables -t mangle -A OUTPUT -m owner --uid-owner 1000 -j LOG --log-prefix "[firewall sergi]: "
$ sudo iptables -t mangle -A OUTPUT -m owner --uid-owner 1000 -j MARK --set-mark 1
$ sudo iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j LOG --log-prefix "[firewall bego]: "
$ sudo iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 2

Ara cal fer SNAT per tal que els paquet tinguin com a IP d'origen la IP de la targeta de xarxa per la que surten:

$ sudo iptables -t mangle -A OUTPUT -m owner --uid-owner 1000 -j LOG --log-prefix "[firewall SNAT eth1]: "
$ sudo iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source=192.168.5.11
$ sudo iptables -t mangle -A OUTPUT -m owner --uid-owner 1000 -j LOG --log-prefix "[firewall SNAT eth2]: "
$ sudo iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source=192.168.6.11

Sí la connexió és PPP i és una IP dinàmica aleshores cal utilitzar masquerade. Ara cal definir els defaults gateways per cada ruta:

$ sudo ip route add default via 192.168.5.1 dev eth1 table connection1 
$ sudo ip route add default dev 192.168.6.1 dev eth2 table connection2

Observeu el log amb:

$ sudo tail -f /var/log/syslog

I també:

$ sudo watch iptables -nvL -t nat

I:

$ sudo watch iptables -nvL -t mangle

Mostrar número de bytes exactes

Quan la quantitat de paquets és molt gran, iptables mostra unitat en K, G, etc i aleshores no és útil per tal de comprovar el funcionament en viu. POdeu utilitzar l'opció (-x) per mostrar les dades exactes:

$ sudo iptables -nxvL

Iptables i IP Aliasing

No es poden especificar interfícies IP ALIASING, dona el següent error:

Warning: weird character in interface `alumnat:2' (No aliases, :, ! or *).

Cal jugar amb rangs de xarxa d'origen/destinació. Per exemple poasr:

-A PREROUTING -i alumnat -s 192.168.2.0/24 ! -d 192.168.0.0/16 -p tcp --dport 80 -j REDIRECT --to-port 3128
-A PREROUTING -i alumnat -s 192.168.3.0/24 ! -d 192.168.0.0/16 -p tcp --dport 80 -j REDIRECT --to-port 3128

En comptes de:

-A PREROUTING -i alumnat:1 ! -d 192.168.0.0/16 -p tcp --dport 80 -j REDIRECT --to-port 3128
-A PREROUTING -i alumnat:2 ! -d 192.168.0.0/16 -p tcp --dport 80 -j REDIRECT --to-port 3128

Amb:

alumnat   Link encap:Ethernet  HWaddr 00:16:3e:00:02:b1  
         inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
         inet6 addr: fe80::216:3eff:fe00:2b1/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:3898116 errors:0 dropped:0 overruns:0 frame:0
         TX packets:1644236 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000 
         RX bytes:604719876 (604.7 MB)  TX bytes:2168489444 (2.1 GB)
         Interrupt:11 

alumnat:1 Link encap:Ethernet  HWaddr 00:16:3e:00:02:b1  
         inet addr:192.168.2.1  Bcast:192.168.2.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         Interrupt:11 

alumnat:2 Link encap:Ethernet  HWaddr 00:16:3e:00:02:b1  
         inet addr:192.168.3.1  Bcast:192.168.3.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         Interrupt:11 


Consulteu també IP Aliasing.

IP Aliasing

iptables -A INPUT  -p icmp -m limit --limit 10/second -j ACCEPT
iptables -A INPUT  -p icmp -j DROP 

This will limit the ICMP responses to a maximum of 10 replies per second.

NOTA: Ojo que es carrega no només els pings, tot ICMP!

Filtrar paquets de brodcast

El que identifica un paquet de broadcast és la MAC:

FF:FF:FF:FF:FF.FF

Per tant es pot fer filtrant per MAC de destinació?

Només hi ha un mac-source a iptables? Vegeu arptables.

Funciona? Sembla que si!:

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

Filtrar per MAC de destinació

arptables???

$ man iptables | grep destination | grep mac

             arptables -A INPUT -i eth1 --h-length 6 --destination-mac 01:00:5e:00:01:01 -j mangle --mangle-mac-d 00:zz:yy:xx:5a:27
             arptables -A INPUT -i eth2 --h-length 6 --destination-mac 01:00:5e:00:01:02 -j mangle --mangle-mac-d 00:zz:yy:xx:5a:27

tcpflags

TCP Extensions:

The TCP extensions are automatically loaded if `-p tcp' is specified. It provides the following options (none of which match fragments).

--tcp-flags

    Followed by an optional `!', then two strings of flags, allows you to filter on specific TCP flags. The first string of flags is the mask: a list of flags you want to 
examine. The second string of flags tells which one(s) should be set. For example,

       # iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP

    This indicates that all flags should be examined (`ALL' is synonymous with `SYN,ACK,FIN,RST,URG,PSH'), but only SYN and ACK should be set. There is also an argument  `NONE' meaning no flags.
--syn

   Optionally preceded by a `!', this is shorthand for `--tcp-flags SYN,RST,ACK SYN'.
--source-port

   followed by an optional `!', then either a single TCP port, or a range of ports. Ports can be port names, as listed in /etc/services, or numeric. Ranges are either two  
port names separated by a `:', or (to specify greater than or equal to a given port) a port with a `:' appended, or (to specify less than or equal to a given port), a port 
preceded by a `:'.
--sport

    is synonymous with `--source-port'.
--destination-port

   and
--dport

   are the same as above, only they specify the destination, rather than source, port to match.
--tcp-option

   followed by an optional `!' and a number, matches a packet with a TCP option equaling that number. A packet which does not have a complete TCP header is dropped  
automatically if an attempt is made to examine its TCP options.


Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere tcp flags:SYN,RST,ACK/SYN

Normes de iptables que permeten veure el camí que segueix una connexió TCP d'entrada/sortida

Tables traverse.jpg

A la gràfica de la dreta podeu veure el diagrama que indica el camí que segueixen els paquets al passar pel nucli del sistema (Linux kernel traversal).

La idea d'aquest exercici és veure pas a pas el camí que segueixen els paquets d'una petició de connexió TCP (SYN i SYN_ACK). Per tal de simular una connexió TCP podem utilitzar netcat. Crearem un "servidor" escoltant al port 5000, la intenció és simular una connexió client/servidor:

$ nc -l -p 5000

Veureu que queda bloquejat (a l'espera de una connexió, l'opció -l vol dir listen). En un altre terminal farem una connexió amb:

$ nc localhost 5000

El procés de connexió TCP el podeu veure a la següent gràfica:

State-tcp-connecting.jpg
IMPORTANT: Cada cop que us connecteu/desconnecteu haureu de tornar a executar el "servidor" i el client. Tot i que les poseu no apareixeran al fitxer de log!!!

Les següents normes iptables ens permeten fer un log que permet veure el procés.

El paquet entrant a la màquina:

$ sudo iptables -t raw -A PREROUTING -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] Paquet SYN entrant: "
$ sudo iptables -t raw -A PREROUTING -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] RAW PREROUTING: "
$ sudo iptables -t mangle -A PREROUTING -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] MANGLE PREROUTING: "
$ sudo iptables -t mangle -A PREROUTING -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] entregat a rutes: "
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] NAT PREROUTING: "
$ sudo iptables -t mangle -A INPUT -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] MANGLE INPUT: "
$ sudo iptables -t filter -A INPUT -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] FILTER INPUT: "
$ sudo iptables -t filter -A INPUT -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] SYN entregat local: "
IMPORTANT: Com podeu veure la taula NAT no es travessada en aquest tipus de connexió! Les comandes en negreta no serien necessàries

El paquet entrant a la màquina:

$ sudo iptables -t raw -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] Paquet ACK sortint: "
$ sudo iptables -t raw -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] RAW OUTPUT: "
$ sudo iptables -t mangle -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] MANGLE OUTPUT: "
$ sudo iptables -t nat -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] NAT OUTPUT: "
$ sudo iptables -t filter -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] FILTER OUTPUT: " 
$ sudo iptables -t filter -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] ACK entregat a rutes: "
$ sudo iptables -t mangle -A POSTROUTING -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] MANGLE POSTROUTING: "
$ sudo iptables -t nat -A POSTROUTING -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[Fw] NAT POSTROUTING: "

La configuració del firewall ha de quedar:

$ sudo iptables-save
# Generated by iptables-save v1.4.4 on Tue Feb  8 18:32:41 2011
*nat
:PREROUTING ACCEPT [205:55671]
:POSTROUTING ACCEPT [238:16102]
:OUTPUT ACCEPT [238:16102]
-A PREROUTING -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] NAT PREROUTING: " 
-A POSTROUTING -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[Fw] NAT POSTROUTING: " 
-A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] NAT OUTPUT: " 
COMMIT
# Completed on Tue Feb  8 18:32:41 2011
# Generated by iptables-save v1.4.4 on Tue Feb  8 18:32:41 2011
*mangle
:PREROUTING ACCEPT [4729:1811193]
:INPUT ACCEPT [3455:1401945]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2713:483905]
:POSTROUTING ACCEPT [2739:488955]
-A PREROUTING -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] MANGLE PREROUTING :" 
-A PREROUTING -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] entregat a rutes::" 
-A INPUT -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] MANGLE INPUT :" 
-A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] MANGLE OUTPUT: " 
-A POSTROUTING -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] MANGLE POSTROUTING: " 
COMMIT
# Completed on Tue Feb  8 18:32:41 2011
# Generated by iptables-save v1.4.4 on Tue Feb  8 18:32:41 2011
*raw
:PREROUTING ACCEPT [5072:1897170]
:OUTPUT ACCEPT [2726:485272]
-A PREROUTING -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] Paquet SYN entrant: " 
-A PREROUTING -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] RAW PREROUTING: " 
-A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] Paquet ACK sortint: " 
-A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] RAW OUTPUT: " 
COMMIT
# Completed on Tue Feb  8 18:32:41 2011
# Generated by iptables-save v1.4.4 on Tue Feb  8 18:32:41 2011
*filter
:INPUT ACCEPT [7792:4303112]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [6052:990203]
-A INPUT -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] FILTER INPUT: " 
-A INPUT -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] SYN entregat local: " 
-A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] FILTER OUTPUT: " 
-A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] ACK entregat a rutes: " 
COMMIT
# Completed on Tue Feb  8 18:32:41 2011 

Si ara simulem la connexió TCP. En una terminal:

$ nc -l -p 5000

En un altre

$ nc localhost 5000
Ctrl+C

Ara al fitxer de log veureu:

$ sudo tail -f /var/log/syslog
...
Feb  8 18:35:31 ubuntuacer kernel: [ 3785.594215] [FW] Paquet SYN entrant: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 
LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 

Feb  8 18:35:31 ubuntuacer kernel: [ 3785.594199] [firewall] RAW PREROUTING IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 
LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 

Feb  8 18:35:31 ubuntuacer kernel: [ 3785.594254] [FW] MANGLE PREROUTING: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 
TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 

Feb  8 18:35:31 ubuntuacer kernel: [ 3785.594267] [FW] MANGLE INPUT :IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60  
TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 

Feb  8 18:35:31 ubuntuacer kernel: [ 3785.594280] [FW] FILTER INPUT :IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 
TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 

Feb  8 18:35:31 ubuntuacer kernel: [ 3785.594293] [FW] SYN entregat proc local IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 
LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 


Feb  8 18:35:34 ubuntuacer kernel: [ 3788.872585] [FW] Paquet ACK sortint: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF 
PROTO=TCP SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0 

Feb  8 18:35:34 ubuntuacer kernel: [ 3788.872602] [FW] RAW OUTPUT: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF PROTO=TCP SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0 
Feb  8 18:35:34 ubuntuacer kernel: [ 3788.872617] [FW] MANGLE OUTPUT: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF PROTO=TCP 
SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0 

Feb  8 18:35:34 ubuntuacer kernel: [ 3788.872630] [FW] FILTER OUTPUT: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF PROTO=TCP 
SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0 

Feb  8 18:35:34 ubuntuacer kernel: [ 3788.872643] [FW] ACK entregat taul rutes: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF 
PROTO=TCP SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0 

Feb  8 18:35:34 ubuntuacer kernel: [ 3788.872656] [FW] MANGLE POSTROUTING: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF 
PROTO=TCP SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0

Ara podem intentar observar només els paquets established:

$ sudo iptables -A PREROUTING -p tcp -m tcp --dport 5000 -m state --state ESTABLISHED -j LOG --log-prefix "[FW] MANGLE PREROUTING :"

Marques administratives. fwmark

Permet marcar paquets (no es marquen físicament! només és una marca en la estructura de dades que hi ha a la memòria RAM del ordinador que executa iptables!) per tal de poder realitzar tasques posteriors com:

Iptables#Filtrar_segons_usuari_o_UID

Consulteu: Iptables#Filtrar_segons_usuari_o_UID

Decidir una ruta segons l'origen del paquet

Consulteu Iptables#Decidir_una_ruta_segons_l.27origen_del_paquet

Policy Routing

Consultar:

Policy Routing

IPv6. ip6tables

Per tal de gestionar les normes d'un firewall que treballi amb IPv6 cal utilitzar l'ordre ip6tables en comptes de la comanda iptables.

IMPORTANT: NAT és quelcom obsolet amb IPv6 i per tant no hi ha taula NAT a ip6tables:
$ sudo ip6tables -nvL -t nat
ip6tables v1.4.12: can't initialize ip6tables table `nat': Table does not exist (do you need to insmod?)
Perhaps ip6tables or your kernel needs to be upgraded.

Vegeu també:

Documentació

Podeu consultar els manuals:

http://linux.die.net/man/8/ip6tables

Exemples

Fer un seguiment del passos que fan els paquets pel nucli (kernel) del sistema

Exemple de connexió TCP

La idea es captar la connexió TCP amb normes de log d'iptables i anar mostrant un xivato a un fitxer de log. Es vol veure com passar per totes les cadenes de totes les taules.

La idea és fer-ho conjuntament amb netcat, només per a l'establiment de connexió TCP (SYN,SYN ACK)

TODO:

També taula de rutes amb:

ip monitor route---

Exemple de Forwarding amb SNAT

ídem a l'anterior però a un router que fa FORWARD i SNAT.

Permetre accés SMTP, IMAP i POP3 de GMAIL

#SMTP GMAIL
-A FORWARD -p tcp -d 66.249.64.0/19 --dport 465 -j ACCEPT
-A FORWARD -p tcp -d 74.125.0.0/16 --dport 465 -j ACCEPT

Per saber el rang de servidors:

$ ping smtp.gmail.com
PING gmail-smtp-msa.l.google.com (74.125.79.109) 56(84) bytes of data.
...
$ whois 74.125.79.109
...
...
NetRange:   74.125.0.0 - 74.125.255.255 
CIDR:       74.125.0.0/16 

Canvien molt sovint els rangs?

Proxy transparent amb iptables

Exemple en una xarxa de classe C 192.168.1.0/24:

$ sudo iptables -t nat -A PREROUTING -i eth0 -s 192.168.1.0/24 ! -d 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

El mateix amb una xarxa 147.83.75.128/25:

$ sudo iptables -t nat -A PREROUTING -i eth0 -d ! 147.83.75.128/25 -p tcp --dport 80 -j REDIRECT --to-port 3128

Si el proxy esta en un altre màquina:

$ sudo iptables -t nat -A PREROUTING -s 147.83.75.132 -d ! 147.83.75.128/25 -p tcp --dport 80 -j DNAT --to-destination 147.83.75.147:3128

Depurant iptables

La comanda watch és ideal per debugar iptables. Anem a veure un exemple de com comprovar que realment estem bloquejant el tràfic provinent d'un màquina concreta.

Exemple:

  • Màquina origen: 192.168.1.3
  • Màquina destinació: 192.168.1.2

A la màquina destinació afegim una norma iptables que impedeixi els pings provinents de la màquina origen:

$ sudo iptables -A INPUT -s 192.168.1.3 -p icmp -j DROP

I ara executem:

$ sudo watch iptables -nvL
Chain INPUT (policy ACCEPT 3084 packets, 1224K bytes)
pkts bytes target     prot opt in     out     source               destination         

   0     0 DROP       icmp --  *       *      192.168.1.3          0.0.0.0/0  

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 3263 packets, 298K bytes)
pkts bytes target     prot opt in     out     source               destination 
NOTA: Encara més complet és executar sudo watch iptables --line-numbers -nvxL

Si ara anem a la màquina origen i fem un ping a la màquina destinació:

$ ping 192.168.1.2

Veurem com es va actualitzant el nombre de paquets que són aturats per la norma d'iptables que hem activat:

21  1764 DROP       icmp --  *      *      192.168.1.3          0.0.0.0/0

Executant les normes iptables des de l'arrancada del sistema

Debian

A Debian hi ha dues formes. L'antiga i la nova ;-):

  • Forma antiga:

Un cop tenim les normes configurades correctament creem un script System V per a un servei anomenat iptables (fitxer /etc/init.d/iptables):

$ sudo -i
# gunzip /usr/share/doc/iptables/examples/oldinitdscript.gz -c > /etc/init.d/iptables
# chmod +x /etc/init.d/iptables
# mkdir /var/lib/iptables
# chmod 700 /var/lib/iptables
# exit
  • Forma nova:

Un cop tenim les normes ben configurades podem executar:

$ sudo -i
# iptables-save > /etc/firewall/firewall.conf

Per tal de crear l'script /etc/network/if-up.d/iptables amb les següents comandes:

$ echo "#!/bin/sh" > /etc/network/if-up.d/iptables
$ echo "/sbin/iptables-restore < /etc/firewall/firewall.conf" >> /etc/network/if-up.d/iptables
$ chmod +x /etc/network/if-up.d/iptables

El fitxer /etc/network/if-pre-up.d/iptables queda de la següent manera:

#!/bin/sh
/sbin/iptables-restore < /etc/firewall/firewall.conf
IMPORTANT: Podeu també utilitzar el fitxer /etc/network/if-up.d/iptables però no és tant segur ja que hi haurà un lapse molt curt de temps entre el moment que s'ha configurat la xarxa i l'execució de la comanda durant el qual el vostre servidor no estarà segur.

Una altra opció és:

iptables-save -c > /etc/iptables-save

I afegir un pre-up al fitxer /etc/network/interfaces:

...........
auto eth0
iface eth0 inet dhcp
pre-up cat /etc/iptables-save | iptables-restore -c
...........

Recursos:

Script System V per reiniciar iptables

Creem un script a la carpeta /etc/init.d:

$ sudo gedit /etc/init.d/iptables

amb el següent contingut:

#!/bin/sh

case "$1" in
start)
# Aqui pones las reglas de iptables que quieras
;;
stop)
# Borramos todas las reglas:
iptables -F
# Borramos todas las cadenas de usuario:
iptables -X
;;
*)
echo "Usage: /etc/init.d/iptables-script {start|stop}"
exit 1
;;
esac 

exit 0

I l'afegim a l'inici del sistema:

$ sudo update-rc.d -f iptables defaults

Ara ja podem iniciar/reiniciar/aturar iptables com qualsevol altre Script SystemV (http://en.wikipedia.org/wiki/System_V)).

$ /etc/init.d/iptables_script start
$ /etc/init.d/iptables_script stop

Recursos:

IPP2P

NOTA: Llegiu abans xtables-addons

Pas a pas:

$ cd
$ mkdir ipp2p
$ cd ipp2p
$ wget http://www.ipp2p.org/downloads/ipp2p-0.8.2.tar.gz
$ tar xvzf ipp2p-0.8.2.tar.gz

Descarreguem un pegat:

$ wget http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo-x86/net-firewall/ipp2p/files/ipp2p-0.8.2-kernel-2.6.22.patch

Consultem la versió d'iptables amb:

$ sudo iptables --help

Jo tinc iptables v1.3.6 i per tant m'he de baixar el codi font del IPTABLES corresponent

$ cd /ur/src
$ sudo wget http://www.netfilter.org/projects/iptables/files/iptables-1.3.6.tar.bz2
$ sudo tar jxvf iptables-1.4.4.tar.bz2

Instal·lem el headers del kernel i el paquet iptables-dev:

$ sudo apt-get install linux-headers-`uname -r` iptables-dev
$ cd ipp2p-0.8.2/

Ara apliquem el pegat:

$ patch -p1 < ../ipp2p-0.8.2-kernel-2.6.22.patch

Editem el MakeFile:

I modifiquem la línia:

ld -shared -o libipt_ipp2p.so libipt_ipp2p.o

(està abans del target clean) per:

$(CC) -shared -o libipt_ipp2p.so libipt_ipp2p.o

Ara executem:

$ make

No ha de donar cap error. Per instal·lar el que hem compilat:

$ sudo cp libipt_ipp2p.so /lib/iptables
$ sudo cp ipt_ipp2p.ko /lib/modules/`uname -r`/kernel/net/ipv4

Carreguem el mòdul del kernel:

$ sudo depmod
$ sudo insmod ipt_ipp2p.ko

Comproveu que s'ha carregat:

$ lsmod | grep ipp2p
ipt_ipp2p               9472  1 
x_tables               16260  6 ipt_ipp2p,xt_state,xt_MARK,xt_tcpudp,iptable_nat,ip_tables

Comprovem que funciona amb:

$ sudo iptables -m ipp2p --help

Per filtrar-ho tot:

$ sudo iptables -A FORWARD -m ipp2p --ipp2p -j DROP

Recursos:

Parches:

Actualitzacions del KERNEL!!!!

Si s'actualitza el kernel, cal tornar a configurar ipp2p:

Un exemple per passar del kernel 2.6.22-14-server a 2.6.22-15-server:

# cp /lib/modules/2.6.22-14-server/kernel/net/ipv4/ipt_ipp2p.ko /lib/modules/2.6.22-15-server/kernel/net/ipv4
# cd /lib/modules/2.6.22-15-server/kernel/net/ipv4
# insmod ipt_ipp2p.ko

Podeu consultar la versió del kernel que esteu utilitzant amb:

$ uname -r

Si dona un error:

# insmod ipt_ipp2p.ko 
insmod: error inserting 'ipt_ipp2p.ko': -1 Invalid module format

Cal tornar a descarregar i compilar (apartat anterior).

xtables-addons

Compilar el codi font

Com que el paquet de Karmic no funciona amb els kernels 2.6.31:

https://bugs.launchpad.net/ubuntu/+source/xtables-addons/+bug/475480

Servidor

Extret de: http://linuxtechie.wordpress.com/2009/12/03/iptables-tarpit-support-in-karmic/

Estan trencats los paquets de karmic i la instal·lació des del codi font no funciona. Cal agafar-los de Lucid:

$ wget http://archive.ubuntu.com/ubuntu/pool/universe/x/xtables-addons/xtables-addons-source_1.21-1_all.deb

Si tenim 64 bits:

$ grep ' lm ' /proc/cpuinfo

Si apareix lm és que sí. Aleshores:

$ wget http://archive.ubuntu.com/ubuntu/pool/universe/x/xtables-addons/xtables-addons-common_1.21-1_amd64.deb
$ sudo apt-get install gdebi-core quilt

Esborrem el que teniem instal·lat

$ sudo apt-get remove --purge xtables-addons-source 
$ sudo apt-get remove --purge xtables-addons-common 

Ara instal·lem els paquets:

$ sudo gdebi xtables-addons-source_1.21-1_all.deb
$ sudo gdebi xtables-addons-common_1.21-1_amd64.deb

I compilem amb:

$ sudo module-assistant --verbose --text-mode auto-install xtables-addons
 

Comprovem que funciona:

$ sudo iptables -A FORWARD -m ipp2p --edk -j DROP

Exemple que ha funcionat a una Ubuntu Desktop Karmic Koala 2.6.31-20-generic:

$ wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/1.24/xtables-addons-1.24.tar.bz2?use_mirror=heanet
$ tar xvfj xtables-addons-1.24.tar.bz2 
$ cd xtables-addons-1.24
$ ./configure
$ make
$ sudo make install
$ lsmod | grep ipp2p
xt_ipp2p                8188  1 
compat_xtables          4188  1 xt_ipp2p
x_tables               16544  3 xt_ipp2p,compat_xtables,ip_tables

Còpia de seguretat:

http://acacha.org/~sergi/xtables-addons-1.24.tar.bz2

Paquets

xtables-addons és el successor de patch-o-matic:

$ sudo apt-get install xtables-addons-common xtables-addons-source
$ sudo depmod -a
$ lsmod | grep ipp2p
xt_ipp2p                9344  0 
x_tables               25768  3 xt_ipp2p,iptable_nat,ip_tables

Proporciona un conjunt de pegats per a iptables que no formen part de la versió principal d'iptables:

$ dpkg -L xtables-addons-common
/.
/usr
/usr/sbin
/usr/sbin/ipset
/usr/share
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/ipset.8.gz
/usr/share/man/man8/xtables-addons.8.gz
/usr/share/doc
/usr/share/doc/xtables-addons-common
/usr/share/doc/xtables-addons-common/copyright
/usr/share/doc/xtables-addons-common/changelog.Debian.gz
/lib
/lib/xtables
/lib/xtables/libipset_iphash.so
/lib/xtables/libipset_ipmap.so
/lib/xtables/libipset_ipporthash.so
/lib/xtables/libipset_ipportiphash.so
/lib/xtables/libipset_ipportnethash.so
/lib/xtables/libipset_iptree.so
/lib/xtables/libipset_iptreemap.so
/lib/xtables/libipset_macipmap.so
/lib/xtables/libipset_nethash.so
/lib/xtables/libipset_portmap.so
/lib/xtables/libipset_setlist.so
/lib/xtables/libxt_CHAOS.so
/lib/xtables/libxt_DELUDE.so
/lib/xtables/libxt_DHCPMAC.so
/lib/xtables/libxt_dhcpmac.so
/lib/xtables/libxt_IPMARK.so
/lib/xtables/libxt_LOGMARK.so
/lib/xtables/libxt_RAWDNAT.so
/lib/xtables/libxt_RAWSNAT.so
/lib/xtables/libxt_STEAL.so
/lib/xtables/libxt_SYSRQ.so
/lib/xtables/libxt_TARPIT.so
/lib/xtables/libxt_TEE.so
/lib/xtables/libxt_condition.so
/lib/xtables/libxt_fuzzy.so
/lib/xtables/libxt_geoip.so
/lib/xtables/libxt_iface.so
/lib/xtables/libxt_ipp2p.so
/lib/xtables/libxt_ipv4options.so
/lib/xtables/libxt_length2.so
/lib/xtables/libxt_lscan.so
/lib/xtables/libxt_quota2.so

Per filtrar-ho tot:

$ sudo iptables -A FORWARD -m ipp2p --ipp2p -j DROP

o per filtrar protocols concrets:

iptables -A FORWARD -p tcp -m ipp2p --edk -j DROP
iptables -A FORWARD -p udp -m ipp2p --edk -j DROP
iptables -A FORWARD -p tcp -m ipp2p --dc -j DROP
iptables -A FORWARD -p tcp -m ipp2p --kazaa -j DROP
iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP
iptables -A FORWARD -p tcp -m ipp2p --gnu -j DROP
iptables -A FORWARD -p udp -m ipp2p --gnu -j DROP
iptables -A FORWARD -p tcp -m ipp2p --bit -j DROP
iptables -A FORWARD -p udp -m ipp2p --bit -j DROP
iptables -A FORWARD -p tcp -m ipp2p --apple -j DROP
iptables -A FORWARD -p tcp -m ipp2p --winmx -j DROP
iptables -A FORWARD -p tcp -m ipp2p --soul -j DROP
iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP


Compilar

$ sudo su
# mkdir ipp2p
# cd ippp2p
# wget https://sourceforge.net/projects/xtables-addons/files/Xtables-addons/1.23/xtables-addons-1.23.tar.bz2/download
# tar jxvf xtables-addons-1.23.tar.bz2
# cd xtables-addons-1.23.tar.bz2
# ./configure
# make
# make install
$ lsmod | grep ipp2p
xt_ipp2p                9344  0 
x_tables               25768  3 xt_ipp2p,iptable_nat,ip_tables

Fitxers de configuració d'iptables

/etc/network/if-up.d/iptables

Fitxer /etc/network/if-up.d/iptables
#!/bin/sh
iptables-restore < /etc/firewall.conf

Fitxer /etc/firewall.conf:

# Generated by iptables-save v1.3.6 on Fri Nov 30 13:32:15 2007
*nat
:PREROUTING ACCEPT [6481:388698]
:POSTROUTING ACCEPT [5982:358512]
:OUTPUT ACCEPT [77:5857]
COMMIT
# Completed on Fri Nov 30 13:32:15 2007
# Generated by iptables-save v1.3.6 on Fri Nov 30 13:32:15 2007
*filter
:INPUT ACCEPT [7615:886626]
:FORWARD ACCEPT [195744:152678624]
:OUTPUT ACCEPT [6875:2682825]
#Bloquejar port del messenger
-A FORWARD -s 192.168.1.0/255.255.255.0 -p tcp -m tcp --dport 1863 -j DROP
-A FORWARD -s 192.168.2.0/255.255.255.0 -p tcp -m tcp --dport 1863 -j DROP
-A FORWARD -s 192.168.3.0/255.255.255.0 -p tcp -m tcp --dport 1863 -j DROP
-A FORWARD -s 192.168.4.0/255.255.255.0 -p tcp -m tcp --dport 1863 -j DROP
-A FORWARD -s 192.168.5.0/255.255.255.0 -p tcp -m tcp --dport 1863 -j DROP
-A FORWARD -s 192.168.6.0/255.255.255.0 -p tcp -m tcp --dport 1863 -j DROP
-A FORWARD -s 192.168.7.0/255.255.255.0 -p tcp -m tcp --dport 1863 -j DROP
-A FORWARD -s 192.168.8.0/255.255.255.0 -p tcp -m tcp --dport 1863 -j DROP
#Bloquejar ports de proxys
-A FORWARD -s 192.168.1.0/255.255.255.0 -p tcp -m tcp --dport 1080 -j DROP
-A FORWARD -s 192.168.2.0/255.255.255.0 -p tcp -m tcp --dport 1080 -j DROP
-A FORWARD -s 192.168.3.0/255.255.255.0 -p tcp -m tcp --dport 1080 -j DROP
-A FORWARD -s 192.168.4.0/255.255.255.0 -p tcp -m tcp --dport 1080 -j DROP
-A FORWARD -s 192.168.5.0/255.255.255.0 -p tcp -m tcp --dport 1080 -j DROP
-A FORWARD -s 192.168.6.0/255.255.255.0 -p tcp -m tcp --dport 1080 -j DROP
-A FORWARD -s 192.168.7.0/255.255.255.0 -p tcp -m tcp --dport 1080 -j DROP
-A FORWARD -s 192.168.8.0/255.255.255.0 -p tcp -m tcp --dport 1080 -j DROP
#Excepció per accedir a quealsevol port de servidors de la xarxa local i altres...
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 192.168.0.7 -j ACCEPT
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d atenea.upc.edu -j ACCEPT
-A FORWARD -s 192.168.1.0/255.255.255.0 -p tcp -m tcp --dport 8080 -j DROP
-A FORWARD -s 192.168.2.0/255.255.255.0 -p tcp -m tcp --dport 8080 -j DROP
-A FORWARD -s 192.168.3.0/255.255.255.0 -p tcp -m tcp --dport 8080 -j DROP
-A FORWARD -s 192.168.4.0/255.255.255.0 -p tcp -m tcp --dport 8080 -j DROP
-A FORWARD -s 192.168.5.0/255.255.255.0 -p tcp -m tcp --dport 8080 -j DROP
-A FORWARD -s 192.168.6.0/255.255.255.0 -p tcp -m tcp --dport 8080 -j DROP
-A FORWARD -s 192.168.7.0/255.255.255.0 -p tcp -m tcp --dport 8080 -j DROP
-A FORWARD -s 192.168.8.0/255.255.255.0 -p tcp -m tcp --dport 8080 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp --dport 3128 -j DROP
#Bloquejar màquines concretes (proxys anònims i altres...)
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 123.232.108.98 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 222.161.2.103 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 72.160.22.129 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 218.57.11.112 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 222.161.2.70 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 211.108.62.100 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 60.21.161.73 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 125.242.37.101 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 200.14.237.58 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 222.66.124.228 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 209.132.213.159 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 200.14.237.58 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 62.75.152.60 -j DROP  
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 209.132.213.159 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 221.12.147.80 -j DROP  
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 61.136.63.125 -j DROP  
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 211.108.62.100 -j DROP 
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 218.28.134.202 -j DROP 
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 211.116.254.203 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 61.61.132.129 -j DROP  
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 74.72.82.142 -j DROP   
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 69.253.216.130 -j DROP 
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 74.72.231.189 -j DROP  
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 66.161.204.167 -j DROP 
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 221.12.147.80 -j DROP  
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 211.108.62.100 -j DROP 
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 218.57.11.112 -j DROP  
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 123.232.108.98 -j DROP 
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 210.124.122.136 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 67.149.157.177 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 75.19.116.93 -j DROP  
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 219.240.36.173 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 200.65.127.161 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 69.25.20.0/255.255.254.0 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp --dport 3389 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp --dport 4461 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp --dport 4462 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp --dport 4465 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp --dport 4672 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp --dport 4711 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp --dport 4712 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p udp -m udp --dport 4465 -j DROP
-A FORWARD -p tcp -m tcp --dport 4661:4711 -j DROP
-A FORWARD -p udp -m udp --dport 4661:4711 -j DROP
-A FORWARD -m ipp2p --ipp2p -j DROP
-A FORWARD -p tcp -m tcp --dport 5900:5906 -j DROP 

#MEEBO
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 208.81.191.126 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 208.81.191.133 -j DROP
#PROXRIO
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 67.159.45.52 -j DROP

#MUNDO DEPORTIVO
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 194.224.66.89 -j DROP 

#ACCOUNT LIVE
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 65.55.196.248 -j DROP

#COUNTER STRIKE SERVERS
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 213.149.249.104 -j DROP
-A FORWARD -s 192.168.0.0/255.255.248.0 -p udp -m udp --dport 27030 -j DROP 

-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 78.40.120.180 -j DROP

#SERVERSPY
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 64.72.116.57 -j DROP 

#IMO.IM
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d 64.13.152.67 -j DROP

#NETSHADOW
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d netshadow.no-ip.biz -j DROP

#cgm-images.adbureau.net
-A FORWARD -s 192.168.0.0/255.255.248.0 -p tcp -m tcp -d cgm-images.adbureau.net -j DROP 

COMMIT
# Completed on Fri Nov 30 13:32:15 2007
# Generated by iptables-save v1.3.6 on Fri Nov 30 13:32:15 2007
*mangle
:PREROUTING ACCEPT [530725055:429948106333]
:INPUT ACCEPT [2284741:961507955]
:FORWARD ACCEPT [528358412:428978075666]
:OUTPUT ACCEPT [1818419:349081939]
:POSTROUTING ACCEPT [530176386:429327129021]
-A PREROUTING -s 192.168.12.0/255.255.255.0 -i eth12 -m state --state NEW,RELATED,ESTABLISHED -j MARK --set-mark 0x2
COMMIT
# Completed on Fri Nov 30 13:32:15 2007

Decidir una ruta segons l'origen del paquet

Fitxer /etc/network/if-up.d/forward_departament:

 #!/bin/sh
 [ "$IFACE" = "eth12" ] || exit 0
 ip route add default via 192.168.0.10 dev eth0 table adsl1
 iptables -A PREROUTING -i eth12 -s 192.168.12.0/24 -t mangle -m state --state NEW,ESTABLISHED,RELATED -j MARK --set-mark 2
 ip rule add fwmark 2 table adsl1
 ip route flush cache
 echo "Configurada la ruta..."

Vegeu també

Recursos

OpenFPnet
IES Nicolau Copèrnic