मैंने अभी नवीनतम रिलीज स्थापित की है docker-ce CentOS पर है, लेकिन मैं पड़ोसी सर्वर से प्रकाशित पोर्ट तक नहीं पहुंच सकते और बाहर तक नहीं पहुंच सकते कंटेनर से ही ।
नेटवर्कमैनेजर और फायरवॉल्ड सक्षम के साथ एक सादा वेनिला सेंटोस 8 चलाना । डिफ़ॉल्ट फ़ायरवॉल ज़ोन है public.
Versions:
docker-ce 19.03.3 (सरकारी डोकर RPM)
containerd.io 1.2.6 (सेंटोस 7 के लिए आधिकारिक डॉकर आरपीएम-सेंटोस 8 के लिए अभी तक उपलब्ध नहीं है)
शामिल घटकों के लिए लॉग और कॉन्फ़िगरेशन को देखने में कुछ दिन बिताने के बाद, मैं तौलिया में फेंकने वाला था और फेडोरा 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
# 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'
मैंने फायरवॉलबैकेंड वैरिएबल को फिर से आईपीटेबल्स में बदल दिया है और यह मेरे लिए काम करता है ।
इस अद्यतन के साथ, एनएफटीबल्स फ़िल्टरिंग सबसिस्टम फायरवॉल्ड डेमॉन के लिए डिफ़ॉल्ट फ़ायरवॉल बैकएंड है । बैकएंड को बदलने के लिए, /आदि/फायरवॉल्ड में फायरवॉलबैकेंड विकल्प का उपयोग करें । conf फ़ाइल.
मुझे इस व्यवहार परिवर्तन के बारे में बहुत अधिक जानकारी नहीं है । कुछ आईपीटीबल्स नियम जो डॉकर उपयोग करने का प्रयास करते हैं, सेंटोस 8 लॉग के अनुसार काम नहीं कर रहे हैं:
चेतावनी: COMMAND_FAILED: '/usr/sbin/iptables -w10 -डी आगे -मैं docker0 -ओ docker0 -जम्मू ड्रॉप' विफल: iptables: बुरा नियम (एक मिलान के नियम अस्तित्व में है कि श्रृंखला?).