لا اتصال الشبكة إلى / من حاوية عامل الميناء سي على سينتوس 8

لقد قمت للتو بتثبيت أحدث إصدار من docker-ce على سينتوس ، ولكن أنا لا يمكن الوصول إلى المنافذ المنشورة من خادم مجاور و لا يمكن الوصول إلى الخارج من الحاوية نفسها.

تشغيل الفانيليا عادي سينتوس 8 مع نيتوركماناجر و فيريولد تمكين. منطقة جدار الحماية الافتراضية هي public.

الإصدارات:

  • docker-ce 19.03.3 (رم عامل الميناء الرسمي)
  • containerd.io 1.2.6 (رم عامل الميناء الرسمي ل سينت أو إس 7-غير متوفر ل سينت أو إس 8 بعد)
  • سينت أو إس 8.0.1905 (تثبيت الحد الأدنى)

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

مع التركيز على الجدران النارية ، أدركت أن تعطيل firewalld يبدو أن تفعل خدعة ، ولكن أنا أفضل عدم القيام بذلك. أثناء فحص قواعد الشبكة باستخدام iptables، أدركت أن التحول إلى nftables يعني ذلك iptables هو الآن طبقة التجريد الذي يظهر سوى جزء صغير من nftables القواعد. وهذا يعني معظم-إن لم يكن كل-من firewalld سيتم تطبيق التكوين خارج نطاق iptables.

اعتدت أن أكون قادرا على العثور على الحقيقة كاملة في iptables، لذلك هذا سوف يستغرق بعض التعود.

قصة طويلة قصيرة-لكي ينجح هذا ، كان علي تمكين التنكر. بدا الأمر كما يلي dockerd فعلت هذا بالفعل من خلال iptables، ولكن يبدو أن هذا يحتاج إلى تمكين خصيصا لمنطقة جدار الحماية ل iptables يتنكر للعمل:

# Masquerading allows for docker ingress and egress (this is the juicy bit)firewall-cmd --zone=public --add-masquerade --permanent# Specifically allow incoming traffic on port 80/443 (nothing new here)firewall-cmd --zone=public --add-port=80/tcpfirewall-cmd --zone=public --add-port=443/tcp# Reload firewall to apply permanent rulesfirewall-cmd --reload

إعادة التشغيل أو إعادة التشغيل dockerd، ويجب أن يعمل كل من الدخول والخروج.

ما هو مفقود من الإجابات من قبل هو حقيقة أنك تحتاج أولا إلى إضافة واجهة عامل الإرساء إلى المنطقة التي تقوم بتكوينها ، على سبيل المثال عام (أو إضافته إلى المنطقة "الموثوقة" التي تم اقتراحها هنا ولكن أشك في أن من الحكمة ، من منظور أمني). لأنه افتراضيا لم يتم تعيينه إلى منطقة. تذكر أيضا لإعادة تحميل الخفي عامل الميناء عند الانتهاء.

# Check what interface docker is using, e.g. 'docker0'ip link show# Check available firewalld zones, e.g. 'public'sudo firewall-cmd --get-active-zones# Check what zone the docker interface it bound to, most likely 'no zone' yetsudo firewall-cmd --get-zone-of-interface=docker0# So add the 'docker0' interface to the 'public' zone. Changes will be visible only after firewalld reloadsudo nmcli connection modify docker0 connection.zone public# Masquerading allows for docker ingress and egress (this is the juicy bit)sudo firewall-cmd --zone=public --add-masquerade --permanent# Optional open required incomming ports (wasn't required in my tests)# sudo firewall-cmd --zone=public --add-port=443/tcp# Reload firewalldsudo firewall-cmd --reload# Reload dockerdsudo systemctl restart docker# Test ping and DNS works:docker run busybox ping -c 1 172.16.0.1docker run busybox cat /etc/resolv.confdocker run busybox ping -c 1 yourhost.local

لتكون قادرة على وضع قواعد غرامة الحبيبات لعامل الميناء ، لم أكن بحاجة إلى تعيين عامل الميناء 0 إلى أي منطقة.

# 1. Stop Dockersystemctl stop docker
# 2. Recreate DOCKER-USER chain in firewalld. firewall-cmd --permanent \             --direct \             --remove-chain ipv4 filter DOCKER-USERfirewall-cmd --permanent \             --direct \             --remove-rules ipv4 filter DOCKER-USERfirewall-cmd --permanent \             --direct \             --add-chain ipv4 filter DOCKER-USER# (Ignore any warnings)
# 3. Docker Container <-> Container communicationfirewall-cmd --permanent \             --direct \             --add-rule ipv4 filter DOCKER-USER 1 \             -m conntrack --ctstate RELATED,ESTABLISHED \             -j ACCEPT \             -m comment \             --comment 'Allow docker containers to connect to the outside world'firewall-cmd --permanent \             --direct \             --add-rule ipv4 filter DOCKER-USER 1 \             -j RETURN \             -s 172.17.0.0/16 \             -m comment \             --comment 'allow internal docker communication'# Change the Docker Subnet to your actual one (e.g. 172.18.0.0/16)
# 4. Add rules for IPs allowed to access the Docker exposed ports.firewall-cmd --permanent \             --direct \             --add-rule ipv4 filter DOCKER-USER 1 \             -o docker0 \             -p tcp \             -m multiport \             --dports 80,443 \             -i eth0 \             -o docker0 \             -s 1.2.3.4/32 \             -j ACCEPT \             -m comment \             --comment 'Allow IP 1.2.3.4 to docker ports 80 and 443'
# 5. log docker traffic (if you like)firewall-cmd --direct \             --add-rule ipv4 filter DOCKER-USER 0 \             -j LOG \             --log-prefix ' DOCKER: '
# 6. Block all other IPs. This rule has lowest precedence, so you can add allowed IP rules later.firewall-cmd --permanent \             --direct \             --add-rule ipv4 filter DOCKER-USER 10 \             -j REJECT \             -m comment \             --comment 'reject all other traffic to DOCKER-USER'
# 7. Reload firewalld, Start Docker againfirewall-cmd --reloadsystemctl start docker

هذا ينتهي في القواعد المحددة في / الخ / فايرواللد / المباشر.أكس:

<?xml version="1.0" encoding="utf-8"?><direct>  <chain ipv="ipv4" table="filter" chain="DOCKER-USER"/>  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment 'Allow docker containers to connect to the outside world'</rule>  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-j RETURN -s 172.17.0.0/16 -m comment --comment 'allow internal docker communication'</rule>  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-p tcp -m multiport --dports 80,443 -s 1.2.3.4/32 -j ACCEPT -m comment --comment 'Allow IP 1.2.3.4 to docker ports 80 and 443'</rule>  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-j LOG --log-prefix ' DOCKER TCP: '</rule>  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="10">-j REJECT -m comment --comment 'reject all other traffic to DOCKER-USER'</rule></direct>

العيب لا يزال هو أن تحتاج إلى تثبيت containerd.io من سينتوس 7 كما ذكر سوستروب

لقد غيرت متغير فايروالباكند إلى إيبتبلس مرة أخرى وأنه يعمل بالنسبة لي.

مع هذا التحديث ، النظام الفرعي تصفية نفتابلز هو الخلفية جدار الحماية الافتراضية للبرنامج الخفي فيريوال. لتغيير الخلفية ، استخدم الخيار فيريوال في / الخ / فيريوال.ملف أسيوط.

الرابط: سينتوس 8 مهمل_الوظيفة

ليس لدي الكثير من المعلومات حول هذا التغيير في السلوك. بعض قواعد إيبتبلس التي يحاول دوكر استخدامها لا تعمل وفقا لسجلات سينتوس 8:

تحذير: فشل الأمر:'/البيرة/سبين / إيبتبلس-10-د إلى الأمام-أنا دوكر 0-س دوكر 0-ي إسقاط ' فشل: إيبتبلس: قاعدة سيئة (هل توجد قاعدة مطابقة في تلك السلسلة?).

الألغام لا تعمل حتى مع فايروالد تعطيل تماما. أي شخص لديه أي أفكار ??