Iptables

De SergiTurWiki

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

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.

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:

Imatge:State-tcp-connecting.jpg

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

Imatge:State-tcp-closing.jpg

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

Imatge: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

/proc/net/ip_conntrack

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

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


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

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ó.

Image: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:

Image: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:

Image:Tcp-headers.jpg

Imatge: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):

Imatge: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

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

Image:Tables traverse.jpg

Imatge:Iptables diagram.png

Iptables

Iptables és la comanda d'usuari encarregada de gestionar les 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

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 morma

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 eth0 -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 eth0: é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

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

Ú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ó:

Imatge: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:

Imatge:Firestarter2.jpg

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

Imatge: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'adredes 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

Exemples

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 OUTPUT -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:

$ iptables-save > /etc/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 "iptables-restore < /etc/firewall.conf" >> /etc/network/if-up.d/iptables
$ chmod +x /etc/network/if-up.d/iptables

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

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

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

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


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

IES Nicolau Copèrnic