एक्स-फॉरवर्ड किए गए हेडर के आधार पर संसाधनों तक पहुंच से कैसे इनकार करें


13

मैं X-फॉरवर्ड किए गए हेडर में पारित क्लाइंट IP के आधार पर Nginx के पीछे संसाधनों तक पहुंच को प्रतिबंधित करने का प्रयास कर रहा हूं। नग्नेक्स Google क्लाउड प्लेटफ़ॉर्म पर कुबेरनेट्स क्लस्टर पर एक कंटेनर में चल रहा है और असली ग्राहक के टुकड़े केवल एक्स-फॉरवर्ड किए गए हेडर में पारित किए गए हैं

अब तक मैं इसे निम्नलिखित कोड के साथ एक आईपी के लिए करने में कामयाब रहा:

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;
}

लेकिन आईपी की पूरी रेंज के लिए मैं ऐसा कैसे कर सकता हूं? हाथ से सैकड़ों आईपी निर्दिष्ट करने का कोई मतलब नहीं है।

सभी मदद की सराहना की है

जवाबों:


11

X-Forwarded-Forशीर्ष लेख के मान को सम्मानित करने के लिए RealIP मॉड्यूल का उपयोग करें । सेट set_real_ip_fromरिवर्स प्रॉक्सी (के वर्तमान मूल्य का आईपी पता करने के लिए $remote_addr)।

उदाहरण के लिए:

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

अब आपको क्लाइंट के सही आईपी पते का उपयोग करने $remote_addrऔर allow/ denyनिर्देश देने में सक्षम होना चाहिए । इस दस्तावेज़ को और देखें ।


इसलिए मैंने बिना किसी लाभ के निम्नलिखित की कोशिश की, क्या मैं इसे भ्रमित कर रहा हूं? 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

Google लोड बैलेंसिंग डॉक्स को देखने के बाद, मैंने निम्नलिखित पाया: X-Forwarded-For: <unverified IP(s)>, <immediate client IP>, <global forwarding rule external IP>, <proxies running in GCP> (requests only) <तत्काल क्लाइंट IP> प्रविष्टि वह क्लाइंट है जो सीधे लोड बैलेंसर से जुड़ा है।
191 पर p1hr

1
इसके लिए काम करने के लिए, आपको उन सभी के लिए पता श्रेणियों की पहचान करनी होगी <global forwarding rule external IP>और उन सभी विवरणों को <proxies running in GCP>जोड़ना set_real_ip_fromहोगा।
रिचर्ड स्मिथ

<global forwarding rule external IP>मेरी सेवा का बाहरी आईपी है, GCP में कोई अन्य [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"समीपता नहीं है , मेरे nginx लॉग पर मैं निम्नलिखित प्रारूप में अनुरोध देखता हूं जहां ccc.ccc.ccc.ccc वैश्विक अग्रेषण नियम है, bbb.bbb.bbb.bbb तत्काल ग्राहक आईपी ​​- मैं whatsmyip.org में जो देखता हूं उससे मेल खाता है। कोई भी मौका आप सलाह दे सकते हैं कि उस हिस्से को कैसे निकाला जाए?
पृ। ११

1
ठीक है, अब मैं भ्रमित हो रहा हूं। आपको set_real_ip_fromउन सभी पतों की आवश्यकता है, जिन्हें आप अनुमति देना / अस्वीकार करना चाहते हैं। जैसा कि real_ip_recursiveअनुभाग में इंगित किया गया है ।
रिचर्ड स्मिथ

5

रिचर्ड के जवाब में पहले से ही इस बात की जानकारी थी कि नगीनक्स को वास्तविक आईपी पता कैसे सर्वोत्तम दिया जाए।

इस बीच, आईपी पर्वतमाला को निर्दिष्ट करने के सवाल पर क्या आता है, आप http://nginx.org/en/docs/http/ngx_http_geo_module.html का उपयोग कर सकते हैं ।

geoकी तरह काम करता है मॉड्यूल mapमॉड्यूल, यह है कि, एक चर आईपी पते के मूल्य के आधार सौंपा मूल्यों हो जाता है।

एक उदाहरण:

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;
    }
}

यहां हम geoमानचित्र निर्दिष्ट करते हैं , जहां के लिए डिफ़ॉल्ट मान $allow0. है। यदि आईपी पता सबनेट में है 192.168.168.0/24, तो $allowमान 1 प्राप्त होगा, और अनुरोध की अनुमति है।

आपके पास geoअपने IP रेंज को परिभाषित करने की आवश्यकता के रूप में ब्लॉक में कई लाइनें हो सकती हैं।


धन्यवाद! ऐसा लगता है कि वास्तव में अच्छी तरह से काम करने के लिए, आखिरी एक चीज जो मैं सामना कर रहा हूं वह है कि क्लाइंट_आईपी एक्स-फॉरवर्ड-फॉर से। फिलहाल, 3 आईपी पतों से जो अंतिम एक पास हैं, का उपयोग किया जाता है। मैंने real_ip_recursive on;नीचे जोड़ा है set_real_ip_fromलेकिन इससे कोई फर्क नहीं
पड़ा है

क्या आपका मतलब है कि आपके X-Forwarded-Forहेडर के तीन अलग-अलग पते हैं, अर्थात, अनुरोध कई प्रॉक्सी के माध्यम से आता है? क्या आपके पास कोई अन्य हेडर है जिसे आप उपयोग कर सकते हैं, जिसमें केवल क्लाइंट आईपी है?
तेरो किलकेनेन

श्रृंखला में प्रत्येक प्रॉक्सी X-Forwarded-Forहेडर को आईपी एड्रेस देगा । real_ip_recursive onआपको जोड़ने के अलावा set_real_ip_fromअपनी प्रॉक्सी श्रृंखला में प्रत्येक विश्वसनीय सर्वर आईपी पते के लिए निर्देश जोड़ने की भी आवश्यकता है । फिर नगीनेक्स इन निर्देशों में से प्रत्येक के माध्यम से काम करेगा और X-Forwarded-Forहेडर में हिट होने वाले पहले मूल्य के रूप में क्लाइंट आईपी को लौटाएगा जो आपके किसी भी निर्दिष्ट set_real_ip_fromमान से मेल नहीं खाता है
मिक्निक

FWIW, इस संयोजन ने मेरे लिए AWS ALB के साथ काम नहीं किया। जो काम किया था, वह जियो ब्लॉक के अंदर प्रॉक्सी निर्देश का उपयोग कर रहा था, जिसमें समान ip_ set_real_ip - nginx.org/en/docs/http/ngx_http_geo_module.html
talxx

3

मेरे लिए ये काम कर गया।

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.
    }

Ref: http://nginx.org/en/docs/http/ngx_http_geo_module.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.