Nginx set_real_ip_from Địa chỉ cân bằng tải ELB ELS


22

Tôi có một bộ máy chủ Nginx đằng sau bộ cân bằng tải Amazon ELB. Tôi đang sử dụng set_real_ip (từ HttpRealIpModule ) để tôi có thể truy cập địa chỉ IP của máy khách gốc trên các máy chủ này (để chuyển qua php-fpm và để sử dụng trong HttpGeoIPModule ).

Có vẻ như set_real_ip_fromtrong cấu hình nginx chỉ có thể chấp nhận một địa chỉ IP. Tuy nhiên, liên quan đến máy ELB, Amazon cho biết:

Lưu ý: Vì bộ địa chỉ IP được liên kết với LoadBalancer có thể thay đổi theo thời gian, bạn không bao giờ nên tạo bản ghi "A" với bất kỳ địa chỉ IP cụ thể nào. Nếu bạn muốn sử dụng tên DNS thân thiện cho LoadBalancer của mình thay vì tên được tạo bởi dịch vụ Cân bằng tải đàn hồi, bạn nên tạo bản ghi CNAME cho tên DNS LoadBalancer hoặc sử dụng Amazon Route 53 để tạo vùng lưu trữ. Để biết thêm thông tin, hãy xem Sử dụng tên miền với cân bằng tải đàn hồi

Nhưng nếu tôi cần nhập địa chỉ IP, tôi không thể sử dụng CNAME (của amazon hoặc của chính tôi). Có một giải pháp cho vấn đề này?

Câu trả lời:


40

Nếu bạn có thể đảm bảo rằng tất cả các yêu cầu sẽ đến từ ELB (Tôi không quen với điều đó), bạn có thể thử:

real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;

Điều đó sẽ cho nginx tin tưởng một tiêu đề X-Forwarded-For từ bất kỳ ai. Nhược điểm là nếu bất kỳ ai truy cập trực tiếp vào máy chủ của bạn, họ sẽ có thể giả mạo tiêu đề X-Forwarded-For và nginx sẽ sử dụng sai địa chỉ IP của máy khách.


2
Cảm ơn - Tôi không nhận ra mình có thể thêm một dải IP ở đó ... Tôi sẽ kiểm tra xem có phạm vi cụ thể hơn mà ELB có thể bật hay không (tôi nghĩ 10.0.0.1/8sẽ hoạt động mặc dù có thể có thứ gì đó cụ thể hơn)
vitch

Tôi đã thêm một câu hỏi tiếp theo để tìm hiểu xem có ai biết phạm vi hợp lệ không: serverfault.com/questions/331697/iêu
vitch

Nếu đó là VPC ALB, thì (các) phạm vi của bạn giống với phạm vi mạng con của bạn mà LB là một phần.
Talonx

17

Thực tiễn tốt nhất hiện nay là sử dụng VPC, do đó, sau đó, bạn sẽ biết CIDR chính xác cho ELB của mình. Sau đó, bạn có thể thêm một cái gì đó như thế này vào tệp cấu hình Nginx của bạn:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;

Xem như câu hỏi là từ năm 2011, có thể tùy chọn đó không có sẵn sau đó. Tôi chỉ bao gồm tất cả các mạng riêng tư có thể vì người dùng bên ngoài sẽ không truy cập được chúng một cách dễ dàng.
Jordan Reiter

7

Sử dụng VPC CIDR cho set_real_ip_fromBạn có thể tìm thấy nó trong bảng điều khiển Amazon trong VPC => VPC của bạn (thay thế <your VPC CIDR here>bằng nó):

real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;

4

Đặt phạm vi đáng tin cậy thành 0,0.0.0 / 0 trên Amazon ELB chắc chắn sẽ khiến bạn gặp rắc rối. Bạn có thể đảm bảo rằng các yêu cầu đến từ ELB nếu bạn có thể định cấu hình nhóm bảo mật cho máy chủ nginx của mình, nhưng yêu cầu ban đầu sẽ bắt nguồn từ bất kỳ nguồn nào có thể (ELB của Amazon là giao diện công cộng).

Một thử nghiệm đơn giản sẽ tiết lộ điều này:

curl --header "X-Forwarded-For: 1.2.3.4" "http://your-elb-dns-address/"

Các nhật ký trên máy chủ nginx của bạn sau đó sẽ hiển thị 1.2.3.4 dưới dạng IP thực, là một IP giả mạo. Xem Phạm vi IP cho IP riêng của Amazon ELB để có câu trả lời tốt hơn.


3
Đây chỉ là vấn đề nếu bạn đặt real_ip_recursive , đây không phải là mặc định và thậm chí không tồn tại khi tôi trả lời câu hỏi ban đầu.
kolbyjack

3

Các realip_module bang rằng trong trường hợp của X-Forwarded-For, module này sử dụng địa chỉ ip cuối cùng trong X-Forwarded-For tiêu đề để thay thế. Mô-đun này sẽ không hoạt động khi chỉ real_ip_headerset_real_ip_formđược thiết lập. Điều này là do mô-đun này sẽ sử dụng địa chỉ IP proxy thay vì IP của máy khách. Để giải quyết real_ip_recursivechỉ thị này nên được kích hoạt.

Hơn nữa, nếu bạn có chứng chỉ SSL được triển khai và gia hạn trên ví dụ (như chứng chỉ letencrypt hoặc certbot). Các cơ quan cấp chứng chỉ có thể cố gắng xác nhận các chứng chỉ đó qua IPV6.

Vì vậy, điều quan trọng là cũng có IPV6. Vì vậy, tệp cấu hình Nginx cũng nên chứa địa chỉ set_real_ip_from IPV6.

real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from <your VPC IPV4 CIDR here>;
set_real_ip_from <your VPC IPV6 CIDR here>;

nếu áp dụng các quy tắc bảo mật bổ sung, chúng tôi cũng có thể cần bao gồm set_real_ip_fromVPC CIDR (cả IPV4 và IPV6) cho các mạng con đám mây / elb / ec2.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.