Nginx set_real_ip_from AWS ELB लोड बैलेंसर एड्रेस


22

मेरे पास अमेज़ॅन ईएलबी लोड बैलेंसर के पीछे नगिनक्स सर्वर का एक सेट है। मैं set_real_ip उपयोग कर रहा हूँ (से HttpRealIpModule ) ताकि मैं इन सर्वर पर प्रारंभिक ग्राहक आईपी पते का उपयोग कर सकते (में php-एफ पी एम के लिए और उपयोग के लिए के माध्यम से पारित करने के लिए HttpGeoIPModule )।

ऐसा लगता है कि set_real_ip_fromनेगनेक्स कॉन्फ़िगरेशन में केवल एक आईपी पते को स्वीकार कर सकता है। हालांकि, ईएलबी मशीनों के संबंध में अमेज़न का कहना है:

नोट: क्योंकि एक लोडबॉलर के साथ जुड़े आईपी पते का सेट समय के साथ बदल सकता है, इसलिए आपको कभी भी किसी विशिष्ट आईपी पते के साथ "ए" रिकॉर्ड नहीं बनाना चाहिए। यदि आप Elastic Load Balancing सेवा द्वारा उत्पन्न नाम के बजाय अपने LoadBalancer के लिए एक अनुकूल DNS नाम का उपयोग करना चाहते हैं, तो आपको LoadBalancer DNS नाम के लिए CNAME रिकॉर्ड बनाना चाहिए, या होस्टेड ज़ोन बनाने के लिए Amazon मार्ग 53 का उपयोग करना चाहिए। अधिक जानकारी के लिए, लोचदार लोड संतुलन के साथ डोमेन नाम का उपयोग करना देखें

लेकिन अगर मुझे एक IP पता इनपुट करने की आवश्यकता है तो मैं CNAME (या तो amazon या मेरे अपने) का उपयोग नहीं कर सकता। क्या इस समस्या का कोई समाधान है?

जवाबों:


40

यदि आप गारंटी दे सकते हैं कि सभी अनुरोध ईएलबी से आ रहे हैं (मैं इससे परिचित नहीं हूँ), आप कोशिश कर सकते हैं:

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

किसी से एक्स-फॉरवर्ड-फॉर हेडर पर भरोसा करने के लिए नगनेक्स को बताना चाहिए। नकारात्मक पक्ष यह है कि अगर कोई भी सीधे आपके सर्वर तक पहुंचता है, तो वे एक्स-फॉरवर्ड-फॉर हेडर को स्पूफ करने में सक्षम होंगे और नग्नेक्स गलत क्लाइंट आईपी पते का उपयोग करेंगे।


2
धन्यवाद - मुझे नहीं पता था कि मैं वहां एक आईपी रेंज जोड़ सकता हूं ... मैं जांच करूंगा कि क्या कोई और विशिष्ट रेंज है जो ईएलबी पर हो सकती है (मुझे लगता है 10.0.0.1/8कि काम करेगा हालांकि कुछ और विशिष्ट हो सकता है)
vitch

मैंने यह पता लगाने के लिए एक अनुवर्ती प्रश्न जोड़ा कि क्या किसी को मान्य सीमा पता है: serverfault.com/questions/331697/…
vitch

यदि यह एक VPC ALB है, तो आपकी सीमा (s) आपकी सबनेट पर्वतमाला के समान है, जिसमें LB एक भाग है।
टेलोनक्स

17

आज का सबसे अच्छा अभ्यास वीपीसी का उपयोग करना है, इसलिए, आपको अपने ईएलबी के लिए सटीक सीआईडीआर पता होगा। फिर, आप अपनी Nginx कॉन्फ़िगरेशन फ़ाइल में कुछ इस तरह जोड़ सकते हैं:

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

यह देखकर कि यह सवाल 2011 से है कि यह विकल्प तब उपलब्ध नहीं था। मैं सिर्फ सभी संभव निजी नेटवर्क को शामिल करता हूं क्योंकि बाहरी उपयोगकर्ता उन्हें आसानी से प्राप्त नहीं करेंगे।
जॉर्डन रीटर

7

VPC CIDR का उपयोग करें क्योंकि set_real_ip_fromआप इसे VPC => आपकी VPC ( <your VPC CIDR here>इसके साथ बदलें ) के तहत अमेज़न कंसोल में पा सकते हैं :

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

4

अमेज़ॅन ईएलबी पर विश्वसनीय रेंज 0.0.0.0/0 पर सेट करना निश्चित रूप से आपको परेशानी में डालने वाला है। यदि आप अपने nginx सर्वर के लिए सुरक्षा समूह को कॉन्फ़िगर कर सकते हैं, तो आप यह गारंटी दे सकते हैं कि ELB से अनुरोध आता है, लेकिन मूल अनुरोध किसी भी संभावित स्रोत से उत्पन्न होगा (Amazon ELBs सार्वजनिक इंटरफेस हैं)।

एक साधारण परीक्षण से यह पता चलेगा:

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

आपके nginx सर्वर पर लॉग फिर वास्तविक आईपी के रूप में 1.2.3.4 दिखाएगा, जो एक स्पूफ है। बेहतर जवाब के लिए अमेज़न ईएलबी के आंतरिक निजी आईपी के लिए आईपी रेंज देखें ।


3
यह केवल एक मुद्दा होगा यदि आप वास्तविक_ip_recursive सेट करते हैं, जो डिफ़ॉल्ट नहीं है, और तब भी मौजूद नहीं था जब मैंने मूल रूप से प्रश्न का उत्तर दिया था।
kolbyjack

3

Realip_module कहा गया है कि एक्स-Forwarded-For के मामले में, इस मॉड्यूल में पिछले आईपी पते का उपयोग करता X-Forwarded-के लिए बदलने के लिए शीर्ष लेख। यह मॉड्यूल तब काम नहीं करेगा जब केवल real_ip_headerऔर set_real_ip_formसेट हो। ऐसा इसलिए है क्योंकि यह मॉड्यूल क्लाइंट आईपी के बजाय प्रॉक्सी आईपी एड्रेस का उपयोग करेगा। इस real_ip_recursiveनिर्देश को हल करने के लिए सक्षम होना चाहिए।

इसके अलावा, यदि आपके पास एसएसएल प्रमाण पत्र हैं, जो इंस्टेंस और उदाहरण पर (जैसे कि Letencrypt या सर्टिफिकेट सर्टिफिकेट कहते हैं) पर तैनात और नवीनीकृत किए जाते हैं। ये प्रमाणपत्र अधिकारी IPV6 के माध्यम से उन प्रमाणपत्रों को मान्य करने का प्रयास कर सकते हैं।

इसलिए IPV6 होना भी जरूरी है। इसलिए Nginx config फाइल में 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>;

यदि अतिरिक्त सुरक्षा प्रतिसाद लागू होते हैं, तो हमें set_real_ip_fromक्लाउडफ्रंट / एल्ब / एक् 2 सबनेट के लिए VPC CIDR (IPV4 और IPV6 दोनों) को भी शामिल करना पड़ सकता है।

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