Reenviar tráfico HTTPS a un servidor proxy

Reenviar tráfico HTTPS a un servidor proxy

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

información relacionada