Tôi cần thiết lập một máy chủ HTTP/HTTPS trong suốt (proxy X) với NGINX để ủy quyền lưu lượng truy cập có ủy quyền cần thiết cho điểm cuối proxy (proxy Y).Điểm cuối proxy (B) yêu cầu ủy quyền cơ bản để chấp nhận lưu lượng truy cập.
Sự tương tự sẽ như thế này:
Khách hàng C
URL yêu cầu (ví dụ: ifconfig.co) -> DNS tùy chỉnh giải quyết yêu cầu tới proxy X
-> Ủy quyền (X)
chấp nhận yêu cầu và thao tác tiêu đề để thêm xác thực cơ bản -> Ủy quyền X
chuyển tiếp yêu cầu đến điểm cuối proxy Y
Nó sẽ đạt được kết quả chính xác như cURL dưới đây:
Ở đây tôi sử dụng https://ifconfig.co để kiểm tra IP điểm cuối.
HTTP
curl -x http://proxy_endpoint:proxy_port -U 'tên người dùng':'mật khẩu' -k https://ifconfig.co
HTTPS
curl -x http://proxy_endpoint:proxy_port -U 'tên người dùng':'mật khẩu' -k https://ifconfig.co
thử nghiệm:
Để kiểm tra thiết lập, tôi thêm một bản ghi vào /etc/hosts
để giải quyết ifconfig.co
đến máy chủ Proxy X của tôi
Sau đó, tôi thực hiện một cURL
#http
cuộn tròn http://ifconfig.co
#https
cuộn tròn https://ifconfig.co
Kết quả thành công sẽ cung cấp cho tôi IP của proxy điểm cuối Y
Lưu lượng HTTP:
Tôi đã tìm kiếm rộng rãi trên mạng một giải pháp sử dụng các mô-đun NGINX và tôi đã tìm thấy một câu trả lời rất hữu ích tại đây: https://serverfault.com/a/345244/954119
Tuy nhiên, câu trả lời này chỉ giúp tôi gửi lưu lượng HTTP chứ không phải HTTPS. Đây là những gì tôi đã định cấu hình cho HTTP trên cổng 80 trong nginx.conf:
http {
bao gồm /etc/nginx/mime.types;
ứng dụng default_type/octet-stream;
log_format chính '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log chính;
gửi tệp trên;
#tcp_nopush bật;
keepalive_timeout 300;
proxy_set_header Máy chủ lưu trữ $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
người phục vụ {
nghe *:80;
access_log /var/log/nginx/nginx.access.log;
error_log /var/log/nginx/nginx.error.log;
địa điểm / {
proxy_pass http://proxy_endpoint_Y:PORT;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_set_header Máy chủ lưu trữ $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Ủy quyền ủy quyền "Chuỗi mã hóa base64 cơ bản";
}
}
}
Vì vậy, tôi đặt http
chỉ thị với người phục vụ
lắng nghe trên cổng 80 và được định cấu hình địa điểm
với proxy_set_header Ủy quyền proxy
với tên người dùng/mật khẩu được mã hóa bas64.
Điều này thực sự hoạt động rất tốt và lưu lượng truy cập HTTP (cổng 80) proxy đến điểm cuối proxy, tuy nhiên, lưu lượng HTTPS sẽ không hoạt động.
lưu lượng truy cập HTTPS
Vì vậy, khi tôi thay đổi nghe
đến 443
thay thế:
http {
bao gồm /etc/nginx/mime.types;
ứng dụng default_type/octet-stream;
log_format chính '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log chính;
gửi tệp trên;
keepalive_timeout 300;
người phục vụ {
nghe *:443;
access_log /var/log/nginx/nginx.access.log;
error_log /var/log/nginx/nginx.error.log;
địa điểm / {
proxy_pass http://proxy_endpoint_Y:PORT;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_set_header Máy chủ lưu trữ $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Ủy quyền ủy quyền "Chuỗi mã hóa base64 cơ bản";
}
}
}
lỗi cURL trên Máy khách của tôi C
:
curl: (35) error:1400410B:SSL routines:CONNECT_CR_SRVR_HELLO:sai số phiên bản
Trong nhật ký truy cập của mình, tôi nhận được một nhật ký rất kỳ lạ:
xx.xxx.xx.x - - [26/Mar/2022:21:43:54 +0000] "\x16\x03\x01\x00\xE1\x01\x00\x00\xDD\x03\x03W\x87> \x1E+1\xDFb\x13\x1E,\xC0\xE9\xEF\x07\xAB[\xEA!\xBE\x17\xC23\x8D\xBD\xA4\xEA\xB5\xD5s\x8AO\x00\x00\ x5C\xC00\xC0,\xC0(\xC0$\xC0\x14\xC0" 400 157 "-" "-"
Tôi chỉ cần thao tác với lưu lượng HTTPS để thêm tiêu đề ủy quyền? Điều đó có thể không? Hoặc có một cách tiếp cận khác?
Ghi chú:
tôi đã thử sử dụng dòng
mô-đun mà tôi đã sử dụng trước đây để gửi lưu lượng HTTPS đến các điểm cuối, nhưng không được phép, nhưng tôi không thấy bất kỳ tùy chọn nào trong NGINX dòng
tài liệu mô-đun để thao tác các tiêu đề yêu cầu. http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html
Hệ thống môi trường:
phiên bản nginx: nginx/1.21.6 được xây dựng bởi gcc 9.3.0 (Ubuntu
9.3.0-10ubuntu2) được xây dựng với OpenSSL 1.1.1f 31 tháng 3 năm 2020 Đã bật hỗ trợ TLS SNI