En este post voy a mostrarte algunas formas diferentes de bloquear visitantes a través de su dirección IP. Esto puede ser útil por una variedad de razones, que incluyen evitar que alguien con malas intenciones ataque tu sitio, aceche en tus foros, o incluso silenciar el suministro interminable de trolls y haters furiosos que parecen no tener otra cosa que hacer mas que molestar. Continua leyendo para aprender cómo bloquear cualquier dirección IP usando algunas líneas en .htaccess.

Bloquear una dirección IP específica

Este es el método que deberías usar si conoces la ip del atacante:

Deny from 123.123.123.123

Simplemente cambia la dirección IP a la que deseas bloquear y luego agrega el código al archivo .htaccess en la raíz de tu sitio.

Bloquear un dominio específico

Para bloquear un dominio específico, agrega lo siguiente al archivo .htaccess en la raíz de tu sitio:

Deny from 123.123.123.123/255.255.255.0

Cambia la dirección IP y los valores de la máscara de red para que coincidan con el dominio que deseas bloquear.

Bloquear múltiples direcciones IP

Si tienes más de una dirección IP que deseas bloquear, puede negarlas todas a la vez:

Deny from 111.111.111.111 222.222.222.222 333.333.333.333

Esto bloqueará las tres direcciones IP especificadas: 111.111.111.111, 222.222.222.222 y 333.333.333.333. Edita las direcciones IP para que coincidan con las que deseas bloquear y luego agrega la línea a tu archivo .htaccess.

Bloquear toda la subred

También es posible bloquear un rango completo de IPs. Aquí hay un ejemplo donde bloqueamos cada IP que comienza con 124.124:

Deny from 124.124

Para bloquear múltiples rangos, podemos hacer esto:

Deny from 111 222.222 333.333.333

Debes tener cuidado al bloquear todo un rango de direcciones IP. Podrías bloquear más usuarios que los que deseas.

Bloquear IP basada en CIDR

Si conoces el CIDR específico para la IP que estás intentando bloquear, puedes usar esta sintaxis:

Deny from 123.123.123.0/24

Al igual que con todas estas reglas, puedes editar para que coincida con tu objetivo y luego agregar al .htaccess.

Bloquear direcciones IPv6

Las direcciones IPv6 cada vez son más utilizadas. Si deseas bloquear una dirección IPv6 a con .htaccess, aquí está la sintaxis correcta:

Deny from 2001:0db8:0000:0042:0000:8a2e:0370

También puedes usar cualquiera de estas notaciones, dependiendo del objetivo:

Deny from 2001:0db8:0000:0042
Deny from 2001:0db8:0000:0042:0000/10

Bloquear IP con expresiones regulares

El bloqueo de IP con expresiones regulares prueba todas las direcciones con una expresión regular predefinida a través de las directivas RewriteCond / RewriteRule:

<IfModule mod_rewrite.c>
	RewriteCond %{REMOTE_ADDR} ^214.53.25.(6[4-9]|7[0-9]|8[0-9]|9[0-9])$ [OR]
	RewriteCond %{REMOTE_ADDR} ^214.53.25.1([0-1][0-9]|2[0-8])$
	RewriteRule .* - [F]
</IfModule>

Debes adecuar las expresiones regulares del ejemplo anterior a tus necesidades, puedes probar tus expresiones regulares en https://regex101.com/

Tip

Recuerda siempre hacer una copia de seguridad del archivo .htaccess que desees modificar y luego realiza una prueba antes de poner en práctica cualquier regla nueva.

Redireccionamiento basado en dirección IP

En lugar de bloquear a los visitantes según la dirección IP, puedes redirigirlos a otra ubicación. Aquí te explico cómo hacerlo utilizando mod_rewrite de Apache:

<IfModule mod_rewrite.c>
	RewriteCond %{REMOTE_ADDR} ^111\.111\.111\.111$
	RewriteRule .* /destino.php [R=301,L]
</IfModule>

Cambia la IP para que coincida con la que quieres bloquear. Y luego edita el /destino.php para que coincida con el URI al que se deben enviar las solicitudes coincidentes. Aquí hay otro ejemplo para ayudar a ilustrar la técnica:

<IfModule mod_rewrite.c>
	RewriteCond %{REMOTE_HOST} 123\.123\.123\.123
	RewriteCond %{REQUEST_URI} /pagina-solicitada\.html
	RewriteRule .* /destino.html [R=301,L]
</IfModule>

Aquí estamos comprobando la IP y el URI solicitado. Si hay una coincidencia, la solicitud se enviará a /destino.html. Para usar este redireccionamiento, simplemente cambia la dirección IP, la pagina-solicitada y la página de redireccionamiento (destino). Copia y pega el código en tu archivo .htaccess y subilo en tu servidor.

Bloquear tipos de solicitud específicos

Supongamos que solo deseas bloquear a un visitante únicamente de publicar contenido a través de un formulario en tu sitio. Eso se puede hacer usando el contenedor <Limit> de Apache:

<Limit POST>
	Order Allow,Deny
	Allow from all
	Deny from 123.123.123.123
</Limit>

Observa el POST especificado en el contenedor <Limit>. Esa es la clave, y puedes cambiarla para que se adapte a cualquier tipo de solicitud.

El siguiente es un ejemplo del caso inverso, en el que queremos permitir la publicación desde solo nuestra propia dirección IP, mientras que rechazamos las solicitudes POST para todos los demás:

<Limit POST>
	Order Deny,Allow
	Deny from all
	Allow from 111.111.111.111
</Limit>

Debes tener en cuenta la inversión de la directiva Order: aquí negamos primero [Deny], luego permitimos [Allow], lo que proporciona la lógica requerida para esta técnica.

Notación completa

Si bien, está bien (valga la redundancia) simplemente agregar una sola línea, como Deny from 123.123 en tu archivo .htaccess, hay una sintaxis más completa que se puede usar. Aquí hay un par de ejemplos:

Order Allow,Deny
Allow from all
Deny from 123.123.123.123/26

Observa la lógica adicional involucrada con esta sintaxis más «correcta»: aquí estamos especificando la directiva Order, que nos permite cambiar el orden predeterminado de Apache, que es Permitir [Allow], Denegar [Deny] [Order Allow,Deny]. Entonces, cuando incluimos solo una línea Denegar desde
[Deny from] (como en nuestros ejemplos anteriores), funciona porque estamos usando el orden predeterminado Permitir, Denegar [Order Allow,Deny]. Por eso está bien excluir las líneas adicionales. O, si lo desea, podríamos cambiar el orden explícitamente:

Order Deny,Allow
Deny from all
Allow from 111.111.111.111

Aquí primero negamos el acceso a todos y luego permitimos solo la dirección especificada. Combinando esta sintaxis con el contenedor <Limit>, podemos hacer cosas geniales como habilitar las solicitudes POST y PUT solo desde nuestra propia dirección IP. Por ejemplo:

<Limit POST PUT>
	Order Deny,Allow
	Deny from all
	Allow from 111.111.111.111
</Limit>

Combinando estas técnicas con ejemplos anteriores, tus posibilidades de bloqueo de IP son infinitas.