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/