Encaminhar tráfego HTTPS para um servidor proxy

Encaminhar tráfego HTTPS para um servidor proxy

Eu tenho uma configuração de DNS inteligente, usando dnsmasq como servidor DNS, que sempre resolve o endereço IP do meu servidor, para uma determinada lista de domínios.

Quero configurar um servidor web ou um programa proxy para escutar nas portas 80 e 443 do meu servidor. Que então encaminha todas as solicitações da web para um servidor proxy externo (squid) como solicitações de proxy.

Seria possível fazer isso, utilizando programas como (nginx, harproxy, squid..etc), tanto para tráfego http quanto https, sem terminação SSL no servidor.

Até agora, nenhuma das configurações que testei funcionou, configuração do Haproxy.

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

Configuração 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;
  }
  }

Presumo que o programa back-end que escuta em 80 e 443, deva efetivamente encaminhar a solicitação da web http/https, como uma solicitação de proxy para o servidor proxy externo (squid).

Em primeiro lugar, é teoricamente possível conseguir isso, usando apenas haproxy, squid, nginx ou qualquer programa semelhante.

Qualquer ajuda sobre como conseguir isso seria muito apreciada. Obrigado

Atualização 1

O servidor proxy externo é necessário para acessar os sites necessários. Se eu adicionar o proxy ip:port manualmente no navegador, ele funcionará bem.

Mas tenho algumas limitações em alguns aplicativos, onde o proxy não pode ser adicionado. Para contornar esse problema, estou testando uma configuração em que as solicitações para esses domínios específicos são resolvidas pelo DNS para meu proxy reverso, que então precisa atender as solicitações por meio do servidor proxy externo.

A parte do DNS está funcionando bem. Resolve para o meu ip de proxy reverso, para os domínios necessários. Estou preso tentando configurar o proxy reverso (não apenas o nginx, aberto a qualquer outro programa), para atender as solicitações através do proxy externo.

O proxy reverso não tem acesso aos certificados SSL dos domínios. O encerramento do SSL é feito após a solicitação ser encaminhada para o servidor proxy externo.

Atualização 2

Não tem a opção de provisionar certificados para esses domínios no proxy reverso.

Uma maneira que consegui pensar é configurar o proxy reverso para redirecionar o tráfego https, junto com o SNI, para o proxy externo, sem encerrar o SSL no servidor.

A única máquina em que posso fazer alterações significativas é no servidor proxy reverso. O servidor está executando o Ubuntu 22.04.

A única alteração que pode ser feita nas máquinas clientes é o IP do servidor DNS (servidor dnsmasq)

Não tem disposição para fazer nenhuma alteração no proxy externo (squid).

O proxy externo aceita apenas conexões http-relay, Connect proxy.

Espero que isso torne a questão um pouco mais clara.

Responder1

Com base na Atualização 2, a única solução viável é implementar um proxy adicional entre o cliente e o proxy existente para prefixar o fluxo do lado do cliente com "CONNECT hostname".

Saca rolhas(mais tradicionalmente usado para encapsular conexões ssh por meio de um proxy da web) pode fazer isso, mas apenas se comunica com stdin/stdout e executa como um único thread. Mas executar isso via xinetd resolve essas restrições.

Então você só tem o problema de rotear o tráfego para o host saca-rolhas. Isso poderia ser feito em iptables ou por DNS.

Responder2

Com HAProxy isso deve 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 fazer proxy do tráfego https, ambos os lados precisam de um 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;
    }
}

Adicione este vhost a /etc/nginx/sites-available e crie um link simbólico para sites habilitados e recarregue o nginx

informação relacionada