Limitar el número de conexiones por IP

Ofrezco un servicio en uno de mis servidores al que conectan clientes. Estos clientes son programados por sus dueños y no todos realizan una única conexión, como debería ser. Un día me encontré con un mismo cliente que estaba conectado con 10 clientes, cosa innecesaria.

Para evitar este problema, he limitado a 2 conexiones (dar una de margen, por si acaso) al puerto del servicio en cuestión:

iptables -I INPUT -p tcp --syn --dport 12345 -m connlimit --connlimit-above 2 -j REJECT

Fuente: http://romanr.info/iptables/connlimit/

Si usamos UFW podemos editar el archivo /etc/ufw/before.rules y añadir la siguiente entrada antes de COMMIT:

-A ufw-before-input -p tcp --syn --dport 12345 -m connlimit ! --connlimit-above 2 -j ACCEPT

Fuente: http://florent.clairambault.fr/limiting-number-of-connections-per-ip-with-ufw

Soporte GeoIP para iptables

Si quieremos controlar nuestro firewall en función del país de las conexiones, debemos hacer lo siguiente (esto está hecho en Debian Wheezy):

apt-get install xtables-addons-common libtext-csv-xs-perl unzip
mkdir -p /usr/share/xt_geoip
cd /usr/lib/xtables-addons
./xt_geoip_dl
./xt_geoip_build -D /usr/share/xt_geoip *.csv

Ahora podremos crear las reglas que querramos, como por ejemplo la siguiente:

iptables -I INPUT -p tcp --dport 22 -m geoip --src-cc GB -j DROP

Fuente: http://www.spinics.net/lists/netfilter-devel/msg23799.html

Configurar un firewall de manera simple con ufw

He encontrado este programa para gestionar el firewall y me ha parecido muy bueno. Este es ufw.

Para instalarlo (está en Squeeze y Sid), aptitude install ufw.
Para ponerlo en funcionamiento a través de SSH, haremos lo siguiente:

ufw default deny
ufw logging on
ufw allow ssh/tcp
ufw enable

Si no lo hacemos por SSH y no queremos abrir ese puerto, omitiremos la línea ufw allow ssh/tcp

Para abrir rangos de puertos:

ufw allow proto tcp to any port 1000:2000

Para permitir un rango de IPs:

ufw allow from 1.2.0.0/16 to any port 1234

Bloquear una IP a un determinado puerto:

ufw insert 1 deny from 1.2.3.4 to any port 1234

El insert 1 es para que la regla DENY vaya antes que la que permite la conexión al puerto 1234.

Hay ejemplos en español en la Wikipedia: http://es.wikipedia.org/wiki/Uncomplicated_Firewall
O en inglés: https://help.ubuntu.com/community/UFW

Cargar reglas iptables automáticamente

Una vez que se apliquen reglas en iptables, se perderán cuando se reinicia el sistema. Para que se mantengan (una vez aplicadas las que queremos), deberemos hacer lo siguiente:

iptables-save > /etc/firewall.conf

Crearemos el archivo /etc/network/if-up.d/iptables y dentro pondremos:

#!/bin/sh
iptables-restore < /etc/firewall.conf

Sólo falta hacerlo ejecutable y listo:

chmod +x /etc/network/if-up.d/iptables

Cualquier cambio que queramos hacer será modificando el archivo /etc/firewall.conf o ejecutando las reglas por comandos y salvarlas de nuevo como al principio:

iptables-save > /etc/firewall.conf

Fuente: http://rackerhacker.com/2009/11/16/automatically-loading-iptables-on-debianubuntu/