将 HTTPS 流量转发到代理服务器

将 HTTPS 流量转发到代理服务器

我有一个智能 DNS 设置,使用 dnsmasq 作为 DNS 服务器,对于给定的域列表,它始终解析为我的服务器 IP 地址。

我想配置一个 Web 服务器或代理程序来监听我服务器上的 80 和 443 端口。然后将所有 Web 请求作为代理请求转发到外部代理服务器 (squid)。

是否可以使用类似 (nginx、harproxy、squid 等) 的程序来执行 http 和 https 流量,而无需在服务器上终止 ssl。

到目前为止,我测试过的所有配置都不起作用,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

需要外部代理服务器才能访问所需的网站。如果我在浏览器上手动添加代理 ip:port,它就可以正常工作。

但是我在某些应用程序上遇到了一些限制,无法添加代理。为了绕过这个问题,我正在测试一种设置,其中 DNS 解析这些特定域的请求到我的反向代理,然后反向代理需要通过外部代理服务器来处理请求。

DNS 部分工作正常。它解析为我的反向代理 IP,用于所需的域。我尝试配置反向代理(不仅仅是 nginx,对任何其他程序都开放),以通过外部代理处理请求,但一直无法成功。

反向代理无法访问域的 SSL 证书。在将请求转发到外部代理服务器后,SSL 终止。

更新 2

在反向代理上,没有为这些域提供证书的选项。

我能想到的一种方法是配置反向代理以将 https 流量与 SNI 一起重定向到外部代理,而无需终止服务器上的 ssl。

我可以进行任何有意义的更改的唯一机器是反向代理服务器。该服务器正在运行 Ubuntu 22.04。

客户端机器上唯一可以做的更改是 DNS 服务器 IP(dnsmasq 服务器)

没有规定对外部代理(squid)进行任何更改。

外部代理仅接受 http-relay,连接代理连接。

希望这能让问题更加清楚。

答案1

根据更新 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;
    }
}

将此虚拟主机添加到 /etc/nginx/sites-available 并创建指向 sites-enabled 的符号链接,然后重新加载 nginx

相关内容