Iptables সহ ডকার পাত্রে বাইরের সংযোগগুলি সীমাবদ্ধ করার জন্য পদক্ষেপগুলি?


20

আমার লক্ষ্য হ'ল ডকারের ধারকগুলিতে অ্যাক্সেস কেবলমাত্র কয়েকটি পাবলিক আইপি ঠিকানার মধ্যে সীমাবদ্ধ করা। আমার লক্ষ্যটি সম্পাদন করার জন্য কি কোনও সাধারণ, পুনরাবৃত্তিযোগ্য প্রক্রিয়া আছে? ডকারের ডিফল্ট বিকল্পগুলি ব্যবহার করার সময় কেবল iptables এর প্রাথমিক বিষয়গুলি বোঝা, আমি এটি খুব কঠিন খুঁজে পেয়েছি।

আমি একটি ধারক চালাতে চাই, এটি সর্বজনীন ইন্টারনেটের জন্য দৃশ্যমান করতে চাই, তবে কেবলমাত্র নির্বাচিত হোস্টের সংযোগের অনুমতি দিন। আমি প্রত্যাবর্তন করতে হবে একটি ডিফল্ট ইনপুট নীতি সেট করুন এবং তারপরে কেবল আমার হোস্ট থেকে সংযোগের অনুমতি দেব। তবে ডকারের NAT নিয়ম এবং চেইনগুলি পথে আসে এবং আমার ইনপুট বিধিকে উপেক্ষা করা হয়।

নিম্নলিখিত অনুমানের পরে কেউ কীভাবে আমার লক্ষ্য অর্জন করতে পারে তার উদাহরণ দিতে পারে?

  • Eth0 এ 80.80.80.80 সর্বজনীন আইপি হোস্ট করুন
  • এথ 1 তে ব্যক্তিগত আইপি 192.168.1.10 হোস্ট করুন
  • docker run -d -p 3306:3306 mysql
  • হোস্ট 4.4.4.4 এবং 8.8.8.8 ব্যতীত হোস্ট / ধারক 3306 এ সমস্ত সংযোগ অবরুদ্ধ করুন

আমি কেবল স্থানীয় আইপি ঠিকানায় ধারকটিকে বেঁধে আনতে পেরে খুশি তবে কীভাবে আইপটবেবল ফরওয়ার্ডিং বিধি সঠিকভাবে সেট আপ করতে হবে সে সম্পর্কে নির্দেশিকাগুলি দরকার যা ডকার প্রক্রিয়া এবং হোস্ট পুনরায় আরম্ভ হয়।

ধন্যবাদ!

উত্তর:


15

ডকারের ফায়ারওয়াল বিধি নিয়ে কাজ করার সময় দুটি বিষয় মনে রাখতে হবে:

  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 ACCEPT
iptables -A DOCKER-USER -i eth0 -s 4.4.4.4 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j ACCEPT
iptables -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যেভাবেই ব্যবহার করা নিরাপদ হবে ।


এটিতে কি এডিট করা উচিত --ctdir? আমি ব্যবহার করি-m conntrack --ctstate NEW --ctorigdstport 3306 --ctdir ORIGINAL
লোনিক্স

@ ইউনিক্স, হ্যাঁ এটি হওয়া উচিত, যদিও আমি কেবল এই কাজটি কেন আমাকে বিভ্রান্ত করছি তা নিয়ে কাজ করেছি। আমি কিছুটা ব্যাখ্যা যোগ করেছি।
সিস্টেমপারাডক্স

1
নোট করুন ডিফল্ট DOCKER-USERটেবিলটিতে এন্ট্রি রয়েছে: -A DOCKER-USER -j RETURNআপনি যদি ব্যবহার করেন তবে উপরের আগে চলবে -A। একটি সমাধান হ'ল বিপরীত ক্রমে মাথায় নিয়ম সন্নিবেশ করা -I
বিএমইচ

@ বিমিচ বা আরও ভাল এখনও , নতুন FILTERSচেইনে সমস্ত নিয়ম যুক্ত করুন এবং এতে -Iঝাঁপিয়ে পড়ার জন্য নতুন বিধিগুলি (যেমন আপনি বলেছেন) সন্নিবেশ করুন: -I INPUT -j FILTERSএবং-I DOCKER-USER -i eth0 -j FILTERS
লোনিক্স

@ বিমিচ যাইহোক, আমি কেবলমাত্র আমার সার্ভারটি পরীক্ষা করেছি, এবং ফেরতের নিয়মটি নেই, সম্ভবত সর্বশেষতম ডকার সংস্করণটি এটি আর প্রবেশ করে না? -Iনিরাপদ থাকার জন্য যদিও ব্যবহার করা ভাল ধারণা ।
লোনিক্স

8

ডকার ভি .১.0.০6 এর সাথে একটি নতুন iptables শৃঙ্খলা রয়েছে যা ডকার-ইউজার বলে। এটি একটি আপনার কাস্টম নিয়মের জন্য: https://docs.docker.com/network/iptables/

চেইন ডকারের মতো এটি বিল্ডিং / শুরু পাত্রে পুনরায় সেট করা হয় না। সুতরাং ডকার ইনস্টল করার আগে এবং কনটেইনারগুলি শুরু করার আগেও আপনি সার্ভারটি সরবরাহ করার জন্য আপনার 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

এখন মাইএসকিউএলের জন্য বন্দরটি বাহ্যিক অ্যাক্সেস (eth0) থেকে অবরুদ্ধ করা হয়েছে এমনকি ভেবেছিল ডকার বিশ্বের জন্য বন্দরটি খোলে। (এই নিয়মগুলি ধরে নেওয়া হয়, আপনার বাহ্যিক ইন্টারফেসটি হলথ0))

অবশেষে, আপনাকে iptables সাফ করতে হবে প্রথমে ডকার পরিষেবাটি পুনরায় চালু করতে হবে, যদি আপনি এটির মতো আমার মতো বন্দরে লক করার চেষ্টা করে খুব বেশি ঝামেলা করেন।


আমি মনে করি কেন এই ডকার-ইউএসএল টেবিলটি অন্য কোনও ব্যবহারকারী-যুক্ত টেবিলের চেয়ে আলাদা different এটিতে কোনও ফিল্টার প্রাক প্রয়োগ করা হয়নি তাই আপনাকে নিজের ইন্টারফেসের নামগুলি নিজেরাই নির্দিষ্ট করতে হবে। আপনি যদি একটি "আমার-চেইন" তৈরি করেন এবং এটি ফোরওয়ার্ড চেইনে প্রবেশ করান তবে এটির ফলাফল একই হবে, না?
কলিনম

হ্যাঁ, এটি একটি পার্থক্য করে, কারণ ডকার ফরওয়ার্ড চেইনে ডকার-ইউএসআই চেইনটি সন্নিবেশ করায়: -A FORWARD -j DOCKER-USER -A FORWARD -j DOCKER-ISOLATION সে কারণেই, কাস্টম নির্দেশাবলী ডকার চেইনের আগে কার্যকর করা হয়।
ck1

মনে রাখবেন যদি আপনি ব্যবহার --dportDocker-ইউজার ভিতরে এই মেলানো অভ্যন্তরীণ কন্টেইনার সেবা আইপি না উদ্ভাসিত বন্দর। এগুলি প্রায়শই মেলে তবে সর্বদা নয় এবং এটি সহজেই অন্যান্য পরিষেবাদির সাথে দ্বন্দ্ব করতে পারে তাই আমি এখনও যুক্তি দিচ্ছি যে এই ডকার-ব্যবহারকারীর সমাধানটি অর্ধ-বেকড।
কলিনম

4

আপডেট : 2015 সালে বৈধ থাকাকালীন, এই সমাধানটি আর এটি করার সঠিক উপায় নয়।

উত্তরটি ডকারের ডকুমেন্টেশনে https://docs.docker.com/articles/networking/# তে মনে হচ্ছে

ডকারের ফরোয়ার্ড বিধিগুলি সমস্ত বাহ্যিক উত্স আইপি ডিফল্টরূপে অনুমতি দেয়। কেবলমাত্র একটি নির্দিষ্ট আইপি বা নেটওয়ার্ককে পাত্রে অ্যাক্সেসের অনুমতি দেওয়ার জন্য, ডোকর ফিল্টার শৃঙ্খলার শীর্ষে একটি অবহেলিত নিয়ম .োকান। উদাহরণস্বরূপ, কেবলমাত্র সোর্স আইপি 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 ACCEPT
iptables -I DOCKER -i eth0 -s 4.4.4.4 -p tcp --dport 3306 -j ACCEPT
iptables -I DOCKER 3 -i eth0 -p tcp --dport 3306 -j DROP

আমি --iptablesবা --iccবিকল্পগুলি স্পর্শ করিনি ।


1
আপনি যদি করেন iptables -vnL DOCKERতবে গন্তব্য বন্দরগুলি সমস্ত ধারকগুলির মধ্যে থাকা সমস্ত বন্দর। যদি আমি এই অধিকারটি পাই, তার মানে উপরের নিয়মগুলি কেবল 3306পাত্রে থাকা বন্দরের উপরেই প্রভাব ফেলবে - অর্থাৎ আপনি যদি -p 12345:3306নিজের ধারকটিতে থাকেন তবে আপনার নিয়মটি এখনও অ্যাক্সেসটি লক করতে হবে যা (যেমন --dport 12345কাজ করবে না) would , কারণ ডকার চেইনের এসিসিপিটি বিধিগুলি ন্যাট-পরবর্তী।
সূর্যমুখী

এটি ঠিক, নিয়মগুলি কনটেইনারগুলির মধ্যে থাকা বন্দরগুলির সাথে সম্পর্কিত হতে হবে।
জিজিজিফোর্স

1
হুম, যদি আপনি একাধিক কনটেইনার ব্যবহার করেন যা বলুন, বিপরীত প্রক্সিং করার জন্য একটি অভ্যন্তরীণ এনজিআইএনএক্স (যেমন জ্যাববিক্স, একটি কাস্টম লোড ব্যালেন্সার ইত্যাদি) ব্যবহার করতে চান তবে এটি আপনার কন্টেন্টের আইপি আগেই জানা দরকার that's আমি এখনও সেই সমস্যার সমাধানের সন্ধান করছি যা এর প্রয়োজন হয় না --iptables=false, কারণ এটি তাদের সবার মধ্যে সবচেয়ে খারাপ পছন্দ বলে মনে হয়।
সূর্যমুখী

ধন্যবাদ! আপনি অনেক ঘন্টা অনুসন্ধানের পরে আমার সমস্যা সমাধান করেছেন। এখন আমি শেষ পর্যন্ত মাইএসকিউএলকে কেবলমাত্র আমার বাড়ির আইপি ঠিকানায় জেল করতে সক্ষম হয়েছি পুরো পৃথিবীর কাছে নরম আন্ডারবিলিটি প্রকাশ না করে।
ম্যাট কাভানাঘ

1
ডকার চেইনটি সরাসরি ব্যবহারকারীর দ্বারা চালিত হওয়ার কথা নয়! তার জন্য ডকার-USER চেইন ব্যবহার করুন। গৃহীত উত্তর চেক করুন।
পল-সেবাস্তিয়ান মানোলে

3

আপডেট: যদিও এই উত্তরটি এখনও কার্যকর হলেও @ সিস্টেমেপারাডক্সের উত্তরটির DOCKER-USERসাথে একত্রিত হয়ে --ctorigdstportআরও ভাল is

এখানে এমন একটি সমাধান রয়েছে যা পুনঃসূচনাগুলির মধ্যে ভালভাবে স্থির থাকে এবং আপনাকে অভ্যন্তরীণ পোর্টের পরিবর্তে উন্মুক্ত পোর্টকে প্রভাবিত করতে দেয় ।

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

আমি একটি ডকার ইমেজ তৈরি করেছি যা আপনার জন্য iptables স্বয়ংক্রিয়ভাবে পরিচালনার জন্য এই পদ্ধতিটি ব্যবহার করে, পরিবেশের ভেরিয়েবলগুলি ব্যবহার করে অথবা ডায়ামিকভাবে ইত্যাদি (অথবা উভয়) ব্যবহার করে:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.