Script shell untuk melarang IP

8

Beberapa IP sedang membuka ribuan koneksi server saya. Saya memiliki server Ubuntu 14. Saya memeriksa total koneksi menggunakan perintah berikut:

netstat -an | grep tcp | awk '{print $ 5}' | cut -f 1 -d: | sortir | uniq -c | semacam -n

Lalu saya menggunakan aturan iptables berikut untuk memblokir IP pelakunya.

iptables -Saya INPUT 1 -s xxxx -j DROP

Ini berfungsi dengan baik dan memblokir alamat IP. Namun, saya tidak bisa online 24/7 untuk memantau server. Saya ingin tahu apakah ada skrip Shell yang dapat saya gunakan untuk melakukannya secara otomatis? Sebagai contoh, jika suatu IP membuka lebih dari X jumlah koneksi kapan saja, itu harus secara otomatis dilarang oleh aturan iptables di atas.

pengguna3404047
sumber
6
Pernahkah Anda melihat apakah fail2ban memenuhi kebutuhan Anda?
John1024
Maafkan pengetahuan saya yang terbatas. Bukankah fail2ban untuk otentikasi ssh? Saya tidak yakin untuk menggunakannya di port 80. Selain itu, server saya adalah server obrolan, sehingga pengguna dapat mencoba untuk terhubung / ping beberapa kali. Dalam hal ini, fail2ban akan membuat banyak alarm positif palsu dan melarang lalu lintas yang sah. Adakah pemikiran?
user3404047

Jawaban:

10

Pertama-tama, jangan menemukan kembali kemudi. Itulah tepatnya denyhostsuntuk:

   DenyHosts  is a python program that automatically blocks ssh attacks by
   adding entries to /etc/hosts.deny.  DenyHosts will  also  inform  Linux
   administrators  about  offending  hosts,  attacked users and suspicious
   logins.

Sejauh yang saya tahu, denyhostshanya untuk sshkoneksi tetapi ada juga fail2banyang berurusan dengan hampir semua hal:

   Fail2Ban consists of a client, server and configuration files to  limit
   brute force authentication attempts.

   The  server  program  fail2ban-server is responsible for monitoring log
   files and issuing ban/unban commands.  It  gets  configured  through  a
   simple  protocol  by fail2ban-client, which can also read configuration
   files and issue corresponding configuration commands to the server.

Keduanya tersedia di repositori:

sudo apt-get install denyhosts fail2ban

Anda juga bisa membuat skrip ini, jika mau. Sesuatu seperti:

#!/usr/bin/env sh
netstat -an | 
    awk -vmax=100 '/tcp/{split($5,a,":"); if(a[1] > 0 && a[1]!="0.0.0.0"){c[a[1]]++}}
    END{for(ip in c){if(c[ip]>max){print ip}}}' |
        while read ip; do iptables -I INPUT 1 -s "$ip" -j DROP; done

The awkakan mengekstrak IP dan menghitung mereka dan hanya mencetak orang-orang yang muncul lebih dari maxkali (di sini, -vmax=100, mengubahnya sesuai). IP kemudian diumpankan ke loop sementara yang menjalankan iptablesaturan yang relevan .

Untuk menjalankan ini 24/7, saya akan membuat cronjob yang menjalankan perintah di atas setiap menit atau lebih. Tambahkan baris ini ke/etc/crontab

* * * * * root /path/to/script.sh
terdon
sumber
Terima kasih terdon untuk jawaban yang tepat. AFAIK, fail2ban adalah untuk otentikasi ssh. Semua koneksi sedang dibuka pada port 80. Saya akan mengeksplorasi jika saya dapat menggunakan fail2ban pada port 80. Untuk skrip kustom, bagaimana saya bisa menjalankannya 24/7 di latar belakang? perintah layar? Atau instal cron? BTW. Saya menggunakan server sebagai server obrolan sehingga seseorang dapat melakukan ping berkali-kali (atau membuka banyak koneksi) sehingga saya dapat menggunakan skrip khusus yang Anda berikan.
user3404047
2
@ user3404047 Anda bisa menjalankannya sebagai cronjob, ya. Lihat jawaban yang diperbarui. Namun, fail2banbukan hanya untuk ssh. Ini juga berfungsi dengan baik untuk port 80. Lihat, misalnya di sini , di sini dan di sini .
terdon
1

Opsi alternatif yang mungkin adalah mengidentifikasi dan menangani masalah alamat IP semua dalam aturan iptables yang ditetapkan, menggunakan recentmodul. Tantangan dengan metode ini adalah batas hitcount default 20, jadi kita harus menyimpang dari default atau membuat penghitung carry level yang lebih tinggi untuk mencapai titik pemicu hitcount yang lebih tinggi.

Contoh di bawah ini dari set aturan iptables saya, dan akan mencekal alamat ip hanya selama 1 hari jika itu membuat 80 koneksi TCP baru pada port 80 dalam waktu kurang dari 12 menit. Setelah masuk daftar orang jahat, setiap upaya untuk terhubung akan mengatur ulang penghitung 1 hari menjadi 0. Metode ini bisa mencapai maksimum 400 hit sebelum ekspansi ke carry lain akan diperlukan (dan saya telah menguji rantai carry lain). Perhatikan bahwa kode yang diposting memiliki infrastruktur yang hanya digunakan untuk melarang waktu yang lama pada beberapa pemicu waktu yang lebih singkat. Saat ini, saya sudah mengatur untuk hanya melarang untuk waktu yang lama pada pemicu pertama.

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in4
#
# A NEW Connection on port 80 part 4.
#
# multiple hits on the banned list means you get a one day ban.
# (I re-load the firewall rule set often, so going longer makes
# little sense.)
#
# Custom tables must exist before being referenced, hence the order
# of these sub-toutines.
#
# Place holder routine, but tested. Logs if a day ban would have
# been activated.
#
$IPTABLES -N http-new-in4
#$IPTABLES -A http-new-in4 -m recent --set --name HTTP_BAN_DAY

$IPTABLES -A http-new-in4 -j LOG --log-prefix "DAY80:" --log-level info
$IPTABLES -A http-new-in4 -j DROP

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in3
#
# A NEW Connection on port 80 part 3.
#
# carry forward to the actual banned list:
# Increment this count. Leave the previous count.
#
# Custom tables must exist before being referenced, hence the order
# of these sub-toutines.
#
$IPTABLES -N http-new-in3
$IPTABLES -A http-new-in3 -m recent --remove --name HTTP_02
$IPTABLES -A http-new-in3 -m recent --update --hitcount 1 --seconds 86400 --name HTTP_BAN -j http-new-in4
$IPTABLES -A http-new-in3 -m recent --set --name HTTP_BAN

$IPTABLES -A http-new-in3 -j LOG --log-prefix "BAN80:" --log-level info
$IPTABLES -A http-new-in3 -j DROP

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in2
#
# A NEW Connection on port 80 part 2.
#
# carry forward from previous max new connections per unit time:
# Increment this count and clear the lesser significant count.
#
$IPTABLES -N http-new-in2
$IPTABLES -A http-new-in2 -m recent --remove --name HTTP_01
$IPTABLES -A http-new-in2 -m recent --update --hitcount 3 --seconds 720 --name HTTP_02 -j http-new-in3
$IPTABLES -A http-new-in2 -m recent --set --name HTTP_02

$IPTABLES -A http-new-in2 -j LOG --log-prefix "CARRY80:" --log-level info
$IPTABLES -A http-new-in2 -j ACCEPT

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in
#
# A NEW Connection on port 80:
#
$IPTABLES -N http-new-in

echo Allowing EXTERNAL access to the WWW server

# . check the static blacklist.
#
# http related
$IPTABLES -A http-new-in -i $EXTIF -s 5.248.83.0/24 -j DROP
... delete a bunch on entries ...
$IPTABLES -A http-new-in -i $EXTIF -s 195.211.152.0/22 -j DROP
$IPTABLES -A http-new-in -i $EXTIF -s 198.27.126.38 -j DROP

# . check the dynamic banned list
#
# The 1 Hour banned list (bumped to more than a day):
$IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j LOG --log-prefix "LIM80:" --log-level info
$IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j DROP

# A generic log entry. Usually only during degugging
#
#$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80ALL:" --log-level info

# Dynamic Badguy List. Least significant hit counter.  Detect and DROP Bad IPs that do excessive connections to port 80.
#
$IPTABLES -A http-new-in -m recent --update --hitcount 20 --seconds 240 --name HTTP_01 -j http-new-in2
$IPTABLES -A http-new-in -m recent --set --name HTTP_01

$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80:" --log-level info
$IPTABLES -A http-new-in -j ACCEPT

... a bunch of stuff not included here

# Allow any related traffic coming back to the server in.
#
#
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT

... the above is needed before the below ...

# If required, go to NEW HTTP connection sub-routine
#
$IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 80 -j http-new-in
Doug Smythies
sumber