डॉकटर का उपयोग करते समय अपूर्ण फ़ायरवॉल (UFW) कुछ भी ब्लॉक नहीं कर रहा है


44

यह उबंटू सर्वर (14.04 एलटीएस) स्थापित करने का मेरा पहला अवसर है और मुझे फ़ायरवॉल (यूएफडब्ल्यू) को कॉन्फ़िगर करने में समस्या हो रही है।

मुझे केवल जरूरत है sshऔर httpइसलिए मैं यह कर रहा हूं:

sudo ufw disable

sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp

sudo ufw enable
sudo reboot

लेकिन मैं अभी भी इस मशीन के अन्य बंदरगाहों पर डेटाबेस से जुड़ सकता हूं । मैं क्या गलत कर रहा हूँ के बारे में कोई विचार?

संपादित करें : ये डेटाबेस डॉकर कंटेनर पर हैं। क्या यह संबंधित हो सकता है? क्या यह मेरे ufw विन्यास को ओवरराइड कर रहा है?

EDIT2 : का आउटपुटsudo ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)

क्या डेटाबेस? कौन सा पोर्ट? क्या आप सुनिश्चित हैं कि यह वही मशीन है? का उत्पादन क्या है ufw status
solsTiCe

@solsTiCe हाँ, मुझे यकीन है कि यह वही मशीन है। डेटाबेस बंदरगाहों के साथ 8083और एक docker कंटेनर पर InfluxDB है 8086। मैंने ufw status verboseप्रश्न में आउटपुट जोड़ा । धन्यवाद।
ESala

जवाबों:


64

समस्या -pकंटेनर पर ध्वज का उपयोग कर रही थी ।

यह पता चला है कि डॉकर आपके ऊपर सीधे बदलाव करता है iptables, जो इसके साथ नहीं दिखाए जाते हैं ufw status

संभावित समाधान हैं:

  1. -pझंडे का इस्तेमाल बंद करो । इसके बजाय docker linking या docker नेटवर्क का उपयोग करें।

  2. स्थानीय रूप से कंटेनरों को बांधें ताकि वे आपकी मशीन के बाहर उजागर न हों:

    docker run -p 127.0.0.1:8080:8080 ...

  3. यदि आप -pध्वज का उपयोग करने पर जोर देते हैं , तो बताएं कि आपके iptablesद्वारा उन्हें /etc/docker/daemon.jsonफिर से अक्षम करने और फिर से शुरू करने से छूने के लिए नहीं :

    { "iptables" : false }

मैं विकल्प 1 या 2 की सिफारिश करता हूं। उस विकल्प 3 के साइड-इफेक्ट्स हैं , जैसे कंटेनर इंटरनेट से कनेक्ट होने में असमर्थ हो रहे हैं।


8
यह बहुत उपयोगी है - मैं उन बंदरगाहों तक पहुंचने में सक्षम हो रहा था, जिन्हें मैंने ufw में अनुमति नहीं दी थी। Iptables का उपयोग करना = गलत तरीके से टूटना, हालांकि, लोकलहोस्ट पर एक्सेस करने वाले कंटेनर, जैसे रिवर्स प्रॉक्सिंग के लिए। यह सुनिश्चित करने के लिए बेहतर है कि कंटेनर सही सुनें, -p 80:80 का उपयोग न करें, लेकिन -p 127.0.0.1:80:80 या 127.0.0.1:3000:80 जैसे अलग पोर्ट का उपयोग करें, नग्नेक्स या अपाचे के साथ रिवर्स प्रॉक्सिंग के लिए और कोई पोर्ट नहीं संघर्ष।
एंड्रियास रीफ

2
@AndreasReiff आप सही हैं, लेकिन हाल ही में मैंने -pजितना संभव हो उतना बचने के लिए सबसे अच्छा पाया है। उदाहरण के लिए, एक रिवर्स प्रॉक्सी के मामले में, मैं श्रमिक कंटेनरों के लिए किसी भी पोर्ट को मैप नहीं करता हूं, और फिर अपने स्वयं के कंटेनर में -p 80:80और --linkदूसरों के साथ नंगेक्स डाल देता हूं । इस तरह से कोई पोर्ट क्लैश नहीं हो सकता है और एक्सेस का एकमात्र बिंदु नगनेक्स है।
17

1
साथ ही इस पोस्ट की जाँच एक तीसरी एहतियात के लिए करें! svenv.nl/unixandlinux/dockerufw
हेंक

1
महत्वपूर्ण : /etc/default/dockerएक कॉन्फिगरेशन फाइल है जिसका उपयोग अपस्टार्ट कॉन्फिगर द्वारा किया जाता है। यदि आप ऊपर की ओर से सिस्टमड में चले गए हैं, तो इस फ़ाइल का उपयोग नहीं किया जाएगा।
12/10 बजे ऑक्टाकोर

@ESala आपको इस उत्तर को अंकन के बारे में सोचना चाहिए क्योंकि यह दिनांकित है।
ctbrown

8

16.04 नई चुनौतियां प्रस्तुत करता है। मैंने सभी चरणों को किया जैसा कि रनिंग डॉकर को ufw फ़ायरवॉल के पीछे दिखाया गया था लेकिन मैं 16.04 पर काम करने के लिए डॉक प्लस और यूएफडब्ल्यू प्राप्त नहीं कर सका। दूसरे शब्दों में, कोई फर्क नहीं पड़ता कि मैंने सभी डॉकटर बंदरगाहों को विश्व स्तर पर इंटरनेट के संपर्क में ला दिया है। जब तक मुझे यह नहीं मिला: डॉकटर को 1.12+ सेट करने के लिए IPTABLES / FirewallD के साथ हस्तक्षेप न करें

मुझे फ़ाइल बनानी थी /etc/docker/daemon.jsonऔर निम्नलिखित में डालनी थी:

{
    "iptables": false
}

मैंने तब जारी किया था sudo service docker stopतब अंतिम रूप से sudo service docker startयूएफडब्ल्यू में उपयुक्त नियमों का पालन कर रहा था।

अतिरिक्त डेटा: Docker ने UFW को पछाड़ दिया!


Ubuntu 16.04 और Docker संस्करण 17.09 के साथ, यह समाधान कंटेनरों से आउटबाउंड कनेक्शन को तोड़ता है। प्रतिक्रिया देखें askubuntu.com/a/833363/262702 और askubuntu.com/a/954041/262702
ctbrown

5

यदि आप सिस्टम के init सिस्टम (Ubuntu 15.10 और बाद में) का उपयोग कर रहे हैं, /etc/docker/daemon.jsonतो इसे संपादित करें (यदि यह मौजूद नहीं है तो इसे बनाने की आवश्यकता हो सकती है), सुनिश्चित करें कि यह iptablesकुंजी कॉन्फ़िगर किया गया है:

{   "iptables" : false }

संपादित करें : यह आपको कंटेनर के अंदर से इंटरनेट से कनेक्शन खोने का कारण बन सकता है

यदि आपके पास यूएफडब्ल्यू सक्षम है, तो सत्यापित करें कि आप इंटरनेट को कंटेनर के अंदर से एक्सेस कर सकते हैं। नहीं तो - आप को परिभाषित करना होगा DEFAULT_FORWARD_POLICYके रूप में ACCEPTपर /etc/default/ufwऔर लागू चाल यहाँ वर्णित: https://stackoverflow.com/a/17498195/507564


2

डॉकर को चलाने और पोर्ट मैपिंग करने के दौरान एक तेज़ वर्कअराउंड है। आप हमेशा कर सकते हैं

docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...

अपने डॉकर को बाहर से एक्सेस करने से रोकने के लिए।


2

/etc/docker/daemon.jsonसामग्री के साथ उपयोग

{
  "iptables": false
}

एक समाधान की तरह लग सकता है लेकिन यह केवल अगले रिबूट तक काम करता है । उसके बाद आप देख सकते हैं कि आपके किसी भी कंटेनर की इंटरनेट तक पहुंच नहीं है, इसलिए आप किसी भी वेबसाइट को पिंग नहीं कर सकते। यह अवांछित व्यवहार हो सकता है।

एक कंटेनर को विशिष्ट आईपी से बांधने पर भी लागू होता है। आप ऐसा नहीं करना चाह सकते हैं। अंतिम विकल्प एक कंटेनर बनाना है और इसे UFW के पीछे रखना है इससे कोई फर्क नहीं पड़ता कि क्या होता है और आप इस कंटेनर को कैसे बनाते हैं, इसलिए इसका एक समाधान है:

/etc/docker/daemon.jsonफ़ाइल बनाने के बाद , चालान करें:

sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
ufw reload

इसलिए आप स्वीकार करने और उपयोग करने के लिए UFW में डिफ़ॉल्ट फॉरवर्ड नीति सेट करें:

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE

यदि आप docker-compose का उपयोग करने वाले हैं, तो ऊपर दिए गए IP को नेटवर्क के IP से बदल दिया जाना चाहिए, जब इसे साथ चलाया जा रहा हो docker-compose up

मैंने इस लेख में समस्या और समाधान का अधिक विस्तार से वर्णन किया है

आशा है ये मदद करेगा!


1

मेरे मामले में मैंने केवल विशिष्ट IP से डॉकटर तक पहुंच की अनुमति देने के लिए iptables को संशोधित किया है।

ईसाला के उत्तर के अनुसार :

यदि आप -pकंटेनरों पर ध्वज का उपयोग करते हैं, तो डॉकर ufw को अनदेखा करते हुए सीधे iptables में परिवर्तन करता है।

डॉकर द्वारा iptables में जोड़े गए रिकॉर्ड का उदाहरण

'DOCKER' श्रृंखला के लिए रूटिंग:

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

'DOCKER' श्रृंखला से कंटेनर के लिए पैकेट अग्रेषित करना:

-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.17.0.3:6379

आप केवल निर्दिष्ट स्रोत IP (जैसे 1.1.1.1) से DOCKER श्रृंखला तक पहुंच की अनुमति देने के लिए iptables को संशोधित कर सकते हैं :

-A PREROUTING -s 1.1.1.1 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -s 1.1.1.1 ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

आप उपयोग कर सकते हैं iptables-save > /tmp/iptables.confऔर iptables-restore < /tmp/iptables.confडंप करने के लिए, संपादित और iptables नियम बहाल।


0

उपयोग करें --network = होस्ट जब आप कंटेनर शुरू करते हैं तो डॉक डिफ़ॉल्ट पोर्ट नेटवर्क के बजाय होस्ट-केवल नेटवर्क को अलग करने के लिए पोर्ट करेगा। मुझे ब्रिजनेट नेटवर्क को ब्लॉक करने का कोई कानूनी तरीका नहीं दिखता है। वैकल्पिक रूप से आप अलगाव के साथ कस्टम उपयोगकर्ता-परिभाषित नेटवर्क का उपयोग कर सकते हैं।


0
  1. अपने docker कंसोल पर लॉगिन करें:

    sudo docker exec -i -t docker_image_name / bin / bash

  2. और फिर अपने डॉक कंसोल के अंदर:

    sudo apt-get update
    sudo apt-get install ufw
    sudo ufw allow 22
    
  3. अपने ufw नियम जोड़ें और ufw को सक्षम करें

    सूद ufw सक्षम करें

    • आपकी डॉकर छवि को --cap-add = NET_ADMIN के साथ शुरू करने की आवश्यकता है

"NET_ADMIN" डॉकर विकल्प सक्षम करने के लिए:

1. कंटेनर कंटेनर:

डॉकटर अपने बंद करने वाले; 2. कंटेनर कंटेनर आईडी:

docker आपके निरीक्षणकर्ता का निरीक्षण करता है; 3.Modify hostconfig.json (डिफ़ॉल्ट docker पथ: / var / lib / docker, आप उन्हें बदल सकते हैं)

vim /var/lib/docker/containers/containerid/hostconfig.json

4.खोज "CapAdd", और null को ["NET_ADMIN"] में संशोधित करें;

...., "VolumesFrom": null, "CapAdd": ["NET_ADMIN"], "CapDrop": null, .... 5.Restart docker in host machine;

सेवा कर्ता पुनरारंभ; 6. अपने संयोजक को शुरू करें;

डॉकटर ने आपकी शुरुआत की;


0

मैंने docker-composeकई कंटेनरों को शुरू किया और यह भी समस्या थी कि एक बंदरगाह को दुनिया के सामने उजागर किया गया था, जो कि ufw नियमों की अनदेखी करता है।

मेरे डॉकटर कंटेनरों को केवल पोर्ट उपलब्ध कराने के लिए फिक्स मेरी docker-compose.ymlफाइल में यह बदलाव था :

ports:
- "1234:1234"

इसके लिए:

ports:
- "1234"

अब अन्य डॉकटर-कंटेनर अभी भी पोर्ट का उपयोग कर सकते हैं, लेकिन मैं इसे बाहर से एक्सेस नहीं कर सकता।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.