सेंटोस 8 पर डॉकर सीई कंटेनर से / से कोई नेटवर्क कनेक्टिविटी नहीं

मैंने अभी नवीनतम रिलीज स्थापित की है docker-ce CentOS पर है, लेकिन मैं पड़ोसी सर्वर से प्रकाशित पोर्ट तक नहीं पहुंच सकते और बाहर तक नहीं पहुंच सकते कंटेनर से ही ।

नेटवर्कमैनेजर और फायरवॉल्ड सक्षम के साथ एक सादा वेनिला सेंटोस 8 चलाना । डिफ़ॉल्ट फ़ायरवॉल ज़ोन है public.

Versions:

  • docker-ce 19.03.3 (सरकारी डोकर RPM)
  • containerd.io 1.2.6 (सेंटोस 7 के लिए आधिकारिक डॉकर आरपीएम-सेंटोस 8 के लिए अभी तक उपलब्ध नहीं है)
  • CentOS 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 से जैसा कि सौस्ट्रुप द्वारा कहा गया है

मैंने फायरवॉलबैकेंड वैरिएबल को फिर से आईपीटेबल्स में बदल दिया है और यह मेरे लिए काम करता है ।

इस अद्यतन के साथ, एनएफटीबल्स फ़िल्टरिंग सबसिस्टम फायरवॉल्ड डेमॉन के लिए डिफ़ॉल्ट फ़ायरवॉल बैकएंड है । बैकएंड को बदलने के लिए, /आदि/फायरवॉल्ड में फायरवॉलबैकेंड विकल्प का उपयोग करें । conf फ़ाइल.

लिंक: Centos8 Deprecated_functionality

मुझे इस व्यवहार परिवर्तन के बारे में बहुत अधिक जानकारी नहीं है । कुछ आईपीटीबल्स नियम जो डॉकर उपयोग करने का प्रयास करते हैं, सेंटोस 8 लॉग के अनुसार काम नहीं कर रहे हैं:

चेतावनी: COMMAND_FAILED: '/usr/sbin/iptables -w10 -डी आगे -मैं docker0 -ओ docker0 -जम्मू ड्रॉप' विफल: iptables: बुरा नियम (एक मिलान के नियम अस्तित्व में है कि श्रृंखला?).

मेरा फायरवॉल्ड के साथ भी काम नहीं करता है पूरी तरह से अक्षम । किसी के पास कोई विचार है ??