Aquí está mi configuración de red:
Mi configuración de red http://daveden.files.wordpress.com/2013/05/network-configuration.png
El servidor proxy ejecuta Ubuntu con Squid en el puerto 3128 y DansGuardian en el puerto 8080.
Me gustaría obligar a todos los clientes a utilizar el servidor proxy, específicamente el puerto 8080, para cualquier acceso HTTP/HTTPS.
Sin embargo, no quiero redirigir de forma transparente porque eso no funciona para HTTPS. No me importa configurar cada cliente y no me importa que cada cliente sepa que está usando un servidor proxy. Simplemente no quiero que los clientes puedan navegar por la web sin la configuración del proxy.
¿Cómo hago esto? ¿Puedo simplemente descartar paquetes si el cliente no está configurado para usar el servidor proxy en el puerto 8080?
Intenté usar iptables para descartar paquetes que tenían un puerto distinto de 8080, pero creo que rechazó demasiado y ya no pude acceder a nada.
EDITAR
Reescribí esta pregunta para que no sea específica de iptables, pero no estoy en absoluto en contra del uso de iptables. Sólo quiero atraer una gama más amplia de posibles soluciones.
EDITAR 2
Creo que quizás les haya dado a algunos una impresión equivocada. Para que quede claro, no estoy interesado en absolutofiltraciónTráfico HTTPS (es decir, mirar desarmar paquetes en el proxy e inspeccionar el contenido). estoy mas interesado enbloqueandositios con DansGuardian, ya sea a través de HTTP o HTTPS (observando el destino de los paquetes).
EDITAR 3
Basado en la sugerencia de Alexandru-Florin Vintil a continuación, esto es lo que estoy haciendo actualmente:
# Redirect HTTP traffic to port 8080 (DansGuardian)
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
# Check TCP and UDP traffic against whitelist
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j whitelist
iptables -A FORWARD -i eth1 -p udp --dport 443 -j whitelist
# Drop all other HTTPS traffic
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 443 -j DROP
# Drop all traffic aimed straight at the proxy
iptables -A FORWARD -i eth1 -p tcp --dport 3128 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 3128 -j DROP
iptables -A FORWARD -i eth1 -p tcp --dport 8080 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 8080 -j DROP
En pocas palabras, redirija el tráfico HTTP al puerto 8080, elimine todo el tráfico HTTPS que no esté en la lista blanca (en una cadena separada) y elimine todo el tráfico que utilice explícitamente el proxy. Sin la última regla, un cliente puede acceder a cualquier sitio web usando HTTPS siempre que configure su navegador para usar el proxy, porque entonces el puerto de destino es 8080 y no 443. Por lo tanto, incluso eliminar todo el tráfico vinculado a 443 no bloquea HTTPS por completo. .
Respuesta1
Mis 2 centavos:
Con respecto a HTTP: tener un firewall que reenvíe de forma transparente el tráfico del puerto 80 a un proxy/filtro es la forma más sencilla de hacer las cosas. No es necesario configurar el cliente, + puede eximir a cualquier host/subred del uso del proxy sin necesidad de reconfigurar el cliente. Esta es la única forma en que puede estar seguro de que todo lo que se supone que debe pasar a través del proxy lo será.
Cualquier método que no sea bloquear todo el tráfico HTTPS 443 saliente y permitir solo un subconjunto de sitios basados en la IP permitida en el puerto saliente 443 no funcionará como se esperaba. El protocolo seguro de HTTPS está diseñado (aparte de algunas fallas) para evitar ataques Man-In-The-Middle (los servidores proxy SON MITM "legales"). De esta manera, HTTPS puede hacer aquello para lo que fue diseñado. Sin embargo, si quieresIGNORARHTTPS, debes configurar tu Squid para usar DIRECT y no CONNECT (tocar), pero incluso si este es el caso, aún puedes encontrarte con sitios web problemáticos con partes mixtas de HTTP/HTTPS. De esta manera, su proxy Squid también administrará HTTPS. Esto también debería reflejarse en la parte de reenvío transparente de su firewall.
Respuesta2
Siempre que vea que algo que debería funcionar no está funcionando, debe preguntar si hay algún otro factor involucrado que no esté viendo. La regla
sudo iptables -A INPUT -p tcp ! --dport 8080 -j REJECT
Parece que debería funcionar, pero tienesadjuntoa la cadena INPUT, por lo que probablemente sea eludido por una regla anterior en la cadena. Esta regla debería ser adecuada por sí sola, ya que la cadena INPUT es la primera cadena a la que llegan los paquetes entrantes. Si son RECHAZADOS en la cadena de ENTRADA, nunca llegan a las cadenas de ADELANTE o de SALIDA. Por supuesto, esta regla bloquearátodoTCP que no está destinado al puerto 8080, que probablemente no sea lo que realmente desea al final a menos que el proxy en 8080 sea el único servicio en la máquina y solo inicie sesión desde la consola.
Entonces, lo primero que debe hacer es enumerar las reglas y buscar qué podría estar causando que los paquetes pasen:
sudo iptables -L
Si su firewall tiene NAT inversa, también debe incluir la tabla NAT.
sudo iptables -L -t nat
Después, intenta poner la misma regla al final.comienzode la cadena:
sudo iptables -I INPUT -p tcp ! --dport 8080 -j REJECT
y vea si eso no resuelve el problema, o al menos le da más confianza en que comprende cómo iptables
funciona para poder completar su conjunto de reglas. Si está trabajando en este host de forma remota, mi sugerencia lo desconectará, por lo que debe hacerlo solo desde la consola. Para trabajar de forma segura desde el control remoto consulte a mi colegaPublicación de Eli Rosencruft sobre cómo modificar firewalls desde forma remota.
Respuesta3
Estándar
Una cadena separada (definida por el usuario) podría ayudar.
# create a chain just for user 100 (192.168.1.100)
iptables -N custom_user_100
# redirect all traffic FROM user 100 to custom chain
iptables -A INPUT -p tcp -s 192.168.1.100 -j custom_user_100
# return from user chain for valid traffic, drop all other
iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN
iptables -A custom_user_100 -j DROP
Entonces, lo que esto hace es redirigir cualquier tráfico DESDE 192.168.1.100 a una cadena personalizada. Esta cadena personalizada (definida por el usuario) simplemente regresa si se encuentra una coincidencia válida (tráfico destinado al puerto 8080). Todo el resto del tráfico no coincidente que no genere un retorno de la cadena seabandonó.
Posteriormente podrás ver las estadísticas de las tablas para verificar que esto es lo que pasó:
iptables -L -v -n
Reenvío
Ahora, en el caso de que esté procesando tráfico de reenvío, habrá un conjunto diferente de reglas, pero la idea de usar una cadena personalizada (definida por el usuario) es la misma. Me gusta consultar el diagrama en este enlace:http://www.csie.ntu.edu.tw/~b93070/CNL/v4.0/CNLv4.0.files/Page697.htmal intentar comprender el flujo de paquetes.
En este caso, es posible que desee hacer algo como lo siguiente:
# create a chain just for user 100 (192.168.1.100)
iptables -N custom_user_100
# redirect all traffic FROM user 100 to custom chain
iptables -A FORWARD -p tcp -s 192.168.1.100 -j custom_user_100
# return from user chain for valid traffic, drop all other
iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN
iptables -A custom_user_100 -j DROP
Esto es idéntico al primero excepto que la regla que se aplicó a la cadena INPUT se aplica, en cambio, a la cadena FORWARD.
Actualización 2013-05-24
He releído tu pregunta. Entonces empezaremos de nuevo.
Supongamos que su "proxy" es en realidad un enrutador. Es decir, pasa todos los paquetes de una interfaz a otra, tal vez usando NAT. Esto significa que todos los paquetes de interés fluyen a través de la cadena FORWARD.
Siguiente: usted dice que configurará todos los clientes usando el puerto 8080 para acceder al proxy. Bien. Esto significa que todosaquellosLos paquetes ingresarán al "proxy" a través de la cadena INPUT.
Entonces: solo desea evitar que alguien salga por el puerto 8080 en la cadena FORWARD.
iptables -A FORWARD -p tcp --dport 8080 -j REJECT
Esta regla garantizará que todo lo que deba reenviarse a un puerto de destino 8080 sea rechazado (se enviará un paquete ICMP al cliente que intentó pasar el paquete a través del proxy).
Después de implementar esta regla, es VITAL que la pruebe intentando realizar dicha conexión prohibida; luego, enumere las reglas escribiendo:
iptables -L -v -n |grep 8080
y asegúrese de que el contador haya aumentado. Si no, entonces hay algún problema con la configuración del enrutador.
Respuesta4
Si no desea que sus clientes simplemente accedan a sitios http{s} sin el proxy, puede simplemente DROP
reenviar REJECT
paquetes a los puertos 80 y 443:
IPTABLES -I FORWARD -i eth1 -p tcp -m multiport --dports 80,443 -j REJECT
¿Dónde eth1
está su interfaz interna? De esta manera no tendrá que meterse con otros puertos/accesos.