ডকারের ধারক থেকে হোস্টের ব্যক্তিগত ইন্টারফেস (আইপি) অ্যাক্সেস করতে আমার সমস্যা হয়। আমি মোটামুটি নিশ্চিত যে এটি আমার Iptables নিয়মের সাথে সম্পর্কিত (বা সম্ভবত রাউটিং)। আমি যখন --net=host
পতাকাটি যুক্ত করি তখন docker run
সমস্ত কিছুই প্রত্যাশার মতো কাজ করে। একইভাবে আমি যখন উল্লেখ করি যে ইনপুট নীতি উদারপন্থী অনুসরণ করছে -P INPUT ACCEPT
, জিনিসগুলিও আমার প্রত্যাশা মতো কাজ করে। তবে এগুলি অনাকাঙ্ক্ষিত এবং অনিরাপদ বিকল্পগুলি আমি এড়াতে চাই।
যেহেতু এটি আমার পরিষেবাদির সাথে সুনির্দিষ্ট নয় (ডিএনএস) আমি সমস্যা থেকে এটিকে বাদ দিয়েছি, যেহেতু অনুসন্ধানের ফলাফলগুলিতে শব্দের যোগ করে আলাদা (জনপ্রিয়) সমস্যা অঞ্চলে ডকারের ফলনের সাথে মিল রেখে এটি অনুসন্ধান করেছি।
এছাড়াও ডকারের পাত্রে লিঙ্ক করা একটি কার্যকর বিকল্প নয়, কারণ নির্দিষ্ট পাত্রে --net = হোস্ট বিকল্পের সাহায্যে চালানো দরকার, লিঙ্কিং প্রতিরোধ করে এবং আমি যেখানে সম্ভব সেখানে একটি সামঞ্জস্যপূর্ণ পরিস্থিতি তৈরি করতে চাই।
আমি নিম্নলিখিত Iptables নিয়ম আছে। আমি ধরে নিয়েছি কোরিওএস, ডিজিটাল মহাসাগর এবং ডকারের সংমিশ্রণ।
-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 forever
4: 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
আমার রেজোলভকনফ
$ cat /etc/resolv.conf
nameserver 10.129.112.210
nameserver 127.0.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4
এখানে বক্তব্যটি হোস্টে উপলভ্য স্থানীয় ডিএনএস পরিষেবাটি ব্যবহার করে (অন্য কোনও ডকার উদাহরণের মাধ্যমে) সর্বজনীন হোস্টগুলিকে অ্যাক্সেস না করে বরং অভ্যন্তরীণগুলি ব্যবহার করতে হবে।
এটি আরও চিত্রিত করার জন্য (আমার আসকি শিল্প নকশা দক্ষতা আমার iptables ফু ছাড়িয়ে গেছে, যাতে এই পর্যায়ে যথেষ্ট বলা উচিত):
______________________________________________
| __________________________ 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 কনফিগারেশন সন্ধান করেছি, পড়েছি এবং প্রয়োগ করেছি, তবে কী চলছে তা বুঝতে এবং এইভাবে পছন্দসই ফলাফল পেতে আমি আরও "উন্নত" Iptables নিয়মগুলি খুব কম জানি।
এর আউটপুট iptables -t nat -nL
:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
Chain DOCKER (2 references)
target prot opt source destination
এর আউটপুট cat /proc/sys/net/ipv4/ip_forward
:
1
$ cat /proc/sys/net/ipv4/ip_forward -> 1
এবং ব্যক্তিগত ইন্টারফেসে -A INPUT -i eth1 -j ACCEPT
সমস্ত সংযোগ গ্রহণ করে । আপনি কি নিয়ম অনুপস্থিত?
-A INPUT -i docker0 -j ACCEPT
iptables -t nat -nL
? আপনি কি কোনও প্যাকেট বিশ্লেষণ করেছেন, বলুন উত্স ধারক থেকে একটি পিং করুন এবং হোস্টে প্যাকেটগুলি ক্যাপচার করতে tcpdump ব্যবহার করুন।