मुझे डॉकर कंटेनर से होस्ट प्राइवेट इंटरफेस (आईपी) तक पहुंचने में परेशानी होती है । मुझे पूरा यकीन है कि यह मेरे आईपीटीबल्स नियमों (या शायद रूटिंग) से संबंधित है । जब मैं जोड़ता हूं --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