![将 HTTPS 流量转发到代理服务器](https://linux22.com/image/792223/%E5%B0%86%20HTTPS%20%E6%B5%81%E9%87%8F%E8%BD%AC%E5%8F%91%E5%88%B0%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我有一个智能 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