मेरा लक्ष्य केवल कुछ सार्वजनिक आईपी पते पर डॉकर कंटेनरों तक पहुंच को सीमित करना है । क्या मेरे लक्ष्य को पूरा करने के लिए एक सरल, दोहराने योग्य प्रक्रिया है? डॉकर के डिफ़ॉल्ट विकल्पों का उपयोग करते समय केवल आईपीटीबल्स की मूल बातें समझना, मुझे यह बहुत मुश्किल लग रहा है ।
मैं एक कंटेनर चलाना चाहता हूं, इसे सार्वजनिक इंटरनेट पर दृश्यमान बनाता हूं, लेकिन केवल चुनिंदा मेजबानों से कनेक्शन की अनुमति देता हूं । मैं अस्वीकार की एक डिफ़ॉल्ट इनपुट नीति निर्धारित करने की अपेक्षा करता हूं और फिर केवल अपने मेजबानों से कनेक्शन की अनुमति देता हूं । लेकिन डॉकर के एनएटी नियम और चेन रास्ते में आते हैं और मेरे इनपुट नियमों की अनदेखी की जाती है ।
क्या कोई इस बात का उदाहरण दे सकता है कि निम्नलिखित मान्यताओं को देखते हुए मेरे लक्ष्य को कैसे पूरा किया जाए?
होस्ट सार्वजनिक आईपी 80.80.80.80 एथ0 पर
होस्ट निजी आईपी 192.168.1.10 एथ 1 पर
docker run -d -p 3306:3306 mysql
होस्ट 3306 को छोड़कर होस्ट 4.4.4.4 और 8.8.8.8 को छोड़कर सभी कनेक्शन को ब्लॉक करें
मुझे कंटेनर को केवल स्थानीय आईपी पते पर बांधने में खुशी हो रही है, लेकिन आईपीटेबल्स अग्रेषण नियमों को ठीक से स्थापित करने के निर्देशों की आवश्यकता होगी जो डॉकर प्रक्रिया और होस्ट पुनरारंभ से बचते हैं ।
डॉकर के फ़ायरवॉल नियमों के साथ काम करते समय दो बातों का ध्यान रखें:
अपने नियमों को डॉकर द्वारा क्लॉबर्ड किए जाने से बचने के लिए, इसका उपयोग करें DOCKER-USER चेन
डॉकर पोर्ट-मैपिंग करता है PREROUTING की चेन nat टेबल। यह पहले होता है filter नियम, इसलिए --dest और --dport कंटेनर का आंतरिक आईपी और पोर्ट देखेंगे। मूल गंतव्य तक पहुँचने के लिए, आप उपयोग कर सकते हैं -m conntrack --ctorigdstport.
उदाहरण के लिए:
iptables -A DOCKER-USER -i eth0 -s 8.8.8.8 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j ACCEPTiptables -A DOCKER-USER -i eth0 -s 4.4.4.4 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j ACCEPTiptables -A DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j DROP
नोट: बिना --ctdir ORIGINAL, यह कंटेनर से पोर्ट 3306 पर किसी अन्य सर्वर पर कनेक्शन के लिए वापस आने वाले उत्तर पैकेट से भी मेल खाएगा, जो लगभग निश्चित रूप से वह नहीं है जो आप चाहते हैं! आपको इसकी सख्त जरूरत नहीं है अगर मेरी तरह आपका पहला नियम है -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT, क्योंकि यह सभी उत्तर पैकेटों से निपटेगा, लेकिन अभी भी इसका उपयोग करना सुरक्षित होगा --ctdir ORIGINAL वैसे भी ।
चेन डॉकर के विपरीत यह कंटेनर बनाने/शुरू करने पर रीसेट नहीं होता है । तो आप डॉकर स्थापित करने और कंटेनर शुरू करने से पहले भी सर्वर को प्रावधान करने के लिए इन पंक्तियों को अपने आईपीटेबल्स कॉन्फ़िगरेशन/स्क्रिप्ट में जोड़ सकते हैं:
अब माईएसक्यूएल के लिए बंदरगाह बाहरी पहुंच (एथ0) से अवरुद्ध है, यहां तक कि सोचा कि डॉकर दुनिया के लिए बंदरगाह खोलता है । (ये नियम मानते हैं, आपका बाहरी इंटरफ़ेस एथ0 है । )
आखिरकार, आपको आईपीटीबल्स को साफ करना होगा, पहले डॉकर सेवा को पुनरारंभ करें, अगर आपने इसे पोर्ट को लॉक करने की कोशिश में बहुत गड़बड़ कर दिया है जैसा मैंने किया था ।
मैंने एक डॉकर छवि बनाई है जो इस विधि का उपयोग आपके लिए आईपीटीबल्स को स्वचालित रूप से प्रबंधित करने के लिए करती है, या तो पर्यावरण चर या गतिशील रूप से आदि (या दोनों)के साथ:
डॉकर के फॉरवर्ड नियम डिफ़ॉल्ट रूप से सभी बाहरी स्रोत आईपी की अनुमति देते हैं । कंटेनरों तक पहुंचने के लिए केवल एक विशिष्ट आईपी या नेटवर्क की अनुमति देने के लिए, डॉकर फ़िल्टर श्रृंखला के शीर्ष पर एक नकारात्मक नियम डालें । उदाहरण के लिए, बाहरी पहुंच को प्रतिबंधित करने के लिए जैसे कि केवल स्रोत आईपी 8.8.8.8 कंटेनरों तक पहुंच सकता है, निम्नलिखित नियम जोड़ा जा सकता है: iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP