Curs: | DissenyXarxesLinux, LinuxAdministracioAvancada |
Fitxers: | iptables.pdf (iptables.odp) |
Repositori SVN: | http://[email protected]/svn/LinuxAdministracioAvan%c3%a7ada/moodle/sessio4 |
Usuari: | anonymous |
Paraula de pas: | sense paraula de pas |
Autors: | Sergi Tur Badenas |
http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html http://www.techrepublic.com/blog/10things/10-iptables-rules-to-help-secure-your-linux-box/539
Les cadenes contenen 0 o més regles (conjunt de regles o ruleset). Es poden utilitzar les següents cadenes:
Cada cadena té el seu objectiu i s'han d'utilitzar tenint en compte aquest objectiu:
Veieu el següent apartat (tables) per entendre la importància dels verbs filtrar i manipular.
Segons això podríem parlar d'una semàntica de iptables on:
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:
Hi ha altres destinacions anomenades d'extensió:
Segons el manual:
$ man iptables ... aprox. línia 1476 ... REJECT This is used to send back an error packet in response to the matched packet: otherwise it is equivalent to DROP so it is a termi‐ nating TARGET, ending rule traversal. This target is only valid in the INPUT, FORWARD and OUTPUT chains, and user-defined chains which are only called from those chains. The following option controls the nature of the error packet returned: --reject-with type The type given can be icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited or icmp-admin-prohibited (*) which return the appropriate ICMP error message (port-unreachable is the default). The option tcp-reset can be used on rules which only match the TCP protocol: this causes a TCP RST packet to be sent back. This is mainly useful for blocking ident (113/tcp) probes which frequently occur when sending mail to broken mail hosts (which won't accept your mail otherwise).
NOTA: Vegeu l'article sobre ICMP per tal de veure els tipus de paquets icmp.
És a dir es pot especificar el tipus de REJECT --reject-with type. Per exemple:
$ sudo iptables -A INPUT -p tcp --dport 84 -j REJECT --reject-with icmp-host-prohibited
o:
$ sudo iptables -A OUTPUT -d 147.83.2.3 -j REJECT --reject-with icmp-host-prohibited ping 147.83.2.3 ... From 192.168.111.2 icmp_seq=1 Destination Host Prohibited
Consulteu també ICMP.
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:
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:
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
De sortida:
$ sudo iptables -A OUTPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
D'entrada:
$ sudo iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
D'un router (típic amb SNAT):
$ sudo iptables -A FORWARD -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
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"
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
$ 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
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:
$ 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
Consulteu netstat-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:
[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.
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.
Vegeu també: Bridging#Linux![]()
Al següent diagrama podem observar el diagrama de flux d'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.
$ 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.
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.)
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
Consulteu l'apartat Executant les normes iptables des de l'arrancada del sistema.
[TODO]
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Recursos:
[TODO]
-m comment --comment "limit ssh access"
$ 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
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
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
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:
$ 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.
$ 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
Imagineu un router on:
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
$ 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
$ 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
Si la IP del encaminador pot canviar, aleshores es millor utilitzar masquerade:
$ sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wan -j MASQUERADE
On:
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
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:
NOTA: Alguns dispositius com routers ADSL casolans, a aquesta configuració l'anomenen DMZ (zona desmilitarizada), tot i que no és del tot correcte el nom que utilitzen
Un port concret, totes les màquines d'origen:
$ iptables -t nat -A PREROUTING -p tcp -d 10.10.20.99 --dport 80 -j DNAT --to-destination 10.10.14.2
Aquest cas és igual que l'anterior però només estem obrint el port 80.
NOTA: si la màquina destinació té un gateway diferent a la màquina a la que fem el DNAT segurament necessitareu fer Source Routing
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).
Vegeu nmap
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 [email protected]
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.
$ sudo iptables -I INPUT -p icmp -m mac --mac-source AS:23:AB:11:00:00 -j DROP
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
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ç
$ 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/
Afegir a crontab:
*/10 * * * * /sbin/iptables -F
$ 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
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:
/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
Consulteu Load Balancing.
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
Primer cal crear la cadena:
$ sudo iptables -N LOGDROP > /dev/null 2> /dev/null $ sudo iptables -F LOGDROP $ sudo iptables -A LOGDROP -j LOG --log-prefix "LOGDROP " $ sudo iptables -A LOGDROP -j DROP
The first rule in this set creates the new chain. The output is sent to /dev/null because if you attempt to run this twice on the same system, you will get an error saying the chain already exists. It's up to you if you want to see that message or not.
The second rule flushes the contents of the chain, again, so that if you run it twice on the same system you don't have duplicate rules in the chain.
The third rule LOGS the traffic with the added "LOGDROP" prefix and the fourth rule DROPs the traffic
Per utilitzar la cadena:
# Log and drop all connections to the HTTP port $ sudo iptables -A INPUT -p tcp --dport 80 -j LOGDROP
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
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
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.
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!
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
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
TCP Extensions:
The TCP extensions are automatically loaded if `-p tcp' is specified. It provides the following options (none of which match fragments).
--tcp-flags Followed by an optional `!', then two strings of flags, allows you to filter on specific TCP flags. The first string of flags is the mask: a list of flags you want to examine. The second string of flags tells which one(s) should be set. For example, # iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP This indicates that all flags should be examined (`ALL' is synonymous with `SYN,ACK,FIN,RST,URG,PSH'), but only SYN and ACK should be set. There is also an argument `NONE' meaning no flags. --syn Optionally preceded by a `!', this is shorthand for `--tcp-flags SYN,RST,ACK SYN'. --source-port followed by an optional `!', then either a single TCP port, or a range of ports. Ports can be port names, as listed in /etc/services, or numeric. Ranges are either two port names separated by a `:', or (to specify greater than or equal to a given port) a port with a `:' appended, or (to specify less than or equal to a given port), a port preceded by a `:'. --sport is synonymous with `--source-port'. --destination-port and --dport are the same as above, only they specify the destination, rather than source, port to match. --tcp-option followed by an optional `!' and a number, matches a packet with a TCP option equaling that number. A packet which does not have a complete TCP header is dropped automatically if an attempt is made to examine its TCP options. Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere anywhere tcp flags:SYN,RST,ACK/SYN
A la gràfica de la dreta podeu veure el diagrama que indica el camí que segueixen els paquets al passar pel nucli del sistema (Linux kernel traversal).
La idea d'aquest exercici és veure pas a pas el camí que segueixen els paquets d'una petició de connexió TCP (SYN i SYN_ACK). Per tal de simular una connexió TCP podem utilitzar netcat. Crearem un "servidor" escoltant al port 5000, la intenció és simular una connexió client/servidor:
$ nc -l -p 5000
Veureu que queda bloquejat (a l'espera de una connexió, l'opció -l vol dir listen). En un altre terminal farem una connexió amb:
$ nc localhost 5000
El procés de connexió TCP el podeu veure a la següent gràfica:
IMPORTANT: Cada cop que us connecteu/desconnecteu haureu de tornar a executar el "servidor" i el client. Tot i que les poseu no apareixeran al fitxer de log!!!
Les següents normes iptables ens permeten fer un log que permet veure el procés.
El paquet entrant a la màquina:
$ sudo iptables -t raw -A PREROUTING -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] Paquet SYN entrant: " $ sudo iptables -t raw -A PREROUTING -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] RAW PREROUTING: " $ sudo iptables -t mangle -A PREROUTING -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] MANGLE PREROUTING: " $ sudo iptables -t mangle -A PREROUTING -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] entregat a rutes: " $ sudo iptables -t nat -A PREROUTING -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] NAT PREROUTING: " $ sudo iptables -t mangle -A INPUT -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] MANGLE INPUT: " $ sudo iptables -t filter -A INPUT -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] FILTER INPUT: " $ sudo iptables -t filter -A INPUT -p tcp --dport 5000 --syn -j LOG --log-prefix "[FW] SYN entregat local: "
IMPORTANT: Com podeu veure la taula NAT no es travessada en aquest tipus de connexió! Les comandes en negreta no serien necessàries
El paquet entrant a la màquina:
$ sudo iptables -t raw -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] Paquet ACK sortint: " $ sudo iptables -t raw -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] RAW OUTPUT: " $ sudo iptables -t mangle -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] MANGLE OUTPUT: " $ sudo iptables -t nat -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] NAT OUTPUT: " $ sudo iptables -t filter -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] FILTER OUTPUT: " $ sudo iptables -t filter -A OUTPUT -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] ACK entregat a rutes: " $ sudo iptables -t mangle -A POSTROUTING -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[FW] MANGLE POSTROUTING: " $ sudo iptables -t nat -A POSTROUTING -p tcp --sport 5000 --tcp-flags ALL ACK -j LOG --log-prefix "[Fw] NAT POSTROUTING: "
La configuració del firewall ha de quedar:
$ sudo iptables-save # Generated by iptables-save v1.4.4 on Tue Feb 8 18:32:41 2011 *nat :PREROUTING ACCEPT [205:55671] :POSTROUTING ACCEPT [238:16102] :OUTPUT ACCEPT [238:16102] -A PREROUTING -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] NAT PREROUTING: " -A POSTROUTING -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[Fw] NAT POSTROUTING: " -A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] NAT OUTPUT: " COMMIT # Completed on Tue Feb 8 18:32:41 2011 # Generated by iptables-save v1.4.4 on Tue Feb 8 18:32:41 2011 *mangle :PREROUTING ACCEPT [4729:1811193] :INPUT ACCEPT [3455:1401945] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [2713:483905] :POSTROUTING ACCEPT [2739:488955] -A PREROUTING -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] MANGLE PREROUTING :" -A PREROUTING -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] entregat a rutes::" -A INPUT -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] MANGLE INPUT :" -A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] MANGLE OUTPUT: " -A POSTROUTING -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] MANGLE POSTROUTING: " COMMIT # Completed on Tue Feb 8 18:32:41 2011 # Generated by iptables-save v1.4.4 on Tue Feb 8 18:32:41 2011 *raw :PREROUTING ACCEPT [5072:1897170] :OUTPUT ACCEPT [2726:485272] -A PREROUTING -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] Paquet SYN entrant: " -A PREROUTING -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] RAW PREROUTING: " -A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] Paquet ACK sortint: " -A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] RAW OUTPUT: " COMMIT # Completed on Tue Feb 8 18:32:41 2011 # Generated by iptables-save v1.4.4 on Tue Feb 8 18:32:41 2011 *filter :INPUT ACCEPT [7792:4303112] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [6052:990203] -A INPUT -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] FILTER INPUT: " -A INPUT -p tcp -m tcp --dport 5000 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "[FW] SYN entregat local: " -A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] FILTER OUTPUT: " -A OUTPUT -p tcp -m tcp --sport 5000 --tcp-flags FIN,SYN,RST,PSH,ACK,URG ACK -j LOG --log-prefix "[FW] ACK entregat a rutes: " COMMIT # Completed on Tue Feb 8 18:32:41 2011
Si ara simulem la connexió TCP. En una terminal:
$ nc -l -p 5000
En un altre
$ nc localhost 5000 Ctrl+C
Ara al fitxer de log veureu:
$ sudo tail -f /var/log/syslog ... Feb 8 18:35:31 ubuntuacer kernel: [ 3785.594215] [FW] Paquet SYN entrant: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 Feb 8 18:35:31 ubuntuacer kernel: [ 3785.594199] [firewall] RAW PREROUTING IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 Feb 8 18:35:31 ubuntuacer kernel: [ 3785.594254] [FW] MANGLE PREROUTING: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 Feb 8 18:35:31 ubuntuacer kernel: [ 3785.594267] [FW] MANGLE INPUT :IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 Feb 8 18:35:31 ubuntuacer kernel: [ 3785.594280] [FW] FILTER INPUT :IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 Feb 8 18:35:31 ubuntuacer kernel: [ 3785.594293] [FW] SYN entregat proc local IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=10543 DF PROTO=TCP SPT=45212 DPT=5000 WINDOW=32792 RES=0x00 SYN URGP=0 Feb 8 18:35:34 ubuntuacer kernel: [ 3788.872585] [FW] Paquet ACK sortint: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF PROTO=TCP SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0 Feb 8 18:35:34 ubuntuacer kernel: [ 3788.872602] [FW] RAW OUTPUT: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF PROTO=TCP SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0
Feb 8 18:35:34 ubuntuacer kernel: [ 3788.872617] [FW] MANGLE OUTPUT: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF PROTO=TCP SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0 Feb 8 18:35:34 ubuntuacer kernel: [ 3788.872630] [FW] FILTER OUTPUT: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF PROTO=TCP SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0 Feb 8 18:35:34 ubuntuacer kernel: [ 3788.872643] [FW] ACK entregat taul rutes: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF PROTO=TCP SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0 Feb 8 18:35:34 ubuntuacer kernel: [ 3788.872656] [FW] MANGLE POSTROUTING: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=1261 DF PROTO=TCP SPT=5000 DPT=45212 WINDOW=512 RES=0x00 ACK URGP=0
Ara podem intentar observar només els paquets established:
$ sudo iptables -A PREROUTING -p tcp -m tcp --dport 5000 -m state --state ESTABLISHED -j LOG --log-prefix "[FW] MANGLE PREROUTING :"
Permet marcar paquets (no es marquen físicament! només és una marca en la estructura de dades que hi ha a la memòria RAM del ordinador que executa iptables!) per tal de poder realitzar tasques posteriors com:
Consulteu: Iptables#Filtrar_segons_usuari_o_UID
Consulteu Iptables#Decidir_una_ruta_segons_l.27origen_del_paquet
Consultar:
Policy Routing
Per tal de gestionar les normes d'un firewall que treballi amb IPv6 cal utilitzar l'ordre ip6tables en comptes de la comanda iptables.
IMPORTANT: NAT és quelcom obsolet amb IPv6 i per tant no hi ha taula NAT a ip6tables:
$ sudo ip6tables -nvL -t nat ip6tables v1.4.12: can't initialize ip6tables table `nat': Table does not exist (do you need to insmod?) Perhaps ip6tables or your kernel needs to be upgraded.
Vegeu també:
Podeu consultar els manuals:
http://linux.die.net/man/8/ip6tables
La idea es captar la connexió TCP amb normes de log d'iptables i anar mostrant un xivato a un fitxer de log. Es vol veure com passar per totes les cadenes de totes les taules.
La idea és fer-ho conjuntament amb netcat, només per a l'establiment de connexió TCP (SYN,SYN ACK)
TODO:
També taula de rutes amb:
ip monitor route---
ídem a l'anterior però a un router que fa FORWARD i SNAT.
#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?
Exemple en una xarxa de classe C 192.168.1.0/24:
$ sudo iptables -t nat -A PREROUTING -i eth0 -s 192.168.1.0/24 ! -d 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128
El mateix amb una xarxa 147.83.75.128/25:
$ sudo iptables -t nat -A PREROUTING -i eth0 -d ! 147.83.75.128/25 -p tcp --dport 80 -j REDIRECT --to-port 3128
Si el proxy esta en un altre màquina:
$ sudo iptables -t nat -A PREROUTING -s 147.83.75.132 -d ! 147.83.75.128/25 -p tcp --dport 80 -j DNAT --to-destination 147.83.75.147:3128
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:
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
A Debian hi ha dues formes. L'antiga i la nova ;-):
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
Un cop tenim les normes ben configurades podem executar:
$ sudo -i # iptables-save > /etc/firewall/firewall.conf
Per tal de crear l'script /etc/network/if-up.d/iptables amb les següents comandes:
$ echo "#!/bin/sh" > /etc/network/if-up.d/iptables $ echo "/sbin/iptables-restore < /etc/firewall/firewall.conf" >> /etc/network/if-up.d/iptables $ chmod +x /etc/network/if-up.d/iptables
El fitxer /etc/network/if-pre-up.d/iptables queda de la següent manera:
#!/bin/sh /sbin/iptables-restore < /etc/firewall/firewall.conf
IMPORTANT: Podeu també utilitzar el fitxer /etc/network/if-up.d/iptables però no és tant segur ja que hi haurà un lapse molt curt de temps entre el moment que s'ha configurat la xarxa i l'execució de la comanda durant el qual el vostre servidor no estarà segur.
Una altra opció és:
iptables-save -c > /etc/iptables-save
I afegir un pre-up al fitxer /etc/network/interfaces:
........... auto eth0 iface eth0 inet dhcp pre-up cat /etc/iptables-save | iptables-restore -c ...........
Recursos:
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:
NOTA: Llegiu abans xtables-addons
Pas a pas:
$ cd $ mkdir ipp2p $ cd ipp2p $ wget http://www.ipp2p.org/downloads/ipp2p-0.8.2.tar.gz $ tar xvzf ipp2p-0.8.2.tar.gz
Descarreguem un pegat:
$ wget http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo-x86/net-firewall/ipp2p/files/ipp2p-0.8.2-kernel-2.6.22.patch
Consultem la versió d'iptables amb:
$ sudo iptables --help
Jo tinc iptables v1.3.6 i per tant m'he de baixar el codi font del IPTABLES corresponent
$ cd /ur/src $ sudo wget http://www.netfilter.org/projects/iptables/files/iptables-1.3.6.tar.bz2 $ sudo tar jxvf iptables-1.4.4.tar.bz2
Instal·lem el headers del kernel i el paquet iptables-dev:
$ sudo apt-get install linux-headers-`uname -r` iptables-dev
$ cd ipp2p-0.8.2/
Ara apliquem el pegat:
$ patch -p1 < ../ipp2p-0.8.2-kernel-2.6.22.patch
Editem el MakeFile:
I modifiquem la línia:
ld -shared -o libipt_ipp2p.so libipt_ipp2p.o
(està abans del target clean) per:
$(CC) -shared -o libipt_ipp2p.so libipt_ipp2p.o
Ara executem:
$ make
No ha de donar cap error. Per instal·lar el que hem compilat:
$ sudo cp libipt_ipp2p.so /lib/iptables
$ sudo cp ipt_ipp2p.ko /lib/modules/`uname -r`/kernel/net/ipv4
Carreguem el mòdul del kernel:
$ sudo depmod
$ sudo insmod ipt_ipp2p.ko
Comproveu que s'ha carregat:
$ lsmod | grep ipp2p ipt_ipp2p 9472 1 x_tables 16260 6 ipt_ipp2p,xt_state,xt_MARK,xt_tcpudp,iptable_nat,ip_tables
Comprovem que funciona amb:
$ sudo iptables -m ipp2p --help
Per filtrar-ho tot:
$ sudo iptables -A FORWARD -m ipp2p --ipp2p -j DROP
Recursos:
Parches:
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).
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
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
$ 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
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
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..."