Điểm:0

Nginx: Chuyển tiếp lưu lượng HTTPS đến máy chủ proxy yêu cầu xác thực

lá cờ in

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

djdomi avatar
lá cờ za
không hoạt động không phải là một mô tả lỗi. vui lòng cung cấp đầy đủ cấu hình nhắc nhở 'không hoạt động', cổng mặc định đó không cần phải khai báo
ahmadrg avatar
lá cờ in
@djdomi Đã thêm chi tiết và làm rõ cho bài đăng. Cảm ơn.
dave_thompson_085 avatar
lá cờ jp
Để nginx xử lý HTTPS [bạn cần `listen *:443 ssl` cộng với (các) chỉ thị để đặt chứng chỉ/chuỗi và khóa](https://nginx.org/en/docs/http/ngx_http_ssl_module.html). Với cấu hình bạn có, nginx đang mong đợi HTTP-clear trên 443, vì vậy khi máy khách thực sự sử dụng HTTPS, bản ghi SSL/TLS đầu tiên (bắt tay ClientHello) xuất hiện trong nhật ký của bạn dưới dạng yêu cầu HTTP rác `\x16\x03\x01etcetc `
dave_thompson_085 avatar
lá cờ jp
Tái bút: luồng không thể phân tích cú pháp/nhận dạng cũng như sửa đổi tiêu đề HTTP vì nó không yêu cầu hoặc mong đợi HTTP, chỉ có byte và byte không có tiêu đề hoặc thậm chí cả dòng.
ahmadrg avatar
lá cờ in
@dave_thompson_085 Cảm ơn bạn đã giải thích rõ ràng. Tôi đang khám phá các mô-đun khác bằng NGINX, chẳng hạn như https://github.com/chobits/ngx_http_proxy_connect_module#example-for-curl Nó đề cập đến xác thực cơ bản trong tài liệu và trong cuộc thảo luận. Tôi sẽ cập nhật bài đăng sau khi tôi có cái nhìn rõ ràng hoặc tìm ra giải pháp.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.