iptables - नियमों को रूट के रूप में नहीं जोड़ें


3

हमारे एक सर्वर को बड़ी संख्या में स्पैम बॉट्स द्वारा प्रतिदिन मारा जा रहा है। वे किसी भी स्पैम को पोस्ट करने में सक्षम नहीं हैं, लेकिन वे अभी भी कोशिश करते हैं और वास्तविक उपयोगकर्ताओं के लिए सर्वर को धीमा कर रहे हैं।

इसका मुकाबला करने के लिए, मेरे पास साइट पर एक PHP स्क्रिप्ट चल रही है जो उनके आईपी पते का पता लगाती है। हालाँकि, मैं चाहता हूं कि यह स्क्रिप्ट इन आईपी पते को स्वचालित रूप से फ़ायरवॉल में जोड़े (बजाय मुझे मैन्युअल रूप से ऐसा करने के)। कुछ इस तरह से चल रहा है:

iptables -I INPUT -j DROP -s 123.123.123.123

हालाँकि, ऐसा लगता है कि iptablesकमांड केवल रूट के रूप में चलाया जा सकता है। इसके आसपास कोई रास्ता? मुझे लगता है कि मेरे पास एक फ़ाइल में जोड़े गए कमांड हो सकते हैं जो rootक्रोन के माध्यम से चलता है, लेकिन वास्तव में php स्क्रिप्ट के बीच कोई भी देरी नहीं करना चाहता है जिससे एक आईपी और प्रतिबंध को जोड़ने का निर्णय लिया जा सके।


1
आप php स्क्रिप्ट को रूट के रूप में क्यों नहीं चलाते हैं?
टेराडन

वेब सर्वर द्वारा स्क्रिप्ट को पेज लोड के अंत में चलाया जा रहा है। यदि पृष्ठ लोड स्पैम बॉट द्वारा किया गया था या नहीं तो यह विभिन्न तर्क करता है।
रॉस मैक्लीनन

1
एक सुगम रूट शेल स्क्रिप्ट बनाएं जो iptables को कॉल करता है? बस अपने इनपुट को बहुत सावधानी से सुनिश्चित करें । की तरह कुछ s/[^0-9.:]//आईपी पते पर और इनपुट के रूप में कुछ और स्वीकार नहीं कर रहा। मैं इस तरह के परिदृश्य में इसे और भी कड़ा कर दूंगा।
बजे एक CVn

जवाबों:


2

अपने PHP स्क्रिप्ट एक लॉग फ़ाइल के लिए अपमानजनक आईपी पते लिखें। इसके बाद, Fail2Ban इंस्टॉल करें और अपनी लॉग फ़ाइल को पढ़ने के लिए इसे कॉन्फ़िगर करें।


1
धन्यवाद। इस विधि को अभी के लिए एक कोशिश दे रहा हूँ। मैं 3 पार्टी स्क्रिप्ट पर भरोसा नहीं करना पसंद करता हूं, जब एक साधारण कस्टम स्क्रिप्ट काम करेगी, लेकिन असफल 2बन में काफी उपयोगी क्षमताएं हैं, जैसे एक निश्चित अवधि के बाद unbanning। थोड़ा सा दर्द था सेटअप करने के लिए और लगता है कि कुछ बिट्स के लिए प्रलेखन की कमी है, लेकिन लगता है कि अभी चल रहा है। बस यह देखेगा कि अगली बार जब कोई हमला होता है, तो यह कैसे होता है।
रॉस मैकलेलन

4

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

#!/bin/bash
while true
do
  while read IP
  do
      ## Check if this IP is already banned
      if ! iptables -L INPUT -v -n | grep $IP >/dev/null
      then
      ## If it is not banned, ban it
         iptables -I INPUT -j DROP -s $IP
      fi
  done < $1
  ## Sleeping to avoid spamming, if even a one second
  ## delay is too slow for you(!) adjust as needed.
  sleep 1
done

तब आप इस स्क्रिप्ट को रूट के रूप में या तो सेवा के रूप में चला सकते हैं या रूट के लिए इस crontab को बनाकर:

@reboot /path/to/banips.sh logfile.txt

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


हाथ में समस्या के लिए डिब्बाबंद और सिद्ध समाधान हैं, पहिया को क्यों मजबूत करना है?
0xC0000022L

1
@ 0xC0000022L क्योंकि इस मामले में पहिया का आविष्कार करना सरल है, क्योंकि सॉफ्टवेयर सिफारिशों को विषय से अलग माना जाता है और यह एक ऐसा समाधान है जिसके लिए किसी तीसरे पक्ष के सॉफ़्टवेयर की आवश्यकता नहीं होती है और क्योंकि व्यक्तिगत रूप से मैं छोटी स्क्रिप्ट्स करना पसंद करता हूं क्योंकि मैं उनके व्यवहार को पूरी तरह से नियंत्रित कर सकता हूं।
टेराडॉन

निष्पक्ष रूप से, यहां तक ​​कि अपने स्वयं के उत्तर में आपकी स्क्रिप्ट का उल्लेख किया। मान लीजिए आपके पास एक बिंदु है :)
0xC0000022L

शुक्रिया @terdon, मैंने महसूस नहीं किया था कि क्रॉन जॉब कुछ ही समय में चल सकता है। मैं इस समय विफल 2ban की कोशिश कर रहा हूं, लेकिन शायद इस विधि को किसी बिंदु पर भी आज़माऊंगा, भले ही यह देखने के लिए कि यह कैसे काम करता है।
रॉस मैकलेलन

3

मौजूदा sshguardFail2Ban मैं आपको सुझाव देना चाहूंगा कि मौजूदा जवाबों और जोड़ने के विकल्प के रूप में (अब तक इसके दायरे के लिए इतना नाम नहीं कि नाम क्या बताता है) से अधिक है sudo

फ़ाइल /etc/sudoersको कसकर नियंत्रित करने के लिए कॉन्फ़िगर किया जा सकता है कि कौन क्या और किस मशीन से चला सकता है। इसलिए आप टेर्डन के उत्तर में थोड़ा रैपर लिख सकते हैं और फिर chown root:यह सुनिश्चित करें कि इसकी अनुमतियाँ चुस्त हैं। इसे एक फ़ोल्डर में फेंक दें जैसे कि /usr/sbinऔर इसे rootअपने PHP स्क्रिप्ट के रूप में चलने वाले उपयोगकर्ता के खाते से चलाने की अनुमति दें । सुनिश्चित करें कि यदि आपकी स्क्रिप्ट वेब सर्वर के संदर्भ में चलती है और यह चिरोट किया गया है कि स्क्रिप्ट चेरोट के अंदर है। ध्यान रखें कि यदि आपकी स्क्रिप्ट बुरी तरह से लिखी गई है, तो इसका उपयोग चेरोट "जेल" से समझौता करने के लिए किया जा सकता है। इसमें एक उदाहरण रेखा /etc/sudoersहो सकती है:

www-data   ALL= (root) NOPASSWD: /usr/sbin/yourscript.sh

जो उपयोगकर्ता की अनुमति देता है www-dataचलाने के लिए /usr/sbin/yourscript.shके रूप में rootसभी मशीनों पर एक पासवर्ड दिए बिना ( sudoersएक नेटवर्क में सभी मशीनों के लिए एक केंद्रीय एक हो सकता है, कि ... क्यों है)।

sudosuidआपकी स्क्रिप्ट पर बिट सेट करने की तुलना में अधिक सुरक्षित माना जाता है , लेकिन मुझे लगता है कि इस विकल्प का उपयोग करने के लिए अच्छे कारण हैं, जैसे कि जब sudoउपलब्ध नहीं है।

आप इस उत्तर को भी देख सकते हैं जो मैंने बहन एसई साइट askubuntu.com पर दिया था।


धन्यवाद। मैं अपने वेब सर्वर उपयोगकर्ता को सभी iptables कमांड चलाने के लिए थोड़ा अनिच्छुक था, मुझे पता था कि sudoers आपके द्वारा चलाए जा सकने वाले कमांड को सीमित कर सकते हैं, लेकिन मुझे यह महसूस नहीं हुआ कि मैं इसे एक विशिष्ट .sh फ़ाइल (एक जो विशेष चलाता है) तक सीमित कर सकता हूं। iptables कमांड)।
रॉस मैकलेलन

0

एक बहुत ही सरल विधि ...

मैंने एक php स्क्रिप्ट लिखी है, जो प्रत्येक पंक्ति पर एक टेक्स्ट फ़ाइल के लिए अवांछित आईपी लिखती है (जहाँ भी आवश्यक हो सम्मिलित करें)

$banlist = file_get_contents( '/var/www/banlist.txt' );
$remoteip = $_SERVER['REMOTE_ADDR'];
if( strpos( $banlist, $remoteip ) === false ){
    file_put_contents( '/var/www/banlist.txt', $remoteip."\n", FILE_APPEND );
}

फिर मैंने एक कस्टम iptables चेन बनाई और इसे " banlist " कहा (कमांड का उपयोग करके इसे कॉल करें जो आपको पसंद है) ...

sudo iptables --new-chain banlist

साथ ही iptables-persistent का उपयोग कर इंस्टॉल कर रहा है ...

sudo apt-get install iptables-persistent

अंत में कमांड का उपयोग ...

sudo crontab -e

मैंने इस लाइन को रूट क्रोनजॉब में जोड़ दिया, जो प्रत्येक 5 मिनट (आपके समय को बदलने के लिए) को चलाने के लिए है, जो प्रत्येक आईपी को पढ़ता है, उन्हें उन डीपीआर लक्ष्य के साथ बनाई गई iptable श्रृंखला में जोड़ता है, और फिर पाठ फ़ाइल को साफ करता है ...

*/5 * * * * while read in; do sudo iptables -A banlist -s "$in" -j DROP; done < /var/www/banlist.txt && > /var/www/banlist.txt

मैंने यह भी सुनिश्चित करने के लिए इस पंक्ति को जोड़ा कि नियम हर 5 मिनट में सहेजे जा रहे हैं ...

*/5 * * * * iptables-save > /etc/iptables/rules.v4 && ip6tables-save > /etc/iptables/rules.v6

बस! मीठी और सरल, टेक्स्ट फ़ाइल में एक यादृच्छिक आईपी (या एक नई लाइन पर प्रत्येक आईपी) जोड़कर इसका परीक्षण करें और अपने चुने हुए अंतराल पर अपने क्रोनजोब के चलने की प्रतीक्षा करें ... सावधान रहें कि php स्क्रिप्ट का परीक्षण करके अपने आप को प्रतिबंधित न करें। अपने खुद के नेटवर्क से ...

नोट: सभी आईपी के iptables श्रृंखला को साफ़ करने के लिए आप " sudo iptables -F banlist " का उपयोग कर सकते हैं

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