Archivos mensuales: mayo 2009

Firewall en Linux (Ipfwadm, Ipchains… Iptables)

En muchas distribuciones (p.e. en Ubuntu) no vienen ningún firewall configurado y activado por defecto si no lo establecemos expresamente. Hasta Windows XP ya traía uno y aconsultaba al usuario y aconsejaba activarlo…

En linux tenémos un firewall (cortafuegos) que es una verdadera maravilla, podemos hacer de todo hoy día y no tiene nada que envidiar al más robusto sistema de protección y bloqueo de tráfico que haya en el mercado. Pero empecemos por el principio…

En un primer inicio, bajo el kernel 2.0 se utilizó un sistema rudimentario pero muy potente que era Ipfwadm. Este tenía 3 directivas básicas (INPUT, OUTPUT y FORWARD) para controlar el tráfico de entrada, salida y el «reenvío». Potente, sencillo aunque con una sintáxis algo complicada para realiar tareas más avanzadas.

La segunda generación la tenemos en el núcleo 2.2 con Ipchains. Este trae un nuevo concepto, el de las «cadenas de reglas», o lo que es igual, permite las pilas de reglas creadas por el usuario, o sea, podemos hacer una «cadena» de reglas que se llame WEB y que controle todo el tráfico que sea de este tipo.

Además de esto trajo consigo la numeración de reglas por lo que era posible insertar nuevas reglas a las ya existentes, no solo añadirlas.

Junto con la capacidad de filtrar cualquier protocolo (no solo TCP, UDP e ICMP) y la capacidad de usar la «negación» en las reglas le aventajaba en mucho a su antecesor.

Pero vino por fín con la versión 2.4 del kernel de linux (comenzó en realidad en la rama 2.3) Iptables. Una nueva implementación para dotar a los sistemas con kernel linux de un verdadero y potente sistema de firewall con posibilidad de bloquear y denegar tráfico, devolver tráfico de una conexión existente, realizar traslaciones de direcciones, enrutar, y dos aspectos muy importantes, implementar un sistema SPI o Stateful Packet Inspection (Inspección de Paquetes de Estado) y de QoS (Quality of Service) o Calidad del Servicio.

En el caso del SPI ahora es posible asociar el tráfico devuelto generado a partir de una regla input anterior, en Ipchains hacían falta 6 reglas para enrutar entre dos interfaces.

Además al llevar una «inteligencia» en la gestión de los paquetes mediante este SPI tiene una ventaja adicional, es que mantiene el control de sesiones de tráfico, de forma que aunque un atacante pueda fabricar paquetes que simulen paquetes de un protocolo determinado como devueltos, (Ipchains podía permitir dicho tráfico) como no existe una sesión para dichos paquetes se rechazarán.

Como únicamente la cadena FORWARD controla cualquier paquete para ser reenviado, INPUT y OUTPUT solo se aplican para entrar o salir del host, se reduce mucho el número de reglas a incluir en nuestro sistema.

La instalación de Iptables requiere la compilación del kernel si no están configuradas, pero hoy día están dentro de todos los kernels por defecto de las distribuciones así que no hay que preocuparse. Además cada distribución realiza una gestión de las reglas a su manera, pe. es de considerar la de CentOS (evidentemente también Fedora y RedHat) que se implementan de forma sencilla pero efectiva.

Como Ubuntu no trae esta bonita configuración (la de CentOS) hay que ponerse manos a la obra, lo mejor es ponerla en el rc.local si no somos muy paranóicos o crearnos un sistema de arranque/parado dentro de /etc/init.d dentro de los niveles de arranque que necesitemos y (si no usamos referencias a hosts sino solo a IPs) hacer que arranque antes de que lo hagan las interfaces de red. El primer sistema está bien para portátiles y ordenadores de escritorio pero para servidores es más que recomendable la segunda opción.

Se pueden realizar multitud de configuraciones y espero ir poniendo aquí algunas complejas que controlen no solo tráfico o enrutamiento, sino también «Throughput», «Reliability», etc. dentro de un sistema basado en QoS.

Por lo pronto yo uso dos en mi portátil, una para utilizarla como sistema básico de cortafuegos, hay que tener en cuenta que uso dos interfaces (bueno tres como veréis más abajo) que son la ethernet cableada y la wifi. Como soy quisquilloso con eso, activo una u otra y dejo pasar tráfico a mi sistema de una u otro como yo quiera. Además de esto utilizo los flags largos y no los cortos porque así (consejo de un amigo) se aprende uno mejor la sintáxis de los comandos. Este es por tanto mi fichero firewall_on.sh

#!/bin/sh
#
# Firewall sencillo
# fegor
#
# eth0 -> Ethernet cableada
# eth1 -> Ethernet inalámbrica
#
# Evitar ecos de ICMP, ataques SYN floods y otras medidas
# de protección
#
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
#
# Limpieza
#
iptables –delete-chain
iptables –flush
iptables –table nat –flush
#
# Permitir tráfico loopback
#
iptables –append INPUT –in-interface lo –jump ACCEPT
iptables –append OUTPUT –out-interface lo –jump ACCEPT
#
# Políticas por defecto
#
iptables –policy INPUT DROP
iptables –policy OUTPUT DROP
iptables –policy FORWARD DROP
#
# Permitir tráfico establecido de entrada e
# ilimitado de salida
#
iptables –append INPUT –match state –state ESTABLISHED,RELATED –jump ACCEPT
iptables –append OUTPUT –match state –state NEW,ESTABLISHED,RELATED –jump ACCEPT
#
# Permitir entradas selectivas (ssh, http, etc.)
#
iptables –append INPUT –in-interface eth0 –protocol tcp –syn –match state –state NEW –source 0/0 –destination 0/0 –destination-port 22 –jump ACCEPT
iptables –append INPUT –in-interface eth1 –protocol tcp –syn –match state –state NEW –source 0/0 –destination 0/0 –destination-port 22 –jump ACCEPT
# Permitir entradas EMule/AMule
iptables –append INPUT –in-interface eth0 –protocol tcp –syn –match state –state NEW –source 0/0 –destination 0/0 –destination-port 4662 –jump ACCEPT
iptables –append INPUT –in-interface eth0 –protocol udp –source 0/0 –destination 0/0 –destination-port 4672 –jump ACCEPT
#
# Rechazar finalmente el tráfico restante
#
iptables –append INPUT –jump DROP

Otro script qu utilizo es para enrutar mi USB Modem 3G y hacer que cualquier otro ordenador salga a través de mi portátil. Para ello hay que activar el enrutamiento y hacer el FORWARD pertinente. Este es mi router_on.sh

#!/bin/sh
#
# Enrutar tráfico de los demás a internet
# fegor
#
# eth0 -> Ethernet cableada
# eth1 -> Ethernet inalámbrica
# ppp0 -> Modem USB 3G
#
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables –flush
iptables –table nat –flush
iptables –table nat –append POSTROUTING –out-interface ppp0 -j MASQUERADE
iptables –append FORWARD –in-interface eth0 -j ACCEPT
iptables –append FORWARD –in-interface eth1 -j ACCEPT

Y eso es todo, no pretende ser un manual de Iptables, ni guia, ni tutorial, ni nada más que lo que habéis leído. Para saber más:

Enlaces:

http://www.netfilter.org/
http://es.wikipedia.org/wiki/Iptables
http://www.linuca.org/body.phtml?nIdNoticia=99
http://www.bulma.net/body.phtml?nIdNoticia=1522

Bibliografía:

Firewalls (Manual de referencia)
Keith E. Strasberg, Richard J. Gondek y Gary Rollie
Edit. Mc Graw Hill

Información dentro de la propia distribución linux que tengáis:

man iptables
iptables –help

Modem USB de Movistar y Ubuntu 9.04

Para los que tengáis que usar el módem de Movistar con la nueva versión de Ubuntu 9.04, veréis que hay un problema. El módulo usbserial no parece estar, pero lo que pasa es que, los chicos de Ubuntu han compilado en el kernel el módulo en lugar de dejarlo como tal.

Esto causa el problema de no poder usar el módulo de forma parametrizada con modprobe…

¿Problema?, ninguno. Solo hay que decirle al kernel qué dispositivo vamos a usar:

Cuando en el arranque entre en Grub (visualizar el menú para seleccionar el sistema operativo) pulsamos la tecla ESC.

Vamos a la línea del kernel que queremos cargar y pulsamos E.

En la segunda línea (la que empieza por kernel) otra vez E, vamos al final de la línea y escribimos:

usbserial.vendor=0x1410 usbserial.product=0x4400

Pulsamos B (boot)… y «ready!»

Ahora ya podemos usar por ejemplo wvdial para realizar la conexión.

Notas sobre la instalación del modem:
1. Esos códigos son los que corresponden con el modem MC950D de Movistar.
2. Si lo ponéis en el menu.lst del grub mejor 😉
3. Me ha funcionado usando wvdial con un script que tengo y usando como dispositivo /dev/ttyUSB3, ojito con esto que si no, no funciona.

Script wvdial.conf

[Dialer Defaults]
Phone = *99***1#
Username = MOVISTAR
Password = MOVISTAR
Dial Command = ATDT
Stupid Mode = 1

[Dialer reset]
Modem = /dev/ttyUSB3
Init1 = AT+CPIN=XXXX

[Dialer movistar]
Phone = *99***1#
Modem = /dev/ttyUSB3
Baud = 460800
Init2 = ATZ
Init3 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ISDN = 0
Modem Type = USB Modem
Init5 =AT+CGDCONT=1,»IP»,»movistar.es»;

Notas sobre el script:
1. Cambiad las XXXX por el número de pin que tengáis en la línea:
Init1 = AT+CPIN=XXXX
O bloquearéis vuestro dispositivo y tendréis que usar el PUK para desbloquearlo.
2. La secuencia que uso es la siguiente (el primero es para desmontar la unidad que automáticamente crea el dispositivo):
sudo eject /dev/scd1
sudo wvdial reset
sudo wvdial movistar

Problemas de teclado entre VMWare Player y Ubuntu

El teclado en VMWare Player con Ubuntu no va bien si no se configura. Para ello hay que crear un fichero llamado config dentro de ~/.vmware con el siguiente contenido:

xkeymap.nokeycodeMap = true
xkeymap.keycode.108 = 0x138 # Alt_R
xkeymap.keycode.106 = 0x135 # KP_Divide
xkeymap.keycode.104 = 0x11c # KP_Enter
xkeymap.keycode.111 = 0x148 # Up
xkeymap.keycode.116 = 0x150 # Down
xkeymap.keycode.113 = 0x14b # Left
xkeymap.keycode.114 = 0x14d # Right
xkeymap.keycode.105 = 0x11d # Control_R
xkeymap.keycode.118 = 0x152 # Insert
xkeymap.keycode.119 = 0x153 # Delete
xkeymap.keycode.110 = 0x147 # Home
xkeymap.keycode.115 = 0x14f # End
xkeymap.keycode.112 = 0x149 # Prior
xkeymap.keycode.117 = 0x151 # Next
xkeymap.keycode.78 = 0x46 # Scroll_Lock
xkeymap.keycode.127 = 0x100 # Pause
xkeymap.keycode.133 = 0x15b # Meta_L
xkeymap.keycode.134 = 0x15c # Meta_R
xkeymap.keycode.135 = 0x15d # Menu