
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 string
ser -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.