
나는 주어진 도메인 목록에 대해 항상 내 서버 IP 주소를 확인하는 DNS 서버로 dnsmasq를 사용하는 스마트 DNS 설정을 가지고 있습니다.
내 서버의 포트 80과 443을 수신하도록 웹 서버나 프록시 프로그램을 구성하고 싶습니다. 그런 다음 모든 웹 요청을 프록시 요청으로 외부 프록시 서버(오징어)에 전달합니다.
서버에서 SSL을 종료하지 않고 http 및 https 트래픽 모두에 대해 (nginx, harproxy, squid..etc)와 같은 프로그램을 사용하여 이 작업을 수행할 수 있습니까?
지금까지 내가 테스트한 구성 중 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 웹 요청을 외부 프록시 서버(squid)에 대한 프록시 요청으로 전달해야 한다고 가정합니다.
첫째, haproxy, squid, nginx 또는 유사한 프로그램을 사용하여 이론적으로 이를 달성하는 것이 가능합니까?
이를 달성하는 방법에 대한 도움을 주시면 대단히 감사하겠습니다. 감사해요
업데이트 1
필요한 웹 사이트에 액세스하려면 외부 프록시 서버가 필요합니다. 브라우저에 프록시 IP:포트를 수동으로 추가하면 제대로 작동합니다.
하지만 일부 응용 프로그램에는 프록시를 추가할 수 없는 몇 가지 제한 사항이 있습니다. 이 문제를 우회하기 위해 해당 특정 도메인에 대한 요청, DNS가 내 역방향 프록시로 확인되는 설정을 테스트하고 있으며, 그런 다음 외부 프록시 서버를 통해 요청을 처리해야 합니다.
DNS 부분이 잘 작동합니다. 필요한 도메인에 대해 내 역방향 프록시 IP로 확인됩니다. 외부 프록시를 통해 요청을 처리하기 위해 역방향 프록시(nginx뿐만 아니라 다른 프로그램에 열려 있음)를 구성하려고 시도 중입니다.
역방향 프록시는 도메인의 SSL 인증서에 액세스할 수 없습니다. SSL 종료는 요청이 외부 프록시 서버로 전달된 후에 수행됩니다.
업데이트 2
역방향 프록시에서는 해당 도메인에 대한 인증서를 프로비전하는 옵션이 없습니다.
내가 생각할 수 있는 한 가지 방법은 서버에서 SSL을 종료하지 않고 SNI와 함께 https 트래픽을 외부 프록시로 리디렉션하도록 역방향 프록시를 구성하는 것입니다.
의미 있는 변경을 수행할 수 있는 유일한 시스템은 역방향 프록시 서버에 있습니다. 서버가 Ubuntu 22.04를 실행 중입니다.
클라이언트 시스템에서 변경할 수 있는 유일한 변경 사항은 DNS 서버 IP(dnsmasq 서버)입니다.
외부 프록시(오징어)를 변경할 수 있는 조항이 없습니다.
외부 프록시는 http-릴레이, Connect 프록시 연결만 허용합니다.
이것이 질문을 좀 더 명확하게 해주기를 바랍니다.
답변1
업데이트 2에 따르면 실행 가능한 유일한 솔루션은 클라이언트와 기존 프록시 사이에 추가 프록시를 구현하여 클라이언트 측 스트림 앞에 "CONNECT 호스트 이름"을 붙이는 것입니다.
빙빙 돌리다(전통적으로 웹 프록시를 통해 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를 다시 로드합니다.