केवल एक डोमेन पर HTTP ट्रैफ़िक की अनुमति देने के लिए iptables नियम


20

मुझे अपने मशीन को कॉन्फ़िगर करने की आवश्यकता है क्योंकि HTTP ट्रैफ़िक को केवल serverfault.com से / के लिए अनुमति देता है। अन्य सभी वेबसाइट, सेवा बंदरगाह सुलभ नहीं हैं। मैं इन iptables नियमों के साथ आया:

#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

यह बहुत अच्छी तरह से काम नहीं करता है:

  • मैं सब कुछ छोड़ने के बाद, और नियम 3 पर आगे बढ़ता हूँ:

    iptables-OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT

मुझे यह त्रुटि मिली:

iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.

क्या आपको लगता है कि यह डीएनएस से संबंधित है? क्या मुझे इसकी अनुमति देनी चाहिए? या मुझे बस नियमों में आईपी पते डालने चाहिए? क्या आपको लगता है कि मैं जो करने की कोशिश कर रहा हूं वह सरल नियमों से हासिल किया जा सकता है? कैसे?

मैं इस पर किसी भी मदद या संकेत की सराहना करेंगे। आपका बहुत बहुत धन्यवाद!


2
Sstatic.net और अन्य को न भूलें। serverfault.com पूरी तरह से serverfault.com से नहीं आता
Zoredache

क्या आप किसी अन्य सिस्टम पर एक प्रॉक्सी चला सकते हैं? यह सबसे अच्छा / सबसे आसान उपाय है: serverfault.com/questions/215134
Mattdm

जवाबों:


29

IPTables नियमों के साथ, मामलों को क्रमबद्ध करें। नियमों को जोड़ा जाता है, और लागू किया जाता है, क्रम में। इसके अलावा, मैन्युअल रूप से नियम जोड़ने पर वे तुरंत लागू हो जाते हैं। इस प्रकार, आपके उदाहरण में, INPUT और OUTPUT श्रृंखला से गुजरने वाले किसी भी पैकेट को डिफ़ॉल्ट नीति के सेट होते ही छोड़ दिया जाना शुरू हो जाता है। यह भी, संयोग से, आपने जो त्रुटि संदेश प्राप्त किया है, वह क्यों है। यह क्या हो रहा है:

  1. डिफ़ॉल्ट DROP नीति लागू हो जाती है
  2. IPTables एक गंतव्य के रूप में एक होस्टनाम प्राप्त करता है
  3. IPTables 'serverfault.com' पर एक DNS लुकअप का प्रयास करता है
  4. DNS लुकअप DROP क्रिया द्वारा अवरोधित है

हालांकि स्रोत / गंतव्य विकल्प होस्टनाम स्वीकार करेंगे, यह दृढ़ता से हतोत्साहित किया जाता है। मैन पेज को उद्धृत करने के लिए,

होस्टनाम को केवल एक बार हल किया जाएगा, नियम को कर्नेल में जमा करने से पहले। कृपया ध्यान दें कि किसी भी नाम को दूरस्थ क्वेरी जैसे DNS से ​​हल किया जाना निर्दिष्ट करना वास्तव में एक बुरा विचार है।

स्लिलिबरी ने सिर पर कील ठोंकी जो उसका जवाब था, आप डीएनएस ACCEPT नियम से चूक गए। आपके मामले में यह कोई मायने नहीं रखेगा, लेकिन आम तौर पर मैं इस प्रक्रिया पर बाद में डिफ़ॉल्ट नीति निर्धारित करूंगा। आखिरी चीज जो आप चाहते हैं, वह दूरस्थ रूप से काम करना है और डिफ़ॉल्ट इनकार पर मुड़ने के बाद एसएसएच को अनुमति देना है ।

इसके अलावा, आपके वितरण के आधार पर, आपको अपने फ़ायरवॉल नियमों को बचाने में सक्षम होना चाहिए जैसे कि वे स्वचालित रूप से प्रारंभ समय पर लागू होंगे।

यह सब जानते हुए, और अपनी स्क्रिप्ट को पुनर्व्यवस्थित करते हुए, यहाँ वही है जो मैं सुझाऊँगा।

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

3
सुंदर, अच्छी तरह से गढ़ा गया उत्तर।
जेकराबिंसन

1
मैं इसकी सराहना करता हूं, हालांकि आपने भी मेरी गलती को याद किया होगा। उफ़।
स्कॉट पैक

3
दरअसल, आप अपने iptables -Pबयानों को अपनी स्क्रिप्ट में कहीं भी रख सकते हैं , क्योंकि चेन पॉलिसी केवल तभी लागू की जाती हैं जब पैकेट एक चेन के अंत में "गिर जाते हैं"। मैं आमतौर पर DROPअपनी iptables स्क्रिप्ट के शीर्ष पर पॉलिसी स्टेटमेंट (आमतौर पर नीतियां) डालता हूं।
स्टीवन मंडे

1
@ उत्तर: आप बिल्कुल सही कह रहे हैं। ओपी उन्हें अंतःक्रियात्मक रूप से टाइप करता हुआ दिखाई देता है। आइए दिखाते हैं कि आप SSH पर अपने मेजबान से जुड़े हुए हैं और आपका पहला नियम पॉलिसी DROP के लिए है। आपके SSH कनेक्शन को किसी अन्य नियम में टाइप करने से पहले छोड़ दिया जाएगा। यह एक ही समय मुद्दा है, अगर एक अलग अभिव्यक्ति, से वह भाग गया।
स्कॉट पैक

धन्यवाद। यही कोशिश कर रहा था। लेकिन जोड़ने के बिना काम नहीं किया sudo iptables -I OUTPUT 1 -o lo -j ACCEPT। जोड़ा जाना चाहिए कि नहीं?
किरण

7

जोड़ना

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

DNS लुकअप की अनुमति देने के लिए।


5

इस तरह की आवश्यकता को वेब प्रॉक्सी और / या फ़िल्टर के साथ बेहतर तरीके से नियंत्रित किया जा सकता है। Dansgaurdian को ऐसा करने के लिए कॉन्फ़िगर किया जा सकता है। आपको फ़िल्टर के माध्यम से अपने ट्रैफ़िक को बाध्य करने के लिए NAT नियमों का उपयोग करने की आवश्यकता होगी।

फ़िल्टर करने के लिए iptables का उपयोग करने से प्रासंगिक आईपी पते से कोई भी साइट उपलब्ध होगी। यह सामान्य रूप से पूरे वेब का एक छोटा सा उपसमूह है।


1
इससे पूरी तरह सहमत हैं। iptablesशायद यहाँ उपयोग करने के लिए गलत उपकरण है, क्योंकि यह DNS नामों के साथ विशेष रूप से अच्छी तरह से व्यवहार नहीं करता है। उपयुक्त फिल्टर सेटिंग्स वाला एक वेब प्रॉक्सी ज्यादा बेहतर है।
स्टीवन मंडे

2

मुझे डर है कि iptables इस स्तर पर काम नहीं करता है, यह केवल आईपी पते के बारे में परवाह करता है, होस्टनाम नहीं। यदि आप एक ही आईपी पर अन्य नाम वर्चुअल होस्ट तक पहुंच को अवरुद्ध करना चाहते हैं, तो आपको .htaccess फ़ाइलों को डालने की आवश्यकता होगी।


बात यह है, जब मैं "सब कुछ छोड़ने" के बिना नियम 3 की कोशिश करता हूं तो यह iptables के साथ ठीक काम करता है!
ज़ीनत

2
हम्म, मैं सवाल गलत है। ठीक है, जो पृष्ठभूमि में हो रहा है वह यह है कि iptables 64.34.119.12 को serverfault.com को हल कर देगा (यह देखने के लिए कि क्या काम नहीं कर रहा था, यह समझने के लिए स्लिलिब्री से उत्तर देखें)। हालाँकि, क्योंकि iptables hostnames को नहीं समझता है, और सिर्फ ip को अनुमति दे रहा है, आप उस आईपी पर किसी भी वेबसाइट से जुड़ पाएंगे, अगर इसमें कई साइटें हैं।
नियाल डोनेगन

2
@ आम तौर पर, यह ठीक काम कर सकता है, इसमें नियम जोड़ा जाता है, लेकिन अगर serverfault.com आईपी बदल जाता है, तो यातायात की अनुमति नहीं दी जाएगी। Google.com जैसी साइट की अनुमति देना जिसमें सैकड़ों पते हैं जो अक्सर बदल दिए जाते हैं, यह बिल्कुल भी काम नहीं करेगा।
Zoredache

1

आपको इसे अपने वेबसर्वर पर कॉन्फ़िगर करना होगा। iptables एक पैकेट फ़िल्टर है। HTTP ट्रांजेक्शन साइट नाम (यानी स्टैकओवरफ़्लो) को टीसीपी पेलोड के हिस्से के रूप में भेजती है (यानी टीसीपी हेडर के हिस्से के रूप में नहीं जो कि iptables आसानी से पढ़ता है)।

यह देखते हुए, और तथ्य यह है कि HTTP लेनदेन लगभग निश्चित रूप से कई पैकेटों में फैलने जा रहे हैं (यानी आप सिर्फ HTTP हेडर में एक स्ट्रिंग से मेल नहीं खा सकते हैं), यह आपके वेबसर्वर कॉन्फ़िगरेशन या सामने वाले प्रॉक्सी द्वारा बहुत बेहतर ढंग से नियंत्रित किया जाता है। इसका।

इसके पीछे के तर्क को जानना उपयोगी होगा, कुछ अन्य विकल्प हैं:

  1. यदि वे गलत URL दर्ज करते हैं, तो सही URL पर पुनर्निर्देशित करें (जैसे अगर वे www.stackoverflow.com में प्रवेश करते हैं तो stackoverflow.com पर पुनर्निर्देशित करें)
  2. अपने वेबसर्वर को बताएं कि stackoverflow.com के अलावा मेजबानों की सेवा न करें
  3. साइट को एक अलग आईपी पर रखें जो कुछ और नहीं सुलझता है और केवल उस पर सुनने के लिए अपने वेबसर्वर को प्राप्त करें।

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