
Tengo una configuración de DNS inteligente y uso dnsmasq como servidor DNS, que siempre se resuelve en la dirección IP de mi servidor, para una lista determinada de dominios.
Quiero configurar un servidor web o un programa proxy para escuchar en los puertos 80 y 443 de mi servidor. Que luego reenvía todas las solicitudes web a un servidor proxy externo (squid) como solicitudes de proxy.
¿Sería posible hacer esto utilizando programas como (nginx, harproxy, squid, etc.), tanto para el tráfico http como para https, sin terminación SSL en el servidor?
Hasta ahora, ninguna de las configuraciones que he probado funcionó, Haproxy config.
frontend https_front
bind *:443
mode tcp
default_backend squid_backend_https
backend squid_backend_https
mode tcp
server squid_proxy 111.22.32.11:3323
configuración de Nginx,
stream {
upstream ssl_backend {
server 111.22.32.11:3323;
}
server {
listen 443;
proxy_protocol on;
tcp_nodelay on;
proxy_pass ssl_backend;
ssl_preread on;
proxy_ssl_protocols TLSV1 TLSv1.2 TLSv1.3;
proxy_ssl_ciphers 'HIGH:!aNULL:!MD5';
proxy_ssl on;
proxy_ssl_server_name on;
#proxy_next_upstream on;
proxy_ssl_verify off;
}
}
Supongo que el programa backend que escucha en 80 y 443 debería reenviar efectivamente la solicitud web http/https, como una solicitud de proxy al servidor proxy externo (squid).
En primer lugar, ¿es teóricamente posible lograrlo utilizando solo haproxy, squid, nginx o cualquier programa similar?
Cualquier ayuda sobre cómo lograr esto sería muy apreciada. Gracias
Actualización 1
El servidor proxy externo es necesario para acceder a los sitios web requeridos. Si agrego el proxy ip:port manualmente en el navegador, funciona bien.
Pero tengo algunas limitaciones en algunas aplicaciones, donde no se puede agregar el proxy. Para evitar ese problema, estoy probando una configuración en la que el dns resuelve las solicitudes para esos dominios específicos en mi proxy inverso, que luego debe atender las solicitudes a través del servidor proxy externo.
La parte DNS funciona bien. Se resuelve en mi IP de proxy inverso, para los dominios requeridos. Estoy atascado al intentar configurar el proxy inverso (no solo nginx, abierto a cualquier otro programa) para atender las solicitudes a través del proxy externo.
El proxy inverso no tiene acceso a los certificados SSL para los dominios. La terminación de SSL se realiza después de que la solicitud se reenvía al servidor proxy externo.
Actualización 2
No tiene la opción de aprovisionar certificados para esos dominios en el proxy inverso.
Una forma que se me ocurre es configurar el proxy inverso para redirigir el tráfico https, junto con SNI, al proxy externo, sin terminar el SSL en el servidor.
La única máquina en la que puedo realizar cambios significativos es en el servidor proxy inverso. El servidor ejecuta Ubuntu 22.04.
El único cambio que se puede realizar en las máquinas cliente es la IP del servidor dns (servidor dnsmasq)
No tiene ninguna disposición para realizar cambios en el proxy externo (squid).
El proxy externo solo acepta conexiones HTTP-relay y Connect Proxy.
Espero que esto aclare un poco la pregunta.
Respuesta1
Según la Actualización 2, la única solución viable es implementar un proxy adicional entre el cliente y el proxy existente para prefijar la transmisión desde el lado del cliente con "CONNECT hostname".
Sacacorchos(utilizado más tradicionalmente para hacer túneles de conexiones ssh a través de un proxy web) puede hacer eso, pero solo habla con stdin/stdout y se ejecuta como un solo subproceso. Pero ejecutar esto mediante xinetd resuelve estas limitaciones.
Entonces sólo queda el problema de enrutar el tráfico al host sacacorchos. Eso se podría hacer en iptables o por DNS.
Respuesta2
Con HAProxy esto debería funcionar
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options prefer-client-ciphers no-sslv3 no-tlsv10 no-tlsv11 no-tlsv12 no-tls-tickets
ssl-default-server-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tlsv12 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http-in
bind *:80
default_backend your_backend
frontend https-in
bind *:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1 # Specify path to your SSL certificates
default_backend your_backend
backend your_backend
server backend-server1 192.168.1.10:80 # Replace with the IP and port of your backend server
Nginx Para poder representar el tráfico https, ambas partes necesitan un certificado SSL.
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://your_backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
location / {
proxy_pass https://your_backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Agregue este vhost a /etc/nginx/sites-available y cree un enlace simbólico a sitios habilitados y vuelva a cargar nginx