Cómo bloquear el tráfico de un país

Si por cualquier razón necesitáis bloquear el tráfico de un servidor desde algún país en concreto en http://www.countryipblocks.net/ mantienen una lista actualizada de los rangos de ips de cada país.

Puedes descargar varios formatos, incluso uno preparado para insertar directamente en un fichero .htaccess, aunque a mi no me parece el mejor formato ya que obligas a que el servidor web revise una lista de ips que puede llegar a ser muy grande antes de que muestre la página y eso podría hacer que la navegación se enlenteciera demasiado, además un servidor web no es el más adecuado para realizar esa función.

Os pongo varios ejemplo de como realizar el bloqueo desde la línea de comandos. Para los ejemplos he utilizado korea, no se os ocurra utilizar rangos de ips de el país en el que estáis por que os podéis bloquear el acceso. Como diría un amiguete, “no seáis gañanes

Con iptables:

.
/usr/bin/wget -O /tmp/pais.txt https://www.countryipblocks.net/e_country_data/KR_cidr.txt; for i in $(/bin/cat /tmp/pais.txt | /bin/grep -v '#'); do sbin/iptables -A INPUT -s $i -j DROP; done; /bin/rm /tmp/pais.txt

Con apf:

.
/usr/bin/wget -O /tmp/pais.txt https://www.countryipblocks.net/e_country_data/KR_cidr.txt; for i in $(/bin/cat /tmp/pais.txt | /bin/grep -v '#'); do /etc/apf/apf -d $i; done; /bin/rm /tmp/pais.txt

ACTUALIZACIÓN
countryipblocks.net ya no permite descargar esos ficheros así que ahora utilizo el listado de maxmind.com

Como lo dan en otro formato he tenido que cambiar la rutina que lo proceso, ahora en una sola línea, aunque tiene el inconveniente de que necesitas tener instalada la aplicación ipcalc (sudo apt-get install ipcalc) para calcular el cidr.
Tened en cuenta que sólo permite descargar la base de datos unas pocas veces al día.

En esta rutina bloquea todo el tráfico que viene de china (CN)

curl http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip | funzip | grep CN | tr -d '"' | awk '{split($0,a,","); print "ipcalc -r "a[1]" "a[2]" | head -2 | tail -1"}' | sh | awk '{print "iptables -A INPUT -s "$0" -j DROP"}' | sh