
我有一個 smart-dns 設置,使用 dnsmasq 作為 dns 伺服器,對於給定的網域列表,它始終解析為我的伺服器 IP 位址。
我想設定網頁伺服器或代理程式來偵聽伺服器上的連接埠 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 中繼、Connect 代理連線。
希望這能讓問題更清楚。
答案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 並建立指向啟用網站的符號連結並重新載入 nginx