IPTABLES: Denegar el acceso al dominio a todos excepto a una pequeña lista de IP

IPTABLES: Denegar el acceso al dominio a todos excepto a una pequeña lista de IP

Tengo un par de servidores web públicos y algunas máquinas Ubuntu domésticas. Mantengo un par de dominios específicamente para monitorear cosas como MySQL y Memcache. Lo ideal sería poder conectarme a MySQL, Memcache, etc. desde las máquinas de mi casa y negar el acceso a todos los demás.

Entonces mis iptables actualmente son:

ACCEPT     tcp  --  home ip              0.0.0.0/0            tcp dpt:3306
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:222
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
ACCEPT     all  --  server 1 ip          0.0.0.0/0
ACCEPT     all  --  server 2 ip          0.0.0.0/0
ACCEPT     all  --  server 3 ip          0.0.0.0/0
DROP       all  --  198.245.49.225       0.0.0.0/0
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Me gustaría ampliar mis iptables para poder acceder a todo desde casa. Me imagino que probablemente sea una buena práctica agregar una línea para la IP de mi hogar para cada puerto que quiero en lugar de darle acceso a la IP de mi hogar a cada puerto. Pero tal vez no importe. Además, quiero ejecutar cosas como phpMemcachedAdmin sin necesidad de contraseña.

Así que realicé un par de búsquedas en Google sobre cómo denegar el acceso a un dominio a todo el mundo. Supongo que puse una línea que permite mi IP en el puerto 80 justo encima de la línea que niega el acceso al dominio a todo el mundo y (con los dedos cruzados) debería bloquear a todos menos a mí.

Las publicaciones que he visto en mis búsquedas en Google decían que puedes bloquear un dominio a través de -m string "Host: domain.com"o vía --string "domain.com". Ninguno parece funcionar. Esto es lo que he probado:

sudo iptables -I 9 -p tcp --dport 80 -m string "Host: domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 -m string "domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 --string "domain.com" --algo bm -j DROP

Los dos primeros errores con el argumento incorrecto 'Host:...' y el último error con la opción desconocida "--string".

Para complicar un poco más las cosas, la IP de mi casa es dinámica, no estática. Por lo tanto, sería bueno (pero no esencial) tener la capacidad de permitir la IP de mi hogar a través de un dominio DynDNS que he configurado. Tengo un script para detener e iniciar iptables, por lo que si lo necesito siempre puedo detenerlo y reiniciarlo para forzar la actualización de la IP. (He leído en varios lugares que iptables solo busca una IP para el dominio al inicio).

También agradezco cualquier consejo relacionado con la seguridad sobre el uso de iptables para su servidor web estándar.

Gracias


17/03/14 Adiciones: Encontré el error de sintaxis en mi línea de iptables; debería -m stringser -m string --string. Ahora parece que tengo iptables que reconocen el dominio del que quiero mantener alejada a la gente. Sin embargo, el problema luego pasó a ser el orden de las reglas de iptables.

Mis nuevas iptables se convirtieron en:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  Server 1 IP          0.0.0.0/0
ACCEPT     all  --  Server 2 IP          0.0.0.0/0
ACCEPT     all  --  Server 3 IP          0.0.0.0/0
DROP       all  --  198.245.49.225       0.0.0.0/0
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 STRING match  "str_for_matching" ALGO name bm TO 65535
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:222
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

La idea sería capturar mi IP antes del DROP que coincide con la cadena. Si DROP es la primera línea, la detecta y aparece un error 502. Sin embargo, si las iptables son las que he enumerado, las solicitudes se envían: la IP de mi casa aún no está en la tabla de reglas.

El que funciona se ve así:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  Server 1 IP          0.0.0.0/0
ACCEPT     all  --  Server 2 IP          0.0.0.0/0
ACCEPT     all  --  Server 3 IP          0.0.0.0/0
ACCEPT     all  --  My Home IP           0.0.0.0/0
ACCEPT     all  --  My Laptop IP         0.0.0.0/0
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 STRING match  "str_to_match" ALGO name bm TO 65535
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
DROP       all  --  198.245.49.225       0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:222
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Pude incluir mis IP dinámicas simplemente usando su nombre de dominio DynDNS en lugar de una IP.

Probablemente podría dar esta respuesta, pero me gustaría recibir algunos consejos sobre las mejores prácticas con respecto a este problema.

información relacionada