HTTPSトラフィックをプロキシサーバーに転送する

HTTPSトラフィックをプロキシサーバーに転送する

私はスマート DNS をセットアップしており、DNS サーバーとして dnsmasq を使用しています。これにより、指定されたドメインのリストに対して、常にサーバーの IP アドレスが解決されます。

ウェブサーバーまたはプロキシ プログラムのいずれかを設定して、サーバーのポート 80 と 443 をリッスンするようにします。これにより、すべてのウェブ要求がプロキシ要求として外部プロキシ サーバー (squid) に転送されます。

サーバー上で SSL を終了せずに、http と https の両方のトラフィックに対して、nginx、harproxy、squid などのプログラムを使用してこれを行うことは可能でしょうか。

これまでのところ、私がテストした構成はどれも機能しませんでした。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

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

80 と 443 でリッスンしているバックエンド プログラムは、http/https Web 要求をプロキシ要求として外部プロキシ サーバー (squid) に効果的に転送する必要があると推測します。

まず、haproxy、squid、nginx、または同様のプログラムだけを使用してこれを実現することは理論的に可能ですか。

これを実現する方法についての助言をいただければ幸いです。ありがとうございます

アップデート1

必要な Web サイトにアクセスするには、外部プロキシ サーバーが必要です。ブラウザーにプロキシの IP:ポートを手動で追加すると、正常に動作します。

しかし、一部のアプリケーションではプロキシを追加できないという制限があります。この問題を回避するために、特定のドメインのリクエストを DNS がリバース プロキシに解決し、その後、外部プロキシ サーバーを介してリクエストを処理する必要がある設定をテストしています。

DNS 部分は正常に動作しています。必要なドメインについては、リバース プロキシ IP に解決されます。外部プロキシ経由でリクエストを処理するために、リバース プロキシ (nginx だけでなく、他のプログラムにも公開) を構成しようとして行き詰まっています。

リバース プロキシは、ドメインの SSL 証明書にアクセスできません。SSL の終了は、要求が外部プロキシ サーバーに転送された後に実行されます。

アップデート2

リバース プロキシでは、これらのドメインの証明書をプロビジョニングするオプションはありません。

考えられる方法の 1 つは、サーバー上の SSL を終了せずに、リバース プロキシを構成して、SNI とともに https トラフィックを外部プロキシにリダイレクトすることです。

意味のある変更を行える唯一のマシンは、リバース プロキシ サーバー上にあります。サーバーは Ubuntu 22.04 を実行しています。

クライアントマシンで変更できるのは、DNSサーバーのIP(dnsmasqサーバー)のみです。

外部プロキシ (squid) に変更を加えるための規定はありません。

外部プロキシは、http-relay、Connect proxy 接続のみを受け入れます。

これで質問が少し明確になったと思います。

答え1

Update 2 に基づくと、唯一の実行可能な解決策は、クライアントと既存のプロキシの間に追加のプロキシを実装し、クライアント側からのストリームに「CONNECT ホスト名」というプレフィックスを付けることです。

コルク抜き(従来は Web プロキシ経由で SSH 接続をトンネリングするために使用) はそれを実行できますが、stdin/stdout とのみ通信し、単一のスレッドとして実行されます。ただし、xinetd 経由でこれを実行すると、これらの制約が解決されます。

次に、トラフィックをコルクスクリュー ホストにルーティングする問題があります。これは、iptables または DNS で実行できます。

答え2

HAProxyを使えば動作するはずです

   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 https トラフィックをプロキシするには、両側に 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;
    }
}

このvhostを/etc/nginx/sites-availableに追加し、sites-enabledへのシンボリックリンクを作成してnginxをリロードします。

関連情報