Estoy usando un proxy transparente para reenviar solicitudes desde un origen (cliente) a un destino (servidor). Utilizo iptables para hacer que el bit transparente funcione... es decir: hace que la IP del cliente aparezca en el destino aunque la solicitud haya pasado por el proxy intermedio... en realidad se llama SSLH...https://github.com/yrutschle/sslh
Estas son las reglas:
iptables -w -t mangle -N SSLH
iptables -w -t mangle -A PREROUTING -p tcp -m socket --transparent -j SSLH
iptables -w -t mangle -A OUTPUT --protocol tcp --out-interface eth0 -m multiport --sport 80,443,4480 --jump SSLH
iptables -w -t mangle -A SSLH --jump MARK --set-mark 0x1
iptables -w -t mangle -A SSLH --jump ACCEPT
ip rule add fwmark 0x1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
Estoy ejecutando un sitio web en Apache en la misma máquina que el proxy, es un Pi que está dentro de la LAN de mi casa.
Cuando intento acceder a un sitio web en ese Apache y la solicitud se origina desde fuera de la LAN... como si me conecto a un punto de acceso wifi en mi teléfono, la página aparece en el navegador SIN EMBARGO, si me conecto a mi red wifi LAN e intento Abro la misma página y obtengo un tiempo de espera... A MENOS que desactive esas reglas de iptables... pero cuando hago esto, las solicitudes se originan fuera del tiempo de espera de la LAN.
Para posiblemente complicar un poco las cosas, también uso dnsmasq ejecutándose en el mismo Pi para simular NAT Loopback para poder acceder al sitio web desde mi propia LAN usando su nombre de dominio y no solo la dirección IP local.
Si solo uso la dirección IP local del servidor web, de todos modos no funcionará... a menos que
¿Necesito modificar las reglas de iptables para que una solicitud web como esta:
https://www.ejemplo.com/test.html
¿Aparecerá la página ya sea que esté dentro o fuera de mi LAN?
Gracias,
Doblar
Respuesta1
Tengo una solución que funciona.
Mi pregunta fue...
¿Necesito modificar las reglas de iptables para que una solicitud web como esta:
https://www.ejemplo.com/test.html
¿Aparecerá la página ya sea que esté dentro o fuera de mi LAN?
Mis reglas de iptables parecen estar bloqueando las solicitudes de conexión que se originan desde mi LAN. Todavía no sé por qué esto es exactamente, excepto que deben ser las reglas de iptables las que lo hacen porque las solicitudes que se originan fuera de la LAN funcionan bien con las reglas implementadas y las solicitudes que se originan desde afuera o desde adentro funcionan cuando las reglas están completamente desactivadas.
Tuve la idea de agregar reglas para ACEPTAR el tráfico entrante y saliente de todas las ips de mi LAN local. El servidor dhcp de mi enrutador asigna ips a dispositivos en mi LAN en el rango 192.168.1.1 a 192.168.1.200
Al especificar 192.168.1.0/24 puedo hacer referencia a TODAS las ips en ese rango.
Estas son las reglas que uso ahora:
iptables -t mangle -N SSLH
iptables -t mangle -A INPUT -p tcp -s 192.168.1.0/24 -j ACCEPT
iptables -t mangle -A OUTPUT -p tcp -d 192.168.1.0/24 -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j SSLH
iptables -t mangle -A OUTPUT -p tcp --out-interface eth0 -m multiport --sport 80,443,4480 -j SSLH
iptables -t mangle -A SSLH -j MARK --set-mark 0x1
iptables -t mangle -A SSLH -j ACCEPT
ip rule add fwmark 0x1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
Y me complace decir que una URL comohttps://www.ejemplo.com/que apunta a una página web en mi servidor Apache personal en un Pi en mi LAN ahora abre la página web si la solicito desde dentro o fuera de mi LAN.
Para descubrir por qué mis reglas originales bloqueaban las solicitudes que se originaban desde mi LAN, intenté cambiar:
iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j SSLH
A:
iptables -t mangle -A PREROUTING -p tcp -j SSLH
Porque la coincidencia de sockets transparentes ignora los sockets no transparentes, como sería una solicitud que no pasa por sslh. Pero el tráfico de las direcciones IP locales todavía estaba bloqueado.
Esta regla es la probable culpable... envía todos los paquetes salientes desde mi servidor web (puerto 443) a la cadena SSLH definida por el usuario. Todos los paquetes de esta cadena están marcados y, con la ayuda de las reglas posteriores, se enrutan a la interfaz de bucle invertido para que el proxy sslh los procese.
iptables -t mangle -A OUTPUT -p tcp --out-interface eth0 -m multiport --sport 80,443,4480 -j SSLH
Pero cuando esos paquetes eran "entrantes" y no pasaron por el proxy sslh para llegar a su destino en primer lugar, cuando son "salientes" y se enrutan a la interfaz loopback para ser procesados por sslh, supongo que sí. no sabe qué hacer con ellos y simplemente se pierden. En este caso, esos paquetes eran necesarios para que apareciera una página web en el navegador del cliente, por lo que el tiempo de espera del sitio web se agota.
Salud,
Doblar