A veces las cosas complejas y difíciles se pueden hacer simples y fáciles. Esa frase es el ejemplo de Shorewall, hace fácil y simple el firewall de Linux.
IPtables sirve para packet filtering y para NAT en linux. El problema es que su sintaxis es bastante engorrosa, y muchas veces en máquinas en producción un cambio puede ocurrer muchos problemas. Un ejemplo para ver la complejidad de iptables:
iptables -t nat -A PREROUTING -p tcp -i eth0--dport 81 -j DNAT --to-destination 192.168.0.10
Por ello nace el frontend del que hablamos hoy, simplifica la creación de packet filtering, de NAT, de control de tráfico y un sinfín de cosas.
Pasemos a la acción:
apt-get install shorewall
La configuración del shorewall se guarda en: /etc/shorewall/, los ficheros principales:
- shorewall.conf -> fichero que configura el frontend, la mayoría de las veces el por defecto nos debería servir
- zones -> Declara tus zonas de internet (fw, net, loc, dmz)
- interfaces -> asocia una zona con un interface (net-> eth0, dmz -> eth1, etc..)
- rules -> fichero de reglas (packet filtering, nat, etc)
- policy -> las políticas a seguir por defecto
Un ejemplo de cada fichero (excepto shorewall.conf seria)
zones:fw firewall
net ipv4
loc ipv4
tun ipv4
interfaces:loc lan detect
net eth0 detect dhcp
tun tun+ dtect
rules:ACCEPT net $FW tcp 21
ACCEPT net $FW tcp 80
ACCEPT net:85.18.14.0 $FW tcp 8080
DNAT net loc:192.168.0.10 tcp 81
DROP all net tcp 4662
policy:net all DROP info
all all REJECT info
creo que poco más que hay que explicar, el fichero importante el
rulescuyo formato es
(accion: ACCEPT o REJECT o DNAT o DROP o REJECT) (de donde: net, loc) (a donde: $fw, loc) (protocolo: tcp, udp, all) (puerto destino) (puerto origen)
Una vez configurado podemos hacer:
shorewall check /etc/shorewall para comprobar que la sintaxis está bien. Una vez que tengamos todo configurado podemos editar
/etc/default/shorewall para establecer
startup=1 (para que se ejecute shorewall a través de init.d)
Una vez lanzado shorewall, podemos ver su estado con
shorewall status:
Shorewall is running
State:Started (Sun Jun 1 00:02:21 CEST 2008)Si queremos hacer algun cambio, editamos los ficheros de /etc/shorewall/ y podemos hacer "shorewall try /etc/shorewall", yo recomiendo hacer una copia:
cp -a /etc/shorewall /etc/shorewall_pruebas, editar los ficheros de /etc/shorewall_pruebas y hacer el shorewall try (si este falla volverá a la configuración, que debería funcionar bien de /etc/shorewall), una vez que el shorewall try compile las reglas y veas que todo funciona, copia de el fichero rules de /etc/shorewall_pruebas a /etc/shorewall y reinicia el shorewall.
Una vez visto más o menos como instalarlo y que ficheros editar, podemos observar que sólo nos debemos preocupar de meter las reglas en el fichero
rules, y su síntaxis como indicaba arriba es muy fácil.
Podemos ver las diferencias:
Iptables:
iptables -t nat -A PREROUTING -p tcp -i eth0--dport 81 -j DNAT --to-destination 192.168.0.10
Shorewall:
DNAT net loc:192.168.0.10 tcp 81
Finalmente comentar algunos comandos de utilidad:
- shorewall show connections (muestra el estado de las conexiones activas, los packetes enviados, el origen, destino, etc)
- shorewall reject
(rechaza una ip, cuando se reinicie el shorewall no estará bloqueada)
- shorewall drop (bloquea una ip, idem que antes)
(tambien existe logreject, logdrop)
- shorewall allow (permite el acceso a una ip bloqueada/rechazada anteriormente)
- shorewall try [timeout] (compila y prueba las reglas de un directorio, si se establece timeout, pasado ese tiempo si no se reinicia el shorewall, se coge la configuracion de nuevo de /etc/shorewall, util para compilar reglas que te puedan dejar sin conexion)
- shorewall check (comprueba la sintaxis de un directorio sin compilar las reglas)
Además, si establecemos en el policiy o en rules (ejemplo DNAT:info), que se loguee las reglas podemos ver en /var/log/syslog algo asi:
Jun 1 13:11:25 Atlantis kernel: Shorewall:net2all:DROP:IN=eth0 OUT= MAC=00:e0:7d:cb:b8:af:00:0d:29:ed:3a:37:08:00 SRC=***.211.***.27 DST=83.**.160.** LEN=485 TOS=0x00 PREC=0x00 TTL=42 ID=0 DF PROTO=UDP SPT=4637 DPT=1027 LEN=465
Para finalizar, una regla interesante:
Limit:info:SSHA,3,60 net $FW tcp 22
Esta regla establece 3 conexiones cada 60 segundos al puerto 22, si se realizan más, se bloquea durante un tiempo a la ip que supera ese límite, es muy útil para evitar ataques brute-force de contraseñas.
Hay que tener un fichero Limit dentro de /etc/shorewall (regla cogida de www.shorewall.net)
set -- $(separate_list $TAG)
[ $# -eq 3 ] || fatal_error "Rule must include ,, as the log tag"
run_iptables -A $CHAIN -m recent --name $1 --set
if [ -n "$LEVEL" ]; then
run_iptables -N $CHAIN%
log_rule_limit $LEVEL $CHAIN% $1 DROP "" "" -A
run_iptables -A $CHAIN% -j DROP
run_iptables -A $CHAIN -m recent --name $1 --update --seconds $3 --hitcount $(( $2 + 1 )) -j $CHAIN%
else
run_iptables -A $CHAIN -m recent --update --name $1 --seconds $3 --hitcount $(( $2 + 1 )) -j DROP
fi
run_iptables -A $CHAIN -j ACCEPT
Cuando se intenta 4 conexiones en un periodo menor de 60 segundos podemos ver en el /var/log/syslog algo así:
May 23 18:39:35 Atlantis kernel: Shorewall:SSHA:DROP:IN=eth0 OUT= MAC=00:e0:7d:cb:b8:af:00:0d:29:ed:3a:37:08:00 SRC=202.129.37.66 DST=**.***.***.** LEN=60 TOS=0x00 PREC=0x00 TTL=46 ID=24119 DF PROTO=TCP SPT=53578 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0
Enlaces:
Web oficial de shorewall