Cách từ chối quyền truy cập vào các tài nguyên dựa trên các tiêu đề X-Forwarded-for


13

Tôi đang cố gắng hạn chế quyền truy cập vào các tài nguyên đằng sau Nginx dựa trên IP của máy khách được truyền trong các tiêu đề X-Forwarded-for. Nginx đang chạy trong một thùng chứa trên Cụm Kubernetes trên Nền tảng đám mây của Google và ips khách hàng thực sự chỉ được truyền trong tiêu đề x-chuyển tiếp-cho

Cho đến nay tôi đã quản lý để làm điều đó cho một IP duy nhất với mã sau:

set $allow false;
if ($http_x_forwarded_for ~* 123.233.233.123) {
    set $allow true;
}
if ($http_x_forward_for ~* 10.20.30.40) {
    set $allow false;
}
if ($allow = false) {
    return 403;
}

Nhưng làm thế nào tôi có thể làm điều đó cho toàn bộ phạm vi của IP? Chỉ định hàng trăm IP bằng tay không có ý nghĩa nhiều.

Mọi sự giúp đỡ đều được đánh giá cao

Câu trả lời:


11

Sử dụng mô-đun RealIP để tôn vinh giá trị của X-Forwarded-Fortiêu đề. Đặt set_real_ip_fromthành địa chỉ IP của proxy ngược (giá trị hiện tại của $remote_addr).

Ví dụ:

server {
    ...
    real_ip_header X-Forwarded-For;
    set_real_ip_from 10.1.2.3;
    ...
}

Bây giờ bạn có thể sử dụng $remote_addrallow/ denychỉ thị bằng địa chỉ IP thực của máy khách. Xem tài liệu này để biết thêm.


Vì vậy, tôi đã cố gắng sau đây vô ích, tôi có nhầm lẫn không? location / { real_ip_header X-Forwarded-For; set_real_ip_from 10.0.0.0/8; real_ip_recursive on; allow xxx.xxx.xxx.xxx;
p1hr

Sau khi xem các tài liệu Cân bằng tải của Google, tôi thấy như sau: X-Forwarded-For: <unverified IP(s)>, <immediate client IP>, <global forwarding rule external IP>, <proxies running in GCP> (requests only) Mục nhập <IP máy khách ngay lập tức là máy khách được kết nối trực tiếp với bộ cân bằng tải.
p1hr

1
Đối với điều này để làm việc, bạn cần phải xác định dãy địa chỉ cho <global forwarding rule external IP><proxies running in GCP>và thêm set_real_ip_frombáo cáo bao gồm tất cả trong số họ.
Richard Smith

<global forwarding rule external IP>là ip bên ngoài của dịch vụ của tôi, không có proxy nào khác trong GCP, trên nhật ký nginx của tôi, tôi thấy các yêu cầu ở định dạng sau [31/Jul/2017:20:05:46 +0000] "GET / HTTP/1.1" 403 169 "-" "curl/7.54.0" "aaa.aaa.aaa.aaa, bbb.bbb.bbb.bbb, ccc.ccc.ccc.ccc"trong đó ccc.ccc.ccc.ccc là quy tắc chuyển tiếp toàn cầu, bbb.bbb.bbb.bbb ip - khớp với những gì tôi thấy trong whatsmyip.org. Bất kỳ cơ hội bạn có thể tư vấn làm thế nào để trích xuất phần đó?
p1hr

1
Ok, bây giờ tôi đang bối rối. Bạn cần set_real_ip_fromcho tất cả các địa chỉ ở bên phải của địa chỉ bạn muốn cho phép / từ chối. Như đã nêu trong real_ip_recursivephần.
Richard Smith

5

Câu trả lời của Richard đã chứa thông tin về cách nhận địa chỉ IP thực sự tốt nhất đến nginx.

Trong khi đó, câu hỏi về việc chỉ định phạm vi IP, bạn có thể sử dụng http://nginx.org/en/docs/http/ngx_http_geo_module.html .

Các geotác phẩm mô-đun như mapmô-đun, có nghĩa là, một biến được các giá trị được gán tùy thuộc vào giá trị của địa chỉ IP.

Một ví dụ:

geo $allow {
    default 0;
    192.168.168.0/24 1;
}

server {
    real_ip_header X-Forwarded-For;
    set_real_ip_from 10.1.2.3;

    if ($allow = 0) {
        return 403;
    }
}

Ở đây chúng tôi chỉ định geobản đồ, trong đó giá trị mặc định $allowlà 0. Nếu địa chỉ IP nằm trong mạng con 192.168.168.0/24, thì $allowsẽ nhận được giá trị 1 và yêu cầu được cho phép.

Bạn có thể có nhiều dòng trong geokhối như bạn cần để xác định dải IP của mình.


Cảm ơn bạn! điều đó dường như hoạt động rất tốt, điều cuối cùng tôi phải đối mặt là client_ip từ X-Forwarded-for. Hiện tại, từ 3 địa chỉ IP được thông qua, địa chỉ cuối cùng được sử dụng. Tôi đã thêm vào real_ip_recursive on;bên dưới set_real_ip_fromnhưng nó không tạo ra sự khác biệt nào
p1hr

Bạn có nghĩa là X-Forwarded-Fortiêu đề của bạn có ba địa chỉ riêng biệt, nghĩa là yêu cầu đến thông qua nhiều proxy? Bạn có bất kỳ tiêu đề nào khác ở đó mà bạn có thể sử dụng, chỉ chứa IP khách hàng không?
Tero Kilkanen

Mỗi proxy trong chuỗi sẽ nối địa chỉ IP của nó vào X-Forwarded-Fortiêu đề. Ngoài việc thêm real_ip_recursive onbạn cũng cần thêm set_real_ip_fromchỉ thị cho từng địa chỉ IP máy chủ đáng tin cậy trong chuỗi proxy của bạn. Nginx sau đó sẽ làm việc thông qua từng chỉ thị này và trả lại IP của máy khách làm giá trị đầu tiên mà nó đạt được trong X-Forwarded-Fortiêu đề không khớp với bất kỳ set_real_ip_fromgiá trị nào được chỉ định của bạn
miknik

FWIW, sự kết hợp này không hoạt động với tôi với AWS ALB. Điều gì đã làm việc là sử dụng chỉ thị proxy bên trong khối địa lý, với cùng một ip là set_real_ip - nginx.org/en/docs/http/ngx_http_geo_module.html
Talonx

3

Có những cái này làm việc cho tôi.

geo $remote_addr $giveaccess {
      proxy 172.0.0.0/8; <-- Private IP range here
      default 0;
      11.22.33.44 1; <-- Allowed IP here
    }


server{
##
    location ^~ /secure_url_here {
        if ($giveaccess = 0){
          return 403; 
        }
        try_files $uri $uri/ /index.php?$args; <-- Add this line specific for your CMS, if required.
    }

Tham chiếu: http://nginx.org/en/docs/http/ngx_http_geo_module.html

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.