Saya telah melakukan ini menggunakan kombinasi hashlimit TC dan iptables. Saya membuat pembatas bandwidth TC keluar pada antarmuka LAN (untuk menargetkan lalu lintas unduhan) yang disetel ke 5 Mbits/detik. Saya kemudian menggunakan modul hashlimit iptables dalam rantai mangle output antarmuka sehingga jika tingkat paket melebihi ambang tertentu, antara dua alamat IP sumber dan tujuan yang berbeda, ia mulai mengklasifikasikan paket-paket tersebut ke dalam kelas pembentuk lalu lintas TC 5 Mbit/s .
Anda harus menyetel ambang batas paket dengan benar, dan saya mendasarkan milik saya pada fakta bahwa MTU saya adalah 1500 byte jadi gunakan ini untuk menghitung berapa banyak paket per detik yang akan membuat ambang batas 1,5 Mbits per detik (1000 paket/detik ). Ditambah dengan pengaturan nilai burst setinggi mungkin pada modul iptables hashlimit (yang pada pengaturan saya, tampaknya 10.000), hasil dari semua ini adalah unduhan singkat berjalan dengan kecepatan penuh, tetapi unduhan yang lebih lama mulai melambat karena beberapa paket diteruskan ke kelas pembatasan bandwidth TC, yang kemudian jelas menurunkan kecepatan paket, dll. Ini sedikit meretas, tetapi luar biasa berhasil, dan berfungsi dengan baik. Dan karena TC digunakan, tidak ada paket yang dijatuhkan - hanya ditunda dan diperlambat karena didorong ke kelas TC setelah kecepatan paket tercapai.
Ini ada di kotak CentOS 6. Saya pikir hal-hal yang lebih modern memungkinkan modul hashlimit untuk mendukung byte per detik, bukan hanya paket per detik, yang bahkan lebih baik, tetapi saya mencoba ini pada pengaturan saya dan hanya kembali menggunakan paket per detik.
Saya baru saja menggunakan ponsel jadi tidak dapat menempelkan konfigurasi apa pun, tetapi jika Anda ingin beberapa contoh, beri tahu saya dan saya akan mengedit jawaban ini. Saya sangat menyukai solusi ini karena batasan yang saya gunakan didasarkan pada IP sumber dan tujuan. Jadi sistem melihat setiap kombinasi IP src+dst yang berbeda sebagai aliran paketnya sendiri untuk dibatasi. Modul hashlimit juga mendukung port sumber dan tujuan (pada dasarnya kombinasi IP sumber, port sumber, IP tujuan, port tujuan), sehingga Anda bahkan dapat melakukan pembatasan per sesi antara IP sumber+port dan IP+port tujuan .
PEMBARUAN
Jadi di bawah ini kira-kira bagaimana Anda melakukannya; eksperimen akan diperlukan.
tc:
/sbin/tc qdisc add dev eth0 root handle 1: htb
/sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 5Mbit
iptables:
#!/bin/bash
[[ "$1" =~ ^[ADI]$ ]] || exit 1
for IPT in /sbin/ip{,6}tables
do
$IPT -t mangle -$1 POSTROUTING -o eth0 -m hashlimit --hashlimit-above 1000/second --hashlimit-burst 10000 --hashlimit-mode srcip,dstip --hashlimit-name limiter -j CLASSIFY --set-class 1:1
done
Anda dapat mengatasi masalah ini dengan cara sederhana, coba gunakan modul terbaru dengan iptables, lacak alamat sumber terbaru:
iptables -m recent -h
recent match options:
[!] --set Add source address to list, always matches.
[!] --rcheck Match if source address in list.
[!] --update Match if source address in list, also update last-seen time.
[!] --remove Match if source address in list, also removes that address from list.
--seconds seconds For check and update commands above.
Specifies that the match will only occur if source address last seen within
the last 'seconds' seconds.
--reap Purge entries older then 'seconds'.
Can only be used in conjunction with the seconds option.
--hitcount hits For check and update commands above.
Specifies that the match will only occur if source address seen hits times.
May be used in conjunction with the seconds option.
--rttl For check and update commands above.
Specifies that the match will only occur if the source address and the TTL
match between this packet and the one which was set.
Useful if you have problems with people spoofing their source address in order
to DoS you via this module.
--name name Name of the recent list to be used. DEFAULT used if none given.
--rsource Match/Save the source address of each packet in the recent list table (default).
--rdest Match/Save the destination address of each packet in the recent list table.
--mask netmask Netmask that will be applied to this recent list.
contoh untuk memblokir ssh brute force:
iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --set
iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --rcheck --seconds 30 --hitcount 2 -j DROP