Está en la página 1de 6

seguridad

Iptables en Linux

Firewall en Linux
Walter Cervini
Amigos lectores, voy a dedicar este captulo a los firewall en Linux o lo que es lo mismo cortinas,
paredes o muros de fuego. La funcin bsica de un firewall es la de filtrar paquetes. Los firewall
pueden ser de Hardware o de Software. En Linux el firewall est compilado en el kernel, lo que lo hace
disponible en cualquier distribucin Linux, y no es necesario arrancar ningn tipo de aplicacin ya que
arranca cada vez que se inicia el Sistema Operativo. Se preguntarn, cmo dejo de filtrar paquetes?
Sencillo, el firewall en Linux es manejado por reglas, si no existen reglas, queda inactivo.

E
n el mundo Open Source existen una cantidad NAT: Permite el enmascaramiento de IP, la cual es muy
linux@software.com.pl

de aplicaciones grficas que permiten gene- usada en el paso de una red a otra, a travs de varias
rar reglas de modo sencillo, de las cuales me interfaces de red.
llama la atencin fwbuilder y webmin (ste MANGLE: Permite la modificacin del paquete como
permite la administracin de la mquina de forma re- puede ser TOS (Type of Service), TTL (Time to Live), o
mota va web, y tiene una funcin para manejo de filtro mark, lo cual permite marcar el paquete (usado para
de paquetes). QOS o Calidad de Servicio)

Cmo se crean las reglas... Cada una de estas tablas poseen cadenas, que no son ms
Para comenzar, para versiones de kernel anterior a 2.4, se que la agrupacin de reglas. Cada tabla posee cadenas por
usa el comando ipchain, posterior a esta versin de ker- defecto, las cuales no pueden ser eliminadas.
nel se usa iptables, que es la que explicaremos. La dife- Adems de las cadenas por defecto, podemos tener
rencia entre iptables e ipchain es el aporte de muchas mejo-nuestras cadenas, que nos permitirn agrupar y darle un
ras. poco de orden a las reglas.
Iptables maneja tablas las cuales son filter (filtrado), El proceso de funcionamiento de iptables lo podemos
NAT o Network Address Translation (translacin de puer- ver en la grfica siguiente, basta que alguna regla cumpla
tos), mangle (alteracin de paquetes). con la condicin del paquete entrante o saliente para que
Descripcin de las tablas sea aplicada:
Es recomendable recordar estos pasos, cuando se ge-
FILTER: Esta es la tabla por defecto, permite generar neren reglas. Continuando con reglas, adems de las tab-
reglas de filtrado. Qu paquetes aceptar, cuales recha- las y las cadenas, tenemos los parmetros que deseamos
zar o cuales paquetes omitir. filtrar, convertir, marcar, etc. Los parmetros pueden ser

60 Linux+ 4/2007
seguridad
Iptables en Linux

interfaces de red, sean de entrada o salida, Vamos a describir a continuacin los co- -L listado de reglas de la cadena cadena.
direcciones IP origen o destino, puertos de mandos: Si no se especifica la cadena listar todas
origen o destino, en fin podemos generar las reglas de todas las cadenas,
reglas desde lo ms simple a lo ms comple- -R Reemplazar la regla numero_regla -F eliminar todas las reglas de la cadena
jo. existente en la cadena cadena por los pa- cadena. (Si no se especifica la cadena eli-
Cada una de las reglas tiene como resul- rmetros dados, minar todas las reglas de todas las cade-
tado final una accin. La accin la podemos -A Agregar una nueva regla al final de la nas),
definir como qu debemos hacer con el pa- cadena especificada cadena, -Z Colocar en cero los contadores de pa-
quete. Cada cadena tiene una accin definida -I Insertar una nueva regla antes de la quetes y bytes de la cadena. (Si no se es-
por defecto, debido a que si no existe regla regla numero_regla en la cadena cadena pecifica la cadena borrar todos los con-
que cumpla con la condicin del paquete se por los parmetros dados, tadores de todas las reglas en todas las
ejecuta la accin por defecto. -D Eliminar la regla numero_regla exis- cadenas).
Las acciones pueden ser ACCEPT, RE- tente en la cadena cadena,
JECT, DROP, MASQUERADE, DNAT, SNAT, -N Crear una nueva cadena con el nom- Los parmetros
LOG bre cadena, Los parmetros en iptables son la base prin-
-X Elimina cadena con el nombre cade- cipal de una regla, ya que define la condicin
ACCEPT: como su nombre lo indica, el na. (No deben existir reglas para poder de una regla. Los parmetros pueden ser
paquete es aceptado, eliminar una cadena), direcciones IP de origen y/o destino, puerto
REJECT: el paquete es rechazado y el emi- -P Modifica accin por defecto de la ca- de entrada y/o salida, etc. Voy a detallar cada
sor recibe notificacin a travs del proto- dena cadena, uno de estos parmetros a continuacin:
colo ICMP, -E Modifica el nombre de la cadena nom-
DROP: el paquete es descartado y no se bre-anterior-cadena por nombre-nue- -i Interfaz de entrada (eth0, eth1,eth2,
enva ninguna notificacin al emisor, va-cadena, etc),
MASQUERADE: enmascaramiento de la
direccin IP origen de forma dinmica
(ms adelante se explicar),
DNAT: enmascaramiento de la direccin
destino, ideal para re-enrutado de pa-
quetes,
SNAT: enmascaramiento de la IP origen
similar a MASQUERADE pero con IP
FIJA.

Un punto muy importante que vale la pena


resaltar en la secuencia de lectura de las reg-
las. Las reglas son ledas de modo secuen-
cial, si se cumple alguna regla sta es pro-
cesada y se ejecuta la accin con el paquete,
saliendo del ciclo de verificacin de reglas,
es decir si la primera regla en la tabla filter
de la cadena input es rechazar cualquier
paquete, las siguientes reglas no son verifi-
cadas por iptables.

Sintaxis del comando iptables


El comando iptables tiene un sin nmero de
parmetros, como tambin comandos. Los
comandos indican que vamos hacer algo con
las reglas, agregar una nueva regla, modificar
una regla existente, insertar, etc. La sintaxis es
sencilla, pero a medida que necesitamos re-
glas complejas stas son ms largas.
Explicando un poco los comandos an-
teriores, quiero resaltar que todo lo que est
entre corchetes es opcional. En el caso de [-t
tabla] si no se especifica por defecto es filter.
Todo lo que aparece posterior a [-t tabla]
es el comando a aplicar a iptables, como por
ejemplo -A, -I. etc. Figura 1. Rutas que sigue un paquete al llegar al Kernel

www.lpmagazine.org 61
seguridad
Iptables en Linux

iptables -t filter -A INPUT protocol te de acceder el puerto 80 de nuestra mquina,


tcp dport telnet -J ACCEPT ste lo aceptar, ya que la primera regla cum-
ple con la condicin sin importar la interfaz de
En estas reglas se permite el acceso del proto- red de entrada y no verifica ninguna otra regla.
colo telnet a la mquina. Para ver la lista de reglas numeradas
podemos agregar el parmetro linea, auto-
Un poco de accin mticamente iptables numerar cada cadena
Teniendo claro la parte conceptual podemos comenzando con el numero 1, y esta informa-
Figura 2. Asociacin de Tablas con las Cadenas
comenzar a generar reglas. cin aparecer en la columna 1:
-o interfaz de salida (eth0, eth1,eth2, etc), Verificacin de reglas de la tabla filter
-p Protocolo (tcp, upd, icmp), iptables -L -n --line
--sport Puerto Origen, iptables -L
--dport Puerto Destino. Eliminemos la regla nmero 1 de la cadena
En la grfica podemos ver entre parntesis la INPUT, la sintaxis nos indica que luego de es-
Cmo se compone una regla poltica por defecto para cada cadena, si en pecificar la cadena, debemos indicar un nme-
La forma de generar una regla es la siguiente: las reglas de filtro o nat, no existe regla que ro de la regla:
cumpla con la condicin del paquete, ste ap-
iptables -t tabla tipo_operacin lica la regla por defecto que por lo general est iptables -D INPUT 1
cadena regla_con_parmetros -J ACCIN en ACCEPT, tambin pueden observar que no
parmetros_accin especifiqu la tabla y que presento informacin De igual manera si quisiramos insertar una
de la tabla filter, si quisiramos ver las reglas regla en la cadena INPUT antes de la regla 1, la
Veamos un ejemplo, supongamos que quere- de la tabla nat solamente debemos especificar sintaxis nos indica que el comando es I segui-
mos filtrar el trfico de entrada a la mquina la tabla; do del nmero de regla:
del protocolo telnet descartando el paquete, la
regla de iptables se vera de la siguiente forma: iptables -t nat -L Iptables -I INPUT 1 -p tcp dport 22
-i eth0 -j ACCEPT
iptables -t filter -A INPUT -p tcp Coloquemos la regla por defecto en la tabla
dport 23 -J DROP filter de la cadena INPUT en descarte de pa- Otro punto importante es que podemos te-
iptables -t filter -A INPUT protocol quetes, sin envo de mensajes ICMP: ner nuestras propias cadenas, permitindo-
tcp dport telnet -J DROP nos tener un poco de orden al generar re-
iptables -P INPUT DROP glas. Un ejemplo tpico sera tener cadenas
Ambas lneas descartan el paquete de entrada por mquinas, donde puedo darle permisos
que tenga como destino telnet, no enva nin- Los paquetes que no cumplan con ninguna con- a cada mquina. Lo primero es generar la(s)
gn mensaje a la mquina solicitante ya que dicin o regla sern descartados. Es decir que cadena(s):
descarta el paquete. tenemos que permitir paquetes de entrada o los
paquetes que deseamos que entren a nuestro iptables -N mquina1
iptables -t filter -A INPUT -p tcp equipo. iptables -N mquina2
dport 23 -J REJECT reject-with Permitir paquetes de Internet o http:
icmp-port-unreachable A la mquina 1 le damos permiso para que
iptables -t filter -A INPUT iptables -t filter -a input vea nuestro puerto 80 (http) y a la mquina 2
protocol tcp dport telnet protocol tcp dport http para que vea nuestro puerto 22 (SSH):
-J REJECT reject-with -j ACCEPT iptables -L -v
icmp-port-unreachable iptables -A mquina1 -p tcp dport 80
En la segunda lnea agregamos un nuevo pa- -j ACCEPT
La regla anterior rechaza un paquete con men- rmetro -v , este parmetro nos permite tener iptables -A mquina2 -p tcp dport 22
saje ICMP puerto no encontrado. ms detalle de la informacin de la regla, en -j ACCEPT
concreto las interfaces de entrada y salida del
iptables -t filter -A INPUT paquete. Si deseamos que la regla anterior por ltimo debemos indicar en la cadena IN-
-p tcp dport 23 -J ACCEPT contenga la interfase por donde vaya a entrar PUT que cuando llegue una solicitud de la m-
el paquete sera algo como esto:

iptables -t filter -A INPUT -i eth0


protocol tcp dport 80 -j ACCEPT
iptables -L -v

Podemos ver que cada regla es anexada al


final de la cadena, y tenemos duplicidad de
Figura 3. Listando la tabla filter para ver las reglas reglas en la cadena input, cuando un paque- Figura 4. Listado de la Tabla nat para ver las reglas
de cada cadena te que venga del exterior de la mquina, tra- de cada cadena

62 Linux+ 4/2007
seguridad
Iptables en Linux

Listado 1. Sintaxis del comando iptables

Sintaxis
iptables [-t tabla] -A cadena parmetros
iptables [-t tabla] -I cadena [numero_regla] parmetros
iptables [-t tabla] -R cadena numero_regla parmetros
iptables [-t tabla] -D cadena numero_regla Figura 5. Regla por defecto de la cadena input en
iptables [-t tabla] -[LFZ] [cadena] la tabla filter
iptables [-t tabla] -N cadena
iptables [-t tabla] -X [cadena] iptables -A INPUT -p tcp dport ssh -m

iptables [-t tabla] -P cadena accin limit limit 10/sec -j LOG log-prefix

iptables [-t tabla] -E nombre-anterior-cadena nombre-nueva-cadena "Conexin a SSH"

quina1 o de la mquina2, verifique en la cade- mo saludo de tres vas o handshaking. Cada El comando anterior mandar un mximo de
na segn la mquina. Para esto debemos te- vez que llega una nueva conexin se pro- 10 paquetes por segundo al Log evitando sa-
ner las direcciones IP de las mquinas, supo- duce un SYN, la mquina opuesta contesta turar de informacin nuestro disco duro.
niendo que la mquina 1 tenga la direccin con un ACK, establecindose la conexin, el Por lo general las cadenas INPUT y OUT-
192.168.0.10 y la mquina 2 192.168.19.20; estado de la conexin es ESTABLISHED, esta PUT operan sobre la propia mquina, pero
conexin puede generar nuevas conexiones, tambin podemos usar la mquina como en-
iptables -A INPUT -i eth0 -s teniendo estados RELATED, o conexiones re- rutador con filtrado de paquetes, muy usado
192.168.0.10 -j mquina1 lacionadas de la primera. Una vez cerrada la para control de trfico a Internet. Esto lo
iptables -A INPUT -i eth0 -s conexin pasa al estado FIN. Para qu nos efectuamos con la cadena FORWARD. Antes de-
192.168.19.20 -j mquina2 sirve todo esto? Podemos generar una regla bemos tener dos interfaces de red, activar el
que permita el paso de paquetes de conexio- paso de paquetes de una interfaz a la otra
Cada vez que llegue un paquete con la di- nes ya establecidas o relacionadas, y colo- y enmascarar los paquetes que salgan a In-
reccin ip 192.168.0.10 ste verificar los pro- cndola antes que cualquier verificacin de ternet con la IP pblica proporcionada por
tocolos en la cadena mquina 1, si no existe regla de filtrado. nuestro ISP.
ninguna condicin que cumpla con las reglas Para activar el paso de paquetes entre
el paquete ser descartado, en caso contrario Iptables -A INPUT -m state state interfaces ejecutamos echo 1 > /proc/sys/net/
se aplicar la regla. ESTABLISHED,RELATED -j ACCEPT ipv4/ip_forward , cuando est en 1 habilitamos
En caso que la regla por defecto sea el paso de datos entre interfaces, en cero lo
ACCEPT, podemos usar como accin REJECT Se supone que si esta condicin se cumple es deshabilitamos. En el caso de Fedora pode-
o DROP. Como mencion anteriormente, DROP que pas por un proceso previo de aceptacin mos usar el comando:
no enva ningn mensaje icmp al emisor del de alguna regla.
paquete y REJECT puede enviar mensajes icmp Anteriormente comentamos que si algu- sysctl; sysctl net-ipv4.ip_forward=1
preseleccionados al emisor, como ejemplo va- na regla se cumpla, iptables no efectuaba
mos a descartar que no puedan hacer ping ninguna verificacin. La nica accin que no Para enmascarar la direccin, podemos usar
a nuestra mquina enviando un mensaje cumple con esta norma es LOG. Cuando ge- el siguiente comando:
de ICMP Protocolo no encontrado; neramos una regla con accin LOG, sta man-
da una copia de la conexin al demonio de Iptables -t nat -A POSTROUTING -o eth1
iptables -A INPUT -p icmp -j DROP log o syslog, y es usado para llevar un re- -j MASQUERADE
gistro o depurar el filtrado de paquetes, un
(descarta solicitudes de ping) ejemplo sera esto supone que la interfaz de red eth1 es
la que est conectada a Internet y que la
iptables -A INPUT -p ICMP -j REJECT iptables -A INPUT -p tcp direccin que nos proporciona nuestro pro-
reject-type icpm-proto-unreachable dport ssh -j LOG veedor es dinmica o asignada a travs de
log-prefix "Conexin a SSH" DHCP.
(enva mensaje de protocolo no alcanzable) En el caso de que nuestro proveedor de
o tambin podemos enviar el mensaje Toda conexin o paso de paquetes a SSH es Internet nos proporcione una IP pblica fija
ICMP Mquina no encontrada; enviado al syslog, pudindose ver con el co- podemos usar la siguiente regla para hacer
mando dmesg, all tendremos informacin NAT
iptables -A INPUT -p ICMP -j REJECT detallada del paquete. Debemos tener mu-
reject-type icpm-host-unreachable cho cuidado al usar la accin LOG, ya que
podemos saturar nuestro disco. Podemos li-
Un tipo de regla algo especial es la maneja- mitar el envo de informacin al log con pa-
da por el mdulo conntrack, que no es ms rmetros de limitacin, con -m limit li-
que la verificacin del estado del paquete. mit tiempo. Un ejemplo de limitar a un m-
En el protocolo TCP el paquete pasa por tres ximo de paquetes por seg. sera algo como Figura 6. Trfico de entrada hacia el puerto http (80)
estados SYN, ACK, FIN. Esto es conocido co- esto: es aceptado

www.lpmagazine.org 63
seguridad
Iptables en Linux

La primera regla que debemos tener, es per-


mitir a la mquina como tal (Mquina1) con-
trol sobre ella misma:

iptables -A input -i lo -j ACCEPT

Permitir el paso de paquetes a conexiones ya


establecidas o relacionadas:
Figura 7. Trfico de entrada por la interface eth0 hacia el puerto http (80) es aceptado
iptables -A INPUT -m state state
ESTABLISHED, RELATED -j ACCEPT

Ahora comenzamos a filtrar;


Mquina 2 puede administrar MySQL
usando PhpMyAdmin, debemos permitirle
hacer uso del puerto 3306 en tcp:

iptables -A INPUT s 192.168.0.2 -p


Figura 8. Indicador de nmero de regla en la cadena. tcp dport 3306 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 (esto evitar el seguimiento de conexiones
-j SNAT to-source IP-fija para el trfico desde la IP 10.0.0.1 a la IP 10. Mquina 3 puede administrar MySQL va SSH:
0.0.4).
De aqu en adelante podemos decidir quien iptables -A INPUT -s 192.168.0.3 -p
sale o no a Internet, si tenemos una mquina Ejemplos tcp dport 22 -j ACCEPT
con direccin IP 192.168.0.10 que no quere- Es importante que conozcamos el nmero de
mos que salga a Internet: los puertos, yo no los recuerdo todos pero en Mquina 4 puede administrar la mquina en
Linux existe una tabla con toda esta informa- su totalidad:
iptables -A FORWARD -s 192.168.0.10 cin ubicada en /etc/services.
-p tcp dport 80 -o eth1 -j drop Un ejemplo de bsqueda cat /etc/services iptables -A INPUT -s 192.168.0.4 -j
| grep http |grep tcp (buscamos la informacin ACCEPT
o si quisiramos limitar una red completa po- sobre http), aclarado esto podemos continuar
demos usar como parte de la regla mscaras con los ejemplos. Todas pueden acceder a http:
de red Supongamos que tenemos una red local
segn la grfica 10. Tenemos un grupo de 4 m- iptables -A input -s 192.168.0.0/255.
iptables -A FORWARD quinas, las cuales pertenecen al mismo seg- 255.255.0 -p tcp dport 80 -j ACCEPT
-s 192.168.0.0/24 mento de red. Queremos proteger la mquina1
-p tcp dport 80 -o eth1 la cual tiene los siguientes servicios de FTP, Por ltimo colocamos la regla por defecto en
-j drop HTTP, SSH y MySQL. DROP, con esto si alguna regla no cumple con
Reglas que quiero implementar: las condiciones antes introducidas el paquete
Veamos un poco la tabla raw, esta tabla es es descartado:
sencilla de usar ya que hace caso omiso al se- Mquina2, puede administrar MySQL
guimiento de paquetes, trabaja sobre la cade- usando PhpMyAdmin, iptables -P INPUT DROP
na PREROUTING y OUTPUT y la nica accin que Mquina3, puede administrar MySQL
tiene esta tabla es NOTRACK. Bsicamente evita usando SSH, Con respecto al protocolo FTP solamente una
que el motor de iptables haga seguimiento de Mquina4, administra la mquina en su mquina puede accederlo (Mquina4), si dese-
los paquetes. Un ejemplo: totalidad, ramos que alguna mquina adicional pueda
Todas pueden acceder a Http. acceder al servicio basta con incorporar la regla:
iptables -t raw
-s 10.0.0.1 -d 10.0.0.4 Inicialmente debemos vaciar o eliminar todas iptables -A INPUT
-j NOTRACK las reglas existentes: -p tcp dport ftp
-s 192.169.0.2 -j ACCEPT
iptables -F (Elimina todas las reglas de
las tablas filter), Permitiendo hacer ping a nuestra mquina:
iptables -Z (Coloca todos los contado-
res en cero), iptables -A INPUT -p ICMP -j ACCEPT
iptables -F -t nat (Elimina todas las
reglas de la tabla nat), En este otro ejemplo vamos a ver un poco
Figura 9. Ejemplos de eliminacin e insercin de iptables -X (Elimina todas las cadenas de NAT y redireccin de paquetes segn la
reglas en una lnea especfica que creamos). estructura de red de la grfica 11.

64 Linux+ 4/2007
seguridad
Iptables en Linux

iptables -A FORWARD -s 192.168.0.0/24


-p tcp sport 6666:6668 -j ACCEPT

negamos el resto:

iptables -A FORWARD -j DROP

ahora debemos enmascarar la IP:

iptables -A POSTROUTING -o eth1 -j


MASQUERADE

y activamos el bit de paso de paquetes de una


interfaz a la otra:

echo 1 > /proc/sys/net/ipv4/ip_forward

Figura 10. Red local Supongamos que tenemos un servidor web


Inicialmente debemos vaciar o eliminar Dejamos pasar paquetes a http: en la red (mquina1) y queremos que se vea
todas las reglas existentes: desde Internet por el puerto 10080, y la IP
iptables -A FORWARD -s 192.168.0.0/24 pblica que nuestro proveedor nos dio es la
iptables -F (Elimina todas las reglas de -p tcp dport -j ACCEPT 200.44.90.123:
las tablas filter),
iptables -Z (Coloca todos los contado- Dejamos pasar paquetes ftp iptables -A POSTROUTING -d
res en cero), 200.44.90.123 -p tcp dport 10080 -j
iptables -F -t nat (Elimina todas las iptables -A FORWARD -s 192.168.0.0/24 DNAT to 192.168.0.1:80
reglas de la tabla nat), -p tcp dport 20:21 -j ACCEPT
iptables -X (Elimina todas las cadenas Conclusin
que creamos). permitimos el paso de correo pop, imap,smtp: Podemos observar el poder de iptables sobre
el control de paquetes en una mquina, desde
Primero protegeremos nuestra propia m- iptables -A FORWARD -s 192.168.0.0/24 protegerse ella misma hasta proteger una red.
quina -p tcp dport 25 -j ACCEPT En realidad es un tema algo extenso y esto es
La primera regla que debemos tener, es iptables -A FORWARD -s 192.168.0.0/24 un aperitivo para que se profundice un poco
permitir a la mquina como tal (Mquina1) -p tcp dport 110 -j ACCEPT ms sobre el uso de iptables. Existen en Inter-
control sobre ella misma: iptables -A FORWARD -s 192.168.0.0/24 net un montn de enlaces que hacen mencin
-p tcp dport 143 -j ACCEPT a este tema, pero les voy a recomendar http://
iptables -A input www.netfilter.org, el link es en ingls, pero son
-i lo -j ACCEPT permitimos el paso de IRC ellos quienes mantienen y desarrollaron el
paquete. Otro enlace en espaol con muchos
Permitir el paso de paquetes a conexiones ya iptables -A FORWARD -s 192.168.0.0/24 ejemplos es el de Pello Xabier Altadill Izura,
establecidas o relacionadas: -p tcp dport 6666:6668 -j ACCEPT y el enlace http://www.pello.info.

iptables -A INPUT
-m state state ESTABLISHED,
RELATED -j ACCEPT

Ahora comenzamos a filtrar;


Dejaremos la norma por defecto en AC-
CEPT y negaremos el resto con un mensaje
ICMP de mquina no encontrada. No vamos
a permitir nada sobre esta mquina solamen-
te el paso de paquetes, y debemos proteger
las dos interfaces:

Iptables -A INPUT
-i eth0 -j REJECT reject-with
icmp-host-unreachable Iptables
-A INPUT -i eth1 -j REJECT
reject-with icmp-host-unreachable Figura 11. NAT y redireccin de paquetes

www.lpmagazine.org 65