आईपीटीबल्स के साथ डॉकर कंटेनर के बाहर कनेक्शन को सीमित करने के लिए कदम?

मेरा लक्ष्य केवल कुछ सार्वजनिक आईपी पते पर डॉकर कंटेनरों तक पहुंच को सीमित करना है । क्या मेरे लक्ष्य को पूरा करने के लिए एक सरल, दोहराने योग्य प्रक्रिया है? डॉकर के डिफ़ॉल्ट विकल्पों का उपयोग करते समय केवल आईपीटीबल्स की मूल बातें समझना, मुझे यह बहुत मुश्किल लग रहा है ।

मैं एक कंटेनर चलाना चाहता हूं, इसे सार्वजनिक इंटरनेट पर दृश्यमान बनाता हूं, लेकिन केवल चुनिंदा मेजबानों से कनेक्शन की अनुमति देता हूं । मैं अस्वीकार की एक डिफ़ॉल्ट इनपुट नीति निर्धारित करने की अपेक्षा करता हूं और फिर केवल अपने मेजबानों से कनेक्शन की अनुमति देता हूं । लेकिन डॉकर के एनएटी नियम और चेन रास्ते में आते हैं और मेरे इनपुट नियमों की अनदेखी की जाती है ।

क्या कोई इस बात का उदाहरण दे सकता है कि निम्नलिखित मान्यताओं को देखते हुए मेरे लक्ष्य को कैसे पूरा किया जाए?

  • होस्ट सार्वजनिक आईपी 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 को छोड़कर सभी कनेक्शन को ब्लॉक करें

मुझे कंटेनर को केवल स्थानीय आईपी पते पर बांधने में खुशी हो रही है, लेकिन आईपीटेबल्स अग्रेषण नियमों को ठीक से स्थापित करने के निर्देशों की आवश्यकता होगी जो डॉकर प्रक्रिया और होस्ट पुनरारंभ से बचते हैं ।

धन्यवाद!

डॉकर के फ़ायरवॉल नियमों के साथ काम करते समय दो बातों का ध्यान रखें:

  1. अपने नियमों को डॉकर द्वारा क्लॉबर्ड किए जाने से बचने के लिए, इसका उपयोग करें DOCKER-USER चेन
  2. डॉकर पोर्ट-मैपिंग करता है 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 वैसे भी ।

डॉकर वी. 17. 06 के साथ डॉकर-उपयोगकर्ता नामक एक नई आईपीटीबल्स श्रृंखला है । यह आपके कस्टम नियमों के लिए है: https://docs.docker.com/network/iptables/

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

-N DOCKER-N DOCKER-ISOLATION-N DOCKER-USER-A DOCKER-ISOLATION -j RETURN-A DOCKER-USER -i eth0 -p tcp -m tcp --dport 3306 -j DROP-A DOCKER-USER -j RETURN

अब माईएसक्यूएल के लिए बंदरगाह बाहरी पहुंच (एथ0) से अवरुद्ध है, यहां तक कि सोचा कि डॉकर दुनिया के लिए बंदरगाह खोलता है । (ये नियम मानते हैं, आपका बाहरी इंटरफ़ेस एथ0 है । )

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

अद्यतन करें: हालांकि यह उत्तर अभी भी @सिस्टमपैराडॉक्स द्वारा उत्तर मान्य है DOCKER-USER के साथ संयोजन में --ctorigdstport बेहतर है ।

यहां एक समाधान है जो पुनरारंभ के बीच अच्छी तरह से बना रहता है और आपको प्रभावित करने की अनुमति देता है उजागर बंदरगाह के बजाय आंतरिक बंदरगाह।

iptables -t mangle -N DOCKER-mysqliptables -t mangle -A DOCKER-mysql -s 22.33.44.144/32 -j RETURNiptables -t mangle -A DOCKER-mysql -s 22.33.44.233/32 -j RETURNiptables -t mangle -A DOCKER-mysql -j DROPiptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp --dport 3306 -j DOCKER-mysql

मैंने एक डॉकर छवि बनाई है जो इस विधि का उपयोग आपके लिए आईपीटीबल्स को स्वचालित रूप से प्रबंधित करने के लिए करती है, या तो पर्यावरण चर या गतिशील रूप से आदि (या दोनों)के साथ:

https://hub.docker.com/r/colinmollenhour/confd-firewall/

अद्यतन करें: 2015 में मान्य होने पर, यह समाधान अब इसे करने का सही तरीका नहीं है ।

जवाब डॉकर के दस्तावेज में प्रतीत होता है https://docs.docker.com/articles/networking/#the-world

डॉकर के फॉरवर्ड नियम डिफ़ॉल्ट रूप से सभी बाहरी स्रोत आईपी की अनुमति देते हैं । कंटेनरों तक पहुंचने के लिए केवल एक विशिष्ट आईपी या नेटवर्क की अनुमति देने के लिए, डॉकर फ़िल्टर श्रृंखला के शीर्ष पर एक नकारात्मक नियम डालें । उदाहरण के लिए, बाहरी पहुंच को प्रतिबंधित करने के लिए जैसे कि केवल स्रोत आईपी 8.8.8.8 कंटेनरों तक पहुंच सकता है, निम्नलिखित नियम जोड़ा जा सकता है: iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP

मैं जो कर रहा था वह था:

iptables -I DOCKER -i eth0 -s 8.8.8.8 -p tcp --dport 3306 -j ACCEPTiptables -I DOCKER -i eth0 -s 4.4.4.4 -p tcp --dport 3306 -j ACCEPTiptables -I DOCKER 3 -i eth0 -p tcp --dport 3306 -j DROP

मैं स्पर्श नहीं किया --iptables या --icc विकल्प.