No me voy a meter ahora con
scripting, al que le interese, hay abundate documentación para
shell scrtipting bajo linux.Un script orientado a manejar iptables tiene sus secciones.
SECCIONES DEL SCRIPT
- Siempre empiezan invocando al intérprete (un programa que lee y ejecuta el archivo), la primera línea debe ser algo como :
#!/bin/sh -> se llama a
sh y éste se encarga de
leer línea por línea el archivo.
- Tenemos la posibilidad de declarar variables. Un ejemplo:
IPT=/sbin/iptables
EXTIF="eth1" (tarjeta de red que se conecta a internet)
INTIF="eth0" (tarjeta de que se comunica con nuestra propia red)
Así cada vez que queremos hacer mención al ejecutable
/sbin/iptables, sólo tendremos que poner
$IPT.
MUUUUY importante no olvidarse del símbolo $ cada vez que llamemos a una variable.
- A continuación insertamos los módulos que necesitamos para que funcione el script, ya que seguramente queramos utilizar el control de estado de la conexión, o usar el log. Habrá que poner algo como esto. Cada uno que lo adecúe a sus necesidades.
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ipt_state
- Nos aseguraremos de que las tablas están vacías, borrando su contenido, para que no se mezcle con anteriores configuraciones.
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
- Ponemos la acción que ejecutará por defecto cada tabla si no se cumple ninguna regla dentro de ella. Aquí que cada uno haga lo que le de la gana, os recomiendo que por defecto se tire con todo:
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
- Y ahora empezamos con lo que es el script en sí.
EJEMPLOS. Abriendo los servicios mas corrientes:
* por idoru: Las dos reglas en verde nos hace vulnerables
El localhost (lo = 127.0.0.1) se tiene que dejar pasar ya que por defecto tiramos con todo.
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# Permitir salida al 80, para poder ver páginas web
$IPT -A INPUT -i $EXTIF -p tcp --sport 80 -j ACCEPT
$IPT -A OUTPUT -o $EXTIF -p tcp --dport 80 -j ACCEPT
# Permitir salida SMTP
$IPT -A INPUT -i $EXTIF -p tcp --sport 25 -j ACCEPT
$IPT -A OUTPUT -o $EXTIF -p tcp --dport 25 -j ACCEPT
SALIDA FTP - Para conectar con FTPs
$IPT -A INPUT -i $EXTIF -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o $EXTIF -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# ftp activo
$IPT -A INPUT -i $EXTIF -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -o $EXTIF -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
# ftp pasivo
$IPT -A INPUT -i $EXTIF -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o $EXTIF -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
Bien,
ya tenemos nuestro cortafuegos funcionando. Con esta configuración,
podremos navegar, mandar emilios y conectarnos a ftp y todo lo demás simplemente se ignora.
NO tenemos ningún puerto abierto.
Ahora queremos que
se carguen estas reglas cada vez que se arranque el sistema.
Abrimos una
consola y tecleamos:
/etc/init.d/iptables save
Que
guardará las reglas que tiene iptables ahora mismo cargadas
como las reglas por defecto.
Para ver vuestras reglas:
iptables -L : nos mostrará el contenido de cada tabla y sus respectivos
chains.