Iptables
De SergiTurWiki
| 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 |
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
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:
i el mateix per al tancament d'una connexió:
Els timeouts per defecte (poden variar més o menys entre sistemes):
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 am 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
- http://www.control.auc.dk/~jdn/edu/litt/ip-tables/iptables/iptables-tutorial.frozentux.net/chunkyhtml/x1309.html
- http://www.wallfire.org/misc/netfilter_conntrack_perf.txt
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 installconntrack-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:
- http://www.cisco.com/warp/public/556/nat.swf
- NAT a la wikipedia (en)
- NAT a la wikipedia (es)
- PAT (Port Adress translation)
- Cisco NAT flash
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ó.
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:
É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:
I filtrar per ports (Source Port i Destination Port).
També treballar amb les trames del nivell d'interfície de xarxa (Ethernet):
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:
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
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
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.
Ú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ó:
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:
Si fem click ens obrirà firestarter i si anem a la pestanya Esdeveniments podrem permetre la connexió que ha impedit firestarter:
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
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
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:
$ sudo -i # 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:
- http://sukiweb.net/archivos/2007/01/25/debian-con-iptables/
- http://www.howtoforge.com/linux_iptables_sarge
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:
- http://www.ubuntu-es.org/index.php?q=node/24844
- http://www.mail-archive.com/debian-user-spanish@lists.debian.org/msg156790.html
- http://www.techno.mayix.net/2008/01/14/iptables-v138-couldn%E2%80%99t-load-match-ipp2p%E2%80%99/
- http://www.mail-archive.com/debian-user-spanish@lists.debian.org/msg156871.html
- http://forums.fedoraforum.org/archive/index.php/t-180325.html
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..."











