Bagaimana cara membuat aturan iptables kedaluwarsa?

18

Seseorang mengatakan kepada saya bahwa ini mungkin, tetapi saya tidak dapat menemukan apa pun di google atau halaman manual.

Saya perlu melarang IP untuk jangka waktu tertentu, dan kemudian membatalkannya secara otomatis.

HappyDeveloper
sumber

Jawaban:

18

Jika Anda bermaksud iptables untuk menghapus aturan dengan sendirinya, Anda tidak akan bisa melakukannya, sejauh yang saya tahu. Apa tujuan dari ini? Jika Anda memerlukan semacam pelarangan sementara otomatis solusi standarnya adalah fail2ban .

Atau Anda dapat menggunakan pekerjaan cron untuk menghapus aturan yang Anda tambahkan, atau, lebih baik jika Anda ingin melakukannya secara interaktif, suatu atpekerjaan:

iptables -I INPUT -s 192.168.1.100 -j DROP
echo "iptables -D INPUT -s 192.168.1.100 -j DROP" | at @10pm 

Lihat juga recentmodul iptables. Ini dengan yang --secondspilihan mungkin bisa membantu, tergantung pada kebutuhan Anda yang sebenarnya. man iptablesuntuk informasi lebih lanjut.

Eduardo Ivanec
sumber
oh wow pekerjaan 'at' terlihat hebat. Bisakah saya menggabungkannya dengan nohup dan &? Bagaimana?
HappyDeveloper
Tidak perlu menggunakan nohup - at the job dijalankan secara independen dari terminal yang Anda gunakan untuk membuatnya. Ini berarti dijalankan di shell yang tidak mewarisi variabel lingkungan Anda, dan, /bin/shsecara default. Tapi itu mungkin tidak akan menjadi masalah dalam kasus ini.
Eduardo Ivanec
9

Letakkan komentar dengan cap waktu (mungkin beberapa detik sejak zamannya) dalam aturan. Sapu berkala untuk aturan kedaluwarsa.

Perhatikan bahwa kernel linux terbaru memiliki dukungan untuk pemuatan dinamis alamat IP ke dalam cache yang dikonsultasikan oleh aturan iptable dan bukan sebagai aturan iptables langsung.

Contoh:

iptables  -A INPUT -s 192.168.200.100/32 -m comment --comment "expire=`date -d '+ 5 min' +%s`" -j DROP 
iptables -L INPUT -n --line-numbers | tac | perl -ne 'next unless /(^\d+).*expire=(\d+)/; if ($2 < time) { print "iptables -D INPUT $1\n"; }'

Tentu saja Anda bisa iptables -D INPUT $1daripada mencetak perintah.

Seth Robertson
sumber
ide yang hebat. Tidak yakin bagaimana melakukan bagian penyapuan, saya akan berpikir ..
HappyDeveloper
+1 Ide yang sangat bagus, mungkin bukan yang paling sederhana tapi jelas rapi.
Kyle Smith
1
@ HappyDeveloper: Contoh yang disediakan untuk add / sweep
Seth Robertson
1
Haha Saya hanya harus melakukan ini juga, saya menggunakan awk untuk pembersihan: di iptables -L FORWARD --line-numbers | sort -r | awk 'substr($8,1,4) == "exp@" && substr($8,5) < systime() { systems("iptables -D FORWARD " $1) }'mana aturan dibuat seperti:iptables -A FORWARD -j DROP -m comment --comment "exp@EPOCH"
Kyle Smith
2 sen saya di perl:iptables -L FORWARD --line-numbers | tac | perl -walne 'system "iptables -D FORWARD $F[0]" if $F[-2] =~ /^expire=(\d+)$/ and $1<time()'
tuomassalo
5

iptables memiliki metode untuk secara otomatis menambahkan alamat IP ke daftar jika kondisi yang ditentukan pengguna terpenuhi. Saya menggunakan yang berikut ini untuk membantu menghindari upaya peretasan otomatis ke port ssh saya:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name ssh --seconds 60 --reap -j DROP

Ini membantu membatasi upaya otomatis untuk mendapatkan akses ke server dengan membatasi upaya koneksi dari alamat IP yang sama ke setiap 60 detik.

Jika Anda ingin mengizinkan sejumlah upaya dalam rentang waktu tertentu, seperti 4 dalam 5 menit, dan jika gagal maka daftar hitam untuk jangka waktu yang lebih lama, seperti 24 jam, Anda dapat melakukan sesuatu seperti:

iptables -X black
iptables -N black
iptables -A black   -m recent --set   --name blacklist   -j DROP

iptables -X ssh
iptables -N ssh
iptables -I ssh 1   -m recent --update    --name blacklist   --reap   --seconds 86400     -j DROP
iptables -I ssh 2   -m recent --update    --name timer       --reap   --seconds   600     --hitcount 4   -j black
iptables -I ssh 3   -m recent --set       --name timer   -j ACCEPT

iptables -A INPUT   -p TCP --dport ssh   -m state --state NEW -j ssh

Di atas, kami membuat 2 rantai; "ssh" dan "black", dan 2 daftar; "timer", dan "daftar hitam".

Secara singkat; rantai terakhir yang ditunjukkan di atas adalah "pintu" ke dalam rantai ssh.

  • Aturan 1 dalam rantai ssh akan memeriksa untuk melihat apakah IP sumber ada dalam daftar "daftar hitam". Jika demikian, koneksi terputus dan timer blacklist 24 jam dihidupkan ulang. Jika aturan 1 salah, maka kita pergi ke aturan 2.
  • Aturan 2 dalam rantai ssh akan memeriksa untuk melihat apakah IP sumber telah melakukan lebih dari 4 upaya koneksi dalam 5 menit. Jika demikian, ia mengirim paket ke rantai "hitam" di mana ia ditambahkan ke daftar "daftar hitam". Rantai "hitam" lalu DROP koneksi, dan kita selesai.
  • Aturan 3 dalam rantai "ssh" hanya tercapai jika aturan 1 dan 2 salah. Jika demikian, paket tersebut DITERIMA dan IP sumber ditambahkan ke daftar "timer" sehingga kami dapat memantau frekuensi upaya koneksi.

Opsi "--reap" memberitahu kernel untuk mencari melalui daftar dan membersihkan semua item yang lebih tua dari batas waktu yang ditentukan; 5 menit untuk daftar "timer", dan 24 jam untuk daftar "blacklist".

Catatan: ruang tambahan untuk keterbacaan, dan opsional dalam skrip shell Anda.

Lembah kecil
sumber
3

IPTables memiliki fitur yang dibuat khusus untuk ini: IP Set. Anda membuat aturan sekali dan tetap seperti biasa tetapi memeriksa dalam satu set ips (atau port) untuk kecocokan. Yang keren adalah set ini dapat diperbarui secara dinamis dan efisien tanpa mengganggu sisa firewall.

Situs web utama , contoh .

Jadi, untuk menggunakannya, Anda masih harus menggunakan atatau cronuntuk menjadwalkan penghapusan.

Allen
sumber
2

Anda dapat menggunakan fail2ban untuk mencekal alamat ip dan mengonfigurasi lamanya waktu alamat akan diblokir.

user9517 mendukung GoFundMonica
sumber
2

Seperti yang telah dikatakan seseorang: Anda harus menggunakan ipset untuk fitur ini.

ipset dapat menambahkan alamat ip dengan nilai batas waktu. Ketika batas waktu berakhir, catatan akan dihapus secara otomatis dari ipset.

timeout All set types supports the optional timeout parameter when creating a set and adding entries. The value of the timeout parameter for the create command means the default timeout value (in seconds) for new entries. If a set is created with timeout support, then the same timeout option can be used to specify non-default timeout values when adding entries. Zero timeout value means the entry is added permanent to the set. The timeout value of already added elements can be changed by readding the element using the -exist option. Example: ipset create test hash:ip timeout 300 ipset add test 192.168.0.1 timeout 60 ipset -exist add test 192.168.0.1 timeout 600

http://ipset.netfilter.org/ipset.man.html

Ini adalah cara yang lebih baik untuk mengendalikan perilaku ini.

Navern
sumber
0

Saya perlu melarang IP untuk jangka waktu tertentu, dan kemudian membatalkannya secara otomatis.

Anda dapat mencoba yang berikut ini

# iptables -I INTPUT -s xxx.xxx.xxx.xxx -m time --utc --datestart 2013-09-09T15:00 --datestop 2013-09-09T15:30 -j DROP
ALex_hha
sumber
0

Bergantung pada apa yang ingin Anda capai, netfilter terkini atau modul waktu dapat digunakan untuk melakukannya.

Keduanya didokumentasikan di halaman manual iptables .

TimS
sumber