خطوات للحد من الاتصالات الخارجية لحاوية عامل الميناء مع إيبتبلس?

هدفي هو الحد من الوصول إلى حاويات عامل الميناء إلى عدد قليل من عناوين إب العامة. هل هناك بسيط, عملية قابلة للتكرار لتحقيق هدفي? فهم فقط أساسيات إيبتبلس أثناء استخدام الخيارات الافتراضية عامل الميناء ، وأنا أجد أنه من الصعب جدا.

أرغب في تشغيل حاوية ، وجعلها مرئية للإنترنت العام ، ولكن لا تسمح إلا بالاتصالات من مضيفين محددين. أتوقع تعيين سياسة إدخال افتراضية للرفض ثم السماح بالاتصالات من مضيفي فقط. ولكن قواعد نات دوكر وسلاسل في الحصول على الطريق ويتم تجاهل قواعد الإدخال بلدي.

يمكن للشخص أن يقدم مثالا على كيفية تحقيق هدفي بالنظر إلى الافتراضات التالية?

  • استضافة الملكية الفكرية العامة 80.80.80.80 على إيث0
  • استضافة الملكية الفكرية الخاصة 192.168.1.10 على إيث1
  • docker run -d -p 3306:3306 mysql
  • حظر كل الاتصال بالمضيف / الحاوية 3306 باستثناء المضيفين 4.4.4.4 و 8.8.8.8

أنا سعيد لربط الحاوية إلى عنوان إب المحلي فقط ولكن سوف تحتاج إلى تعليمات حول كيفية إعداد قواعد إعادة توجيه إيبتبلس بشكل صحيح التي البقاء على قيد الحياة عملية عامل الميناء وإعادة تشغيل المضيف.

شكراً!

شيئان يجب وضعهما في الاعتبار عند العمل مع قواعد جدار حماية عامل الميناء:

  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 ACCEPTiptables -A DOCKER-USER -i eth0 -s 4.4.4.4 -p tcp -m conntrack --ctorigdstport 3306 --ctdir ORIGINAL -j ACCEPTiptables -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 على أي حال.

مع عامل الميناء ضد 17.06 هناك سلسلة إيبتبلس جديدة تسمى عامل الميناء المستخدم. هذا هو واحد للقواعد المخصصة الخاصة بك: https://docs.docker.com/network/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

الآن يتم حظر ميناء الخلية من الوصول الخارجي (إيث0) حتى يعتقد عامل الميناء يفتح المنفذ للعالم. (تفترض هذه القواعد ، واجهة خارجية الخاص بك هو إيث0.)

في نهاية المطاف ، سيكون لديك لتنظيف إيبتبلس إعادة تشغيل خدمة عامل الميناء أولا ، إذا كنت افسدت ذلك كثيرا في محاولة لتأمين المنفذ كما فعلت.

تحديث: في حين أن هذه الإجابة لا تزال صالحة الجواب من قبل @ سيستيمبارادوكس باستخدام DOCKER-USER بالاشتراك مع --ctorigdstport هو أفضل.

هنا هو الحل الذي يستمر بشكل جيد بين إعادة التشغيل ويسمح لك بالتأثير على مكشوف ميناء بدلا من الداخلية ميناء.

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

لقد بنيت صورة عامل الميناء الذي يستخدم هذه الطريقة لإدارة تلقائيا إيبتبلس بالنسبة لك ، وذلك باستخدام إما متغيرات البيئة أو حيوي مع الخ (أو كليهما):

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

تحديث: في حين صالحة في عام 2015 ، وهذا الحل لم يعد الطريق الصحيح للقيام بذلك.

يبدو أن الجواب في وثائق عامل الميناء في https://docs.docker.com/articles/networking/#the-world

تسمح قواعد إعادة توجيه عامل الإرساء بجميع عناوين البرامج المتكاملة للمصدر الخارجي بشكل افتراضي. للسماح فقط إب أو شبكة محددة للوصول إلى الحاويات ، إدراج قاعدة نفي في الجزء العلوي من سلسلة تصفية عامل الميناء. على سبيل المثال ، لتقييد الوصول الخارجي بحيث المصدر الوحيد إب 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 ACCEPTiptables -I DOCKER -i eth0 -s 4.4.4.4 -p tcp --dport 3306 -j ACCEPTiptables -I DOCKER 3 -i eth0 -p tcp --dport 3306 -j DROP

لم ألمس --iptables أو --icc خيارات.