Điểm:3

Làm cách nào để nginx không ghi đè x-forwarded-for khi ủy quyền?

lá cờ cn

Tôi có một máy chủ nginx phía sau bộ cân bằng tải, máy chủ nginx chuyển các yêu cầu tới nhiều dịch vụ khác nhau, nhưng trong trường hợp này là một bộ chứa docker chạy apache. Bộ cân bằng tải đặt chính xác X-Forwarded-For, nhưng vào thời điểm nó đến bộ chứa docker, X-Forwarded-For đã được đặt thành IP LB.

Tôi có cái này trong cấu hình nginx:

/etc/nginx/conf.d/real_ip.conf
set_real_ip_from {{LB IP}};
real_ip_header X-Real-IP;
real_ip_recursive bật;

và đây là máy chủ ảo:

người phục vụ {
    nghe 443 ssl;
    nghe [::]:443 ssl;
    server_name *.domain miền;
    bao gồm /etc/nginx/snippets/domain_ssl.conf;

  add_header X-Nginx-Gỡ lỗi "xin chào";

  bật proxy_pass_request_headers;

  địa điểm    / {
    bật proxy_pass_request_headers;
    proxy_pass http://container-php;
    proxy_http_version 1.1;
    proxy_set_header Nâng cấp $http_upgrade;
    proxy_set_header Kết nối "nâng cấp";
    proxy_set_header Máy chủ $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Remote-Addr $remote_addr;
    proxy_set_header X-Real-IP $http_x_real_ip;
    proxy_set_header X-Header-Test "Xin chào thế giới - $http_x_forwarded_for";
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Nhưng những gì tôi nhận được từ container là:

mảng(19) {
  ["Kết nối"]=>
  chuỗi (7) "nâng cấp"
  ["Máy chủ"]=>
  chuỗi (19) "miền"
  ["X-Forwarded-For"]=>
  chuỗi (12) "{{LB IP}}"
  ["X-Header-Test"]=>
  chuỗi (13) "Xin chào thế giới -"
  ["X-Forwarded-Proto"]=>
  chuỗi (5) "https"
  ["kiểm soát bộ đệm"]=>
  chuỗi (9) "tuổi tối đa = 0"
  ["sec-ch-ua"]=>
  string(64) "" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97""
  ["sec-ch-ua-mobile"]=>
  chuỗi (2) "?0"
  ["sec-ch-ua-nền tảng"]=>
  chuỗi (9) ""Windows""
  ["yêu cầu nâng cấp-không an toàn"]=>
  chuỗi (1) "1"
  ["tác nhân người dùng"]=>
  chuỗi (114) "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, như Gecko) Chrome/97.0.4692.71 Safari/537.36"
  ["chấp nhận"]=>
  chuỗi(135) "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v =b3;q=0,9"
  ["sec-fetch-site"]=>
  chuỗi (4) "không"
  ["sec-fetch-mode"]=>
  chuỗi (8) "điều hướng"
  ["sec-fetch-user"]=>
  chuỗi (2) "?1"
  ["sec-fetch-dest"]=>
  chuỗi (8) "tài liệu"
  ["chấp nhận mã hóa"]=>
  chuỗi (17) "gzip, xì hơi, br"
  ["chấp nhận ngôn ngữ"]=>
  chuỗi(26) "en-GB,en-US;q=0.9,en;q=0.8"
}

Đáng chú ý là X-Real-IP, X-Fowarded-For dường như không được đặt, remote_addr cũng vậy. Các tệp được cung cấp trực tiếp từ nginx đã được đặt x-forwarded-for đúng cách, vì vậy LB đang gửi tiêu đề bên phải xuống.

Tôi đã bỏ lỡ một bước?

Điểm:2
lá cờ br

Tôi nghĩ vấn đề nằm ở cấu hình ip thực của bạn.

set_real_ip_from {{LB IP}};

real_ip_header X-Real-IP;

real_ip_recursive bật;

Khi nào real_ip_header nên (trong trường hợp của bạn) được đặt thành X-Forwarded-For. Tôi sẽ cho rằng tiêu đề X-Forwarded-For của bạn từ LB trông như thế này:

X-Forwarded-For: {{IP máy khách gốc}}, {{LB ip}}

Vì vậy, khi bạn đặt real_ip_header (Tiêu đề được sử dụng để thay thế ip máy khách) thành X-Forwarded-For, nó sẽ khớp với ip máy khách ban đầu. Ứng dụng khách gốc bây giờ sẽ ở dưới biến $realip_remote_addr, bạn có thể gửi địa chỉ này tới proxy_set_header X-Forwarded-For :

proxy_set_header X-Chuyển tiếp-Cho $realip_remote_addr

Xin vui lòng cho tôi biết nếu tôi đã được giúp đỡ!

lá cờ cn
Đó mới là điều kỳ lạ. Với ```set_real_ip_từ 49.12.23.194; real_ip_recursive bật; ``` và ``` vị trí / { proxy_pass http://container-php; proxy_set_header X-Forwarded-For $realip_remote_addr; proxy_set_header X-Forwarded-Debug "Remotep $realip_remote_addr"; ``` tôi vẫn đang nhận được ``` ["X-Forwarded-For"]=> chuỗi (26) ",49.12.23.194,49.12.23.194"``
Điểm:1
lá cờ my

Đây là câu lệnh ghi đè tiêu đề X-Forwarded-For:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Giả sử bạn muốn giữ nguyên IP máy khách ban đầu trong tiêu đề đó, bạn nên viết:

proxy_set_header X-Forwarded-For $remote_addr;

lá cờ cn
Đó là những gì tôi có ban đầu, nhưng $remote_addr tại thời điểm đó là IP của bộ cân bằng tải.
Điểm:0
lá cờ cn

Từ mô tả của bạn, vấn đề của bạn không liên quan trực tiếp đến nginx mà là với apache.

Tùy thuộc vào cấu hình của bạn, lưu lượng truy cập của bạn có thể giống như sau:

bên ngoài -> nginx -> apache -> php (chạy dưới dạng fpm)

hoặc

bên ngoài -> nginx -> mô-đun apache + php

Bạn nên xem xét cấu hình apache để đảm bảo rằng nếu apache không loại bỏ x-chuyển tiếp-chox-real-ip tiêu đề khi chuyển yêu cầu tới PHP.

Nếu luồng lưu lượng truy cập của bạn phù hợp với ví dụ đầu tiên, thì bạn cũng có apache ủy quyền yêu cầu cho php, điều này có thể dẫn đến nhiều vấn đề hơn nếu nginx và apache không "đồng bộ hóa".

Nếu bạn đang xử lý ủy quyền php bằng nginx một mình, bạn chỉ cần thêm phần sau vào php của mình địa điểm cấu hình:

vị trí ~ \.php$ {
        #...các quy tắc khác
        fastcgi_param REMOTE_ADDR $http_x_real_ip;
        #...các quy tắc khác
}

Bằng cách này, PHP REMOTE_ADDR sẽ được thiết lập chính xác.


Liên quan đến cấu hình nginx của bạn nếu nginx của bạn {{LB IP}} là tĩnh, bạn có thể đặt trực tiếp trong tệp config.

/etc/nginx/conf.d/real_ip.conf
set_real_ip_from {{LB IP}};
real_ip_recursive bật;

bạn không cần real_ip_header X-Real-IP; trong tập tin cấu hình của bạn. Điều đó sẽ ghi đè lên set_real_ip_from chỉ thị.

Hãy nhớ rằng bạn cần kích hoạt mô-đun real_ip trong nginx để điều này hoạt động.

lá cờ cn
Vâng, tùy chọn đầu tiên là cách nó hoạt động. Luồng chính xác hơn một chút sẽ là ```bên ngoài -> bộ cân bằng tải -> nginx -> [DOCKER; apache -> php-fpm]```
lá cờ cn
Tôi đã không nghĩ đến việc Apache xáo trộn các tiêu đề trước khi nó đến với PHP. Đó là một điều tốt để kiểm tra, tôi sẽ xem xét điều đó.
Điểm:0
lá cờ cn

Cuối cùng tôi đã giải quyết vấn đề này theo cách hiệu quả, nhưng không thực sự giải quyết được vấn đề gốc. Theo như tôi có thể nói, LB ngược dòng đang đặt "X-Forwarded-For" thành địa chỉ từ xa và phép thuật của nginx cố gắng đặt chính xác cho proxy ngược lại luôn bị sai và đặt nó thành địa chỉ LB hoặc một địa chỉ trống chuỗi.

Thay vào đó, tôi đã chuyển từ giao thức HTTP sang PROXY cho bit LB->Server, đặt thông tin sau trong/etc/nginx/proxy_params:

proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Chuyển tiếp-Cho $proxy_protocol_addr;

và cái này trong conf.d:

 /etc/nginx/conf.d/real_ip.conf
set_real_ip_from {{ LB_IP }};
real_ip_header proxy_protocol;

chuyển thể từ đây:

https://www.x33u.org/docs/kubernetes-stuff/hetzner-loadbalancer-setup/

và bây giờ mọi thứ hoạt động.

Đă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.