Leiten Sie HTTPS-Datenverkehr an einen Proxyserver weiter

Leiten Sie HTTPS-Datenverkehr an einen Proxyserver weiter

Ich habe ein Smart-DNS-Setup und verwende dnsmasq als DNS-Server, der für eine bestimmte Liste von Domänen immer die IP-Adresse meines Servers auflöst.

Ich möchte entweder einen Webserver oder ein Proxyprogramm so konfigurieren, dass es auf Port 80 und 443 auf meinem Server lauscht. Dieses leitet dann alle Webanforderungen als Proxyanforderungen an einen externen Proxyserver (Squid) weiter.

Wäre es möglich, dies mit Programmen wie (nginx, harproxy, squid usw.) sowohl für HTTP- als auch für HTTPS-Verkehr zu tun, ohne SSL-Terminierung auf dem Server?

Bisher hat keine der von mir getesteten Konfigurationen funktioniert, Haproxy-Konfiguration.

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

Nginx-Konfiguration,

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;
  }
  }

Ich gehe davon aus, dass das Backend-Programm, das auf 80 und 443 lauscht, die http/https-Webanforderung effektiv als Proxyanforderung an den externen Proxyserver (Squid) weiterleiten sollte.

Erstens: Ist dies theoretisch möglich, wenn man nur Haproxy, Squid, Nginx oder ein ähnliches Programm verwendet?

Für jede Hilfe, wie dies erreicht werden kann, wäre ich sehr dankbar. Danke

Aktualisierung 1

Der externe Proxyserver wird benötigt, um auf die gewünschten Websites zuzugreifen. Wenn ich den Proxy-IP:Port manuell im Browser hinzufüge, funktioniert es einwandfrei.

Bei manchen Anwendungen habe ich jedoch Einschränkungen, da der Proxy nicht hinzugefügt werden kann. Um dieses Problem zu umgehen, teste ich ein Setup, bei dem die Anfragen für diese spezifischen Domänen vom DNS an meinen Reverse-Proxy weitergeleitet werden, der die Anfragen dann über den externen Proxy-Server bedienen muss.

Der DNS-Teil funktioniert einwandfrei. Er wird für die erforderlichen Domänen in meine Reverse-Proxy-IP aufgelöst. Ich komme nicht weiter beim Versuch, den Reverse-Proxy (nicht nur nginx, offen für jedes andere Programm) so zu konfigurieren, dass die Anfragen über den externen Proxy bedient werden.

Der Reverse-Proxy hat keinen Zugriff auf SSL-Zertifikate für die Domänen. Die SSL-Beendigung erfolgt, nachdem die Anfrage an den externen Proxy-Server weitergeleitet wurde.

Aktualisierung 2

Es besteht nicht die Möglichkeit, auf dem Reverseproxy Zertifikate für diese Domänen bereitzustellen.

Eine Möglichkeit, die mir einfällt, ist die Konfiguration des Reverse-Proxys, um den https-Verkehr zusammen mit SNI an den externen Proxy umzuleiten, ohne das SSL auf dem Server zu beenden.

Die einzige Maschine, auf der ich sinnvolle Änderungen vornehmen kann, ist der Reverse-Proxy-Server. Auf dem Server läuft Ubuntu 22.04.

Die einzige Änderung, die auf den Client-Rechnern vorgenommen werden kann, ist die IP des DNS-Servers (DNSMASQ-Server).

Es besteht keine Möglichkeit, Änderungen am externen Proxy (Squid) vorzunehmen.

Der externe Proxy akzeptiert nur HTTP-Relay und Connect-Proxy-Verbindungen.

Hoffe, das macht die Frage etwas klarer.

Antwort1

Basierend auf Update 2 besteht die einzige praktikable Lösung darin, einen zusätzlichen Proxy zwischen dem Client und dem vorhandenen Proxy zu implementieren, um dem Stream von der Clientseite das Präfix „CONNECT-Hostname“ zuzuweisen.

Korkenzieher(traditioneller zum Tunneln von SSH-Verbindungen über einen Webproxy verwendet) kann das, kommuniziert aber nur mit stdin/stdout und wird als einzelner Thread ausgeführt. Die Ausführung über xinetd löst diese Einschränkungen jedoch.

Dann müssen Sie nur noch den Datenverkehr zum Corkscrew-Host umleiten. Dies könnte in iptables oder über DNS erfolgen.

Antwort2

Mit HAProxy sollte dies funktionieren

   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: Um HTTPS-Verkehr weiterleiten zu können, benötigen beide Seiten ein SSL-Zertifikat.

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;
    }
}

Fügen Sie diesen virtuellen Host zu /etc/nginx/sites-available hinzu, erstellen Sie einen symbolischen Link zu sites-enabled und laden Sie nginx neu.

verwandte Informationen