Iptables নিয়ম-সেট যাতে ডকার কনটেইনার একটি হোস্ট আইপিতে কোনও পরিষেবা অ্যাক্সেস করতে পারে


18

ডকারের ধারক থেকে হোস্টের ব্যক্তিগত ইন্টারফেস (আইপি) অ্যাক্সেস করতে আমার সমস্যা হয়। আমি মোটামুটি নিশ্চিত যে এটি আমার 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

আপনি কি আউটপুট পোস্ট করতে পারেন iptables -t nat -nL? আপনি কি কোনও প্যাকেট বিশ্লেষণ করেছেন, বলুন উত্স ধারক থেকে একটি পিং করুন এবং হোস্টে প্যাকেটগুলি ক্যাপচার করতে tcpdump ব্যবহার করুন।
ড্যানিয়েল টি।

অবশ্যই, এখন পর্যন্ত সাহায্য করার জন্য ধন্যবাদ: পেস্টবিন.com / টিএটি 73৩nk (মন্তব্যটি মাপসই করা হয়নি ..) - সম্পাদনা করুন -> কোনও পেস্টবিনের লিঙ্কটি আপডেট হয়নি যা শেষ হয় না।
ডায়নম

সম্ভবত আমি আপনার সমস্যাটি সঠিকভাবে বুঝতে পারি নি, তবে হোস্টে ডিএনএস কোয়েরিগুলির অনুমতি দেওয়ার কোনও নিয়ম দেখছি না। এছাড়াও, ip_forward সক্ষম করা আছে?
লরেন্টিয় রোয়েসকি

হাই @ লরেন্টিওরোস্কু $ cat /proc/sys/net/ipv4/ip_forward -> 1এবং ব্যক্তিগত ইন্টারফেসে -A INPUT -i eth1 -j ACCEPTসমস্ত সংযোগ গ্রহণ করে । আপনি কি নিয়ম অনুপস্থিত?
ডায়নম

2
আমি মনে করি ধারক থেকে প্যাকেটগুলি ডথার 0 ইন্টারফেস থেকে আসে, এথ 1 নয়। চেষ্টা করুন-A INPUT -i docker0 -j ACCEPT
লরেন্টিয় রোয়েসকি

উত্তর:


14

কনটেইনার docker0ইন্টারফেস ব্যবহার করে হোস্টের সাথে যোগাযোগ করে । ধারক থেকে ট্র্যাফিক যোগ করতে যোগ করুন:

-A INPUT -i docker0 -j ACCEPT

2
ডায়নম, আপনি এটি থেকে দূরে নিতে চান এমন পাঠটি হ'ল উদাহরণস্বরূপ আপনার সমস্ত অস্বীকৃতি লগইন করা দরকারী iptables -A INPUT -j LOGIN=docker0কোন নিয়ম টুইঙ্ক দরকার ছিল তা কার্যকর করার জন্য স্ট্যাম্পটি খুব কার্যকর হত। লরেন্টিয়ুর কাজ থেকে দূরে সরে যাবেন না, যা দুর্দান্ত ছিল - আমার কাছ থেকে +1!
ম্যাথহ্যাটার

5
ইউএফডাব্লু ব্যবহার করে এমন লোকেদের জন্য, আমি ডকারের পাত্রে সমস্ত যোগাযোগ হোস্ট করার অনুমতি দেওয়ার জন্য এখানে যা করেছি: ইউফডব্লিউ ডকারে প্রবেশের অনুমতি দেয়
আলি ওকে

0

আমি খুব অনুরূপ পরিস্থিতির মুখোমুখি হয়েছি তবে -A INPUT -i docker0 -j ACCEPTডকার হোস্টের আমার E00 ইন্টারফেসের সমস্ত পাত্রে কনটেইনারগুলিতে যুক্ত করার ফলে যা আমার উদ্দেশ্য তা নয়।

এবং যেহেতু আমি লক্ষ্য করেছি যে আমার ধারকটি কেবল হোস্ট নেটওয়ার্ক থেকে পুরোপুরি বন্ধ হওয়ার পরিবর্তে ইন্টারফেস হোস্ট করার জন্য কেবলমাত্র পোর্ট 22 বলে সীমিত অ্যাক্সেস পেয়েছে, তাই আমি আমার iptables বিধিগুলি পর্যালোচনা করেছি এবং IN_public_allow চেইনে একটি নিয়ম পেয়েছি যা এর জন্য দায়ী হতে পারে। নিয়মটি হ'ল -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT। সুতরাং আমি আমার ধারকটিকে পছন্দসই অন্যান্য হোস্ট পোর্টগুলি অ্যাক্সেস করার অনুমতি দেওয়ার জন্য অনুরূপ নিয়ম যুক্ত করেছি, যা আমি মনে করি যে ধারকগুলিতে হোস্ট নেটওয়ার্ক অ্যাক্সেস খোলার জন্য আরও কিছুটা সুনির্দিষ্ট উপায় হতে পারে।


-i docker0এটি নিশ্চিত করা উচিত যে এটি ট্রাফিককে প্রভাবিত করবে না যা ডকার0 নেটওয়ার্কের মাধ্যমে না আসে। আপনার ব্যাকরণ যদিও অস্পষ্ট। সম্ভবত আপনি বলেছিলেন যে E00 এর মাধ্যমে ডকার হোস্টগুলি থেকে আউটগোয়িং অ্যাক্সেস সক্ষম হয়েছে, যা সত্য হতে পারে। আমি সম্মত হই যে আরও লক্ষ্যবস্তু নিয়মগুলি কেবল আপনার প্রয়োজন অনুসারে খোলার সম্ভব opening
এমসি 0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.