अगर एक iptables नियम पहले से मौजूद है तो मैं कैसे जांच सकता हूं?


41

मुझे इंटरनेट से tcp पोर्ट पर कनेक्शन ब्लॉक करने के लिए iptables में एक नियम जोड़ने की आवश्यकता है।

चूंकि मेरी स्क्रिप्ट को कई बार कहा जा सकता है और नियम को हटाने के लिए कोई स्क्रिप्ट नहीं है, इसलिए मैं यह जांचना चाहता हूं कि क्या डालने से पहले एक iptables नियम पहले से मौजूद है - अन्यथा INPUT श्रृंखला में बहुत सारे नियम हैं।

अगर एक iptables नियम पहले से मौजूद है तो मैं कैसे जांच सकता हूं?


वैकल्पिक रूप से, इस रैपर का उपयोग करें, जो बेकार के आईपोटैबल्स
sampablokuper

जवाबों:


44

-C --checkहाल के iptables संस्करणों में एक नया विकल्प है।

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
iptables: Bad rule (does a matching rule exist in that chain?).
# echo $?
1

# iptables -A INPUT -p tcp --dport 8080 --jump ACCEPT

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
# echo $?
0

पुराने iptables संस्करणों के लिए, मैं गैरेट सुझाव का उपयोग करूंगा:

# iptables-save | grep -- "-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT"

12

नया -Cविकल्प संतोषजनक नहीं है, क्योंकि यह समय-समय पर चेक-टू-टाइम-ऑफ़-यूज़ (TOCTTOU) दौड़ की स्थिति के लिए खुला है। यदि दो प्रक्रियाएँ एक ही समय में एक ही नियम को जोड़ने का प्रयास करती हैं, -Cतो उन्हें दो बार जोड़ने से नहीं बचाएगी।

तो, यह वास्तव में grepसमाधान से बेहतर नहीं है । आउटपुट पर एक सटीक टेक्स्ट प्रोसेसिंग जॉब के iptables-saveरूप में मज़बूती से काम कर सकता है -C, क्योंकि यह आउटपुट तालिकाओं की स्थिति का एक विश्वसनीय स्नैपशॉट है।

जरूरत है एक --ensureविकल्प की जो परमाणु जांच करता है और एक नियम जोड़ता है केवल अगर यह पहले से मौजूद नहीं है। इसके अलावा, यह अच्छा होगा यदि नियम को सही स्थिति में ले जाया जाए जहां एक नया नियम डाला जाएगा यदि यह पहले से मौजूद नहीं है ( --ensure-move)। उदाहरण के लिए यदि iptables -I 1किसी श्रृंखला के प्रमुख पर एक नियम बनाने के लिए उपयोग किया जाता है, लेकिन वह नियम पहले से ही सातवें स्थान पर मौजूद है, तो मौजूदा नियम को पहले स्थान पर जाना चाहिए।

इन विशेषताओं के बिना, मुझे लगता है कि इस छद्म कोड के आधार पर एक शेल स्क्रिप्ट लूप लिखना संभव है।

while true ; do
  # delete all copies of the rule first

  while copies_of_rule_exist ; do
    iptables -D $RULE
  done

  # now try to add the rule

  iptables -A $RULE # or -I 

  # At this point there may be duplicates due to races.
  # Bail out of loop if there is exactly one, otherwise
  # start again.
  if exactly_one_copy_of_rule_exists ; then
    break;
  fi
done

यह कोड घूम सकता है; यह गारंटी नहीं देता कि दो या अधिक रेसर निश्चित संख्या में पुनरावृत्तियों से बाहर होंगे। इसके साथ मदद करने के लिए कुछ यादृच्छिक घातीय बैकऑफ स्लीप जोड़े जा सकते हैं।


1
क्या मैं यह जोड़ सकता हूं कि यह आदेश उस सरल कारण के लिए संतोषजनक नहीं है, जिस पर आपको अपना नियम जोड़ने का सटीक तरीका बताना है। मैंने अपने सेटअप के साथ परीक्षण किया, और यह एक नियम नहीं खोज सका क्योंकि मैंने सटीक कीवर्ड और मान निर्दिष्ट नहीं किए ...
Fabien Haddadi

यदि आप अस्थायी रूप से एक नियम को हटाते हैं, तो आप कुछ तोड़ सकते हैं ...
मेहरदाद

5

यह थोड़ा पीछे की ओर लग सकता है, लेकिन यह मेरे लिए काम करता है - पहले नियम को हटाने का प्रयास करें।

iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;

आपको निम्न के लिए एक संदेश प्राप्त करना चाहिए:

iptables: खराब नियम (क्या एक मिलान नियम उस श्रृंखला में मौजूद है?)

फिर बस अपना नियम सामान्य रूप से जोड़ें:

iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;


1
अपने फ़ायरवॉल में एक अनचाहे छेद को खोलना, बस एक बेकार की आज्ञा का अनुकरण करना, शायद एक महान विचार नहीं है। बेशक, छेद अस्थायी होने का इरादा है, लेकिन यह अभी भी एक हमलावर की संभावना में सुधार करता है। और अगर कुछ प्रतिस्थापन नियम को जोड़ने में बाधा डालता है, तो छेद अनिश्चित काल तक जारी रह सकता है।
सम्पाबलोकुपर

अच्छी बात @sampablokuper: यह रणनीति शायद ACCEPT नियमों के लिए ही उपयुक्त है और DROP वाले नहीं, सुरक्षा कारणों से
lucaferrario

मैंने वही काम करना समाप्त कर दिया!
वॉरहेसन

4

बस सूची और इसके लिए खोज?

iptables --list | grep $ip

... या फिर आपके पास नियम निर्दिष्ट है। यदि आप इसका उपयोग करते हैं तो grep -qयह कुछ भी आउटपुट नहीं करेगा, और आप केवल रिटर्न मान की जांच कर सकते हैं$?


3
मैं iptables-save|grep $ipइसके बजाय सुझाव देना चाहूंगा क्योंकि यह एक अधिक आसानी से प्राप्य प्रारूप है, विशेष रूप से एक स्क्रिप्ट में। आप चाहें तो कमांड का सटीक सिंटैक्स भी देख सकते हैं।
गैरेट

1
इनमें से कोई भी वास्तव में सवाल का जवाब नहीं देता है, क्योंकि कई नियमों का iptables-save|grep $ipबहुत अच्छा मेल हो सकता है। संभवतः पूर्ण नियम विनिर्देश के लिए जाँच करने के लिए इस्तेमाल किया जा सकता है , लेकिन यह अभी भी एक हैक का एक सा है: प्रारूप द्वारा लौटाया गया स्क्रिप्ट में नियम से बिल्कुल मेल नहीं खा सकता है। एक अलग क्रम में विकल्प उत्पन्न कर सकते हैं, चीजों को जोड़ सकते हैं (जैसे ), और इसके बाद। iptables-saveiptables-saveiptables-save-m tcp
लार्क्स

ध्यान रखें कि iptables --listप्रसिद्ध बंदरगाहों को हल करने की कोशिश करेंगे। तो इससे पहले कि आप एक बंदरगाह के लिए grep सुनिश्चित करें।
फेबिन हदादी


0

अपनी स्क्रिप्ट से डुप्लिकेट नियमों से बचने के लिए, नीचे पंक्ति जोड़ें।

iptables -C -INPUT -p tcp --dport 8080 --jump ACCEPT || iptables -A -INPUT -p tcp --dport 8080 --jump ACCEPT

पहली बार जब ऊपर कमांड चलाया जाता है, तो हम नीचे संदेश का अवलोकन करेंगे

iptables: खराब नियम (क्या एक मिलान नियम उस श्रृंखला में मौजूद है?)।

यह सिर्फ जानकारी के लिए है। लेकिन कमांड का दूसरा हिस्सा नियम जोड़ना सुनिश्चित करेगा।

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