आईपीटीबल्स नियम-सेट ताकि एक डॉकर कंटेनर होस्ट आईपी पर एक सेवा तक पहुंच सके

मुझे डॉकर कंटेनर से होस्ट प्राइवेट इंटरफेस (आईपी) तक पहुंचने में परेशानी होती है । मुझे पूरा यकीन है कि यह मेरे आईपीटीबल्स नियमों (या शायद रूटिंग) से संबंधित है । जब मैं जोड़ता हूं --net=host ध्वज को docker run, सब कुछ उम्मीद के मुताबिक काम करता है । इसी तरह जब मैं निर्दिष्ट करता हूं कि इनपुट नीति एक उदार का अनुसरण कर रही है -P INPUT ACCEPT, चीजें भी काम करती हैं जैसा कि मैं उम्मीद करूंगा । हालांकि ये अवांछनीय और असुरक्षित विकल्प हैं जिनसे मैं बचना चाहता हूं ।

चूंकि यह मेरी सेवाओं (डीएनएस) के लिए विशिष्ट नहीं है, इसलिए मैंने इसे समस्या से बाहर रखा है, क्योंकि एक अलग (लोकप्रिय) समस्या क्षेत्र में डॉकर पैदावार के साथ संयोजन में खोज करने के बाद, खोज परिणामों में शोर जोड़ना ।

डॉकर कंटेनरों को जोड़ना भी एक व्यवहार्य विकल्प नहीं है, क्योंकि कुछ कंटेनरों को --नेट=होस्ट विकल्प के साथ चलाने की आवश्यकता होती है, लिंकिंग को रोकना और मैं जहां संभव हो एक सुसंगत स्थिति बनाना चाहता हूं ।

मेरे पास निम्नलिखित आईपीटीबल्स नियम हैं । कोरओएस, डिजिटल महासागर और डॉकर का एक संयोजन मुझे लगता है ।

-P INPUT DROP-P FORWARD ACCEPT-P OUTPUT ACCEPT-N DOCKER-A INPUT -i lo -j ACCEPT-A INPUT -i eth1 -j ACCEPT-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT-A FORWARD -o docker0 -j DOCKER-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT-A FORWARD -i docker0 ! -o docker0 -j ACCEPT-A FORWARD -i docker0 -o docker0 -j ACCEPT

मेरा (प्रासंगिक) होस्ट इंटरफेस:

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000    inet 10.129.112.210/16 brd 10.129.255.255 scope global eth1       valid_lft forever preferred_lft forever4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default    inet 172.17.42.1/16 scope global docker0       valid_lft forever preferred_lft forever

और मैं एक डॉकर कंटेनर चलाता हूं:

$ docker run --rm -it --dns=10.129.112.210 debian:jessie # Specifying the DNS is so that the public DNS servers aren't used.

इस बिंदु पर मैं 10.129.112.210:53 पर बाध्य स्थानीय सेवा का उपयोग करने में सक्षम होना चाहता हूं । ताकि निम्नलिखित को उत्तर देना चाहिए:

$ ping google.com^C$ ping user.skydns.local^C

जब मैं अपने होस्ट से एक ही कमांड चलाता हूं:

$ ping photo.skydns.localPING photo.skydns.local (10.129.112.206) 56(84) bytes of data.64 bytes from 10.129.112.206: icmp_seq=1 ttl=64 time=0.790 ms^C

मेरे resolv.conf

$ cat /etc/resolv.confnameserver 10.129.112.210nameserver 127.0.0.1nameserver 8.8.8.8nameserver 8.8.4.4

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

इसे और भी स्पष्ट करने के लिए (मेरे एएससीआईआई कला डिजाइन कौशल मेरे आईपीटीबल्स फू को पार करते हैं, इसलिए इस बिंदु पर पर्याप्त कहना चाहिए):

 ______________________________________________|  __________________________           Host   || |   Docker DNS container   |                 ||  ``````````````````````|```                  ||                        |                     ||     ,----------,---( private n. interface )  ||     |          |                             ||     |          |   ( public  n. interface )---|     |          |                             ||     |          |   ( loopbck n. interface )  ||     |          |                             ||     |          |                             ||     |        __|_______________________      ||     |       | Docker service container |     ||     |        ``````````````````````````      ||     |                                        ||     |                                        || [ Local host service using DNS. ]            ||                                              ||______________________________________________|  private (host) network interface: eth1 (10.129.0.0/16)  Docker network interface: docker0 (172.17.0.0/16)

मैंने अलग-अलग उदाहरण आईपीटीबल्स कॉन्फ़िगरेशन को खोजा, पढ़ा और लागू किया है, लेकिन मुझे पता है कि क्या चल रहा है और इस प्रकार वांछित परिणाम प्राप्त करने के लिए और अधिक "उन्नत" आईपीटीबल्स नियमों में से बहुत कम पता है ।

का आउटपुट iptables -t nat -nL:

Chain PREROUTING (policy ACCEPT)target     prot opt source               destinationDOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCALChain INPUT (policy ACCEPT)target     prot opt source               destinationChain OUTPUT (policy ACCEPT)target     prot opt source               destinationDOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCALChain POSTROUTING (policy ACCEPT)target     prot opt source               destinationMASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0Chain DOCKER (2 references)target     prot opt source               destination

का आउटपुट cat /proc/sys/net/ipv4/ip_forward:

1

कंटेनर मेजबान के साथ संचार करता है docker0 interface.To कंटेनर ऐड से ट्रैफ़िक की अनुमति दें:

-A INPUT -i docker0 -j ACCEPT

मुझे बहुत समान स्थिति का सामना करना पड़ा है लेकिन जोड़ना -A INPUT -i docker0 -j ACCEPT डॉकर होस्ट के मेरे एथ0 इंटरफ़ेस पर सभी एक्सेस को कंटेनरों में खोल देगा जो कि मेरे इरादे से बिल्कुल नहीं है ।

और जब से मैंने देखा कि मेरे कंटेनर में होस्ट नेटवर्क से पूरी तरह से बंद होने के बजाय होस्ट इंटरफ़ेस तक सीमित पहुंच(केवल पोर्ट 22) थी, मैंने अपने आईपीटीबल्स नियमों की समीक्षा की और श्रृंखला में एक नियम पाया जो इसके लिए जिम्मेदार होना चाहिए । नियम है -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT. इसलिए मैंने अपने कंटेनर को वांछित अन्य होस्ट पोर्ट तक पहुंचने की अनुमति देने के लिए समान नियम जोड़े, जो मुझे लगता है कि कंटेनरों में होस्ट नेटवर्क एक्सेस खोलने का थोड़ा अधिक सटीक तरीका हो सकता है ।

मुझे लगता है कि कंटेनर से पैकेट डॉकर0 इंटरफेस से आते हैं, न कि एथ1 से । कोशिश करें ’ - ए इनपुट-आई डॉकर0-जे स्वीकार करें`

निश्चित रूप से, अब तक मदद करने के लिए धन्यवाद: Chain PREROUTING (policy ACCEPT)target prot opt source desti - Pastebin.com (टिप्पणी फिट नहीं थी । .)- [संपादित करें] - > एक पेस्टबिन के लिंक को अपडेट किया जो समाप्त नहीं होता है ।

हो सकता है कि मुझे आपकी समस्या सही ढंग से समझ में न आए, लेकिन मुझे होस्ट पर डीएनएस प्रश्नों की अनुमति देने का कोई नियम नहीं दिख रहा है । इसके अलावा, आईपी_फॉरवर्ड सक्षम है?

हाय @LaurentiuRoescu. '$ कैट /प्रोक/एसवाईएस/नेट/आईपीवी 4 / आईपी_फॉरवर्ड - > 1 ’ और ’ - ए इनपुट-आई एथ1-जे स्वीकार` निजी इंटरफेस पर सभी कनेक्शन स्वीकार करता है । आप किन नियमों को याद कर रहे हैं?

मुझे लगता है कि आपने इसे @लॉरेंटियूरोस्कु को पकड़ा है । जब मैं आपकी लाइन जोड़ता हूं तो यह काम करने लगता है । मुझे कभी नहीं लगा कि यह कुछ ऐसा है जो तुच्छ है । . क्या आप इसे मेरे प्रश्न के उत्तर के रूप में जोड़ सकते हैं? मैं आपके जवाब को पुरस्कृत करना चाहूंगा ।

क्या आप आईपीटेबल्स-टी नेट-एनएलका आउटपुट पोस्ट कर सकते हैं? क्या आपने कोई पैकेट विश्लेषण किया है, कहें कि स्रोत कंटेनर से पिंग करें और मेजबान पर पैकेट कैप्चर करने के लिए टीसीपीडम्प का उपयोग करें ।