Saya telah menemukan sebuah situasi di mana seorang klien perlu memasukkan satu set daftar kurang dari 1 juta alamat IP individual (tidak ada subnet), dan kinerja jaringan menjadi perhatian. Sementara saya akan menduga bahwa aturan IPTables akan memiliki lebih sedikit dampak kinerja daripada rute, itu hanya dugaan.
Apakah ada yang punya bukti kuat atau pembenaran lain untuk memilih IPTable atau null routing sebagai solusi untuk daftar hitam daftar panjang alamat IP? Dalam hal ini semuanya otomatis, jadi kemudahan penggunaan tidak terlalu menjadi perhatian.
EDIT 26-Nov-11
Setelah beberapa pengujian dan pengembangan, tampaknya tidak satu pun dari opsi ini bisa dikerjakan. Tampaknya kedua pencarian rute dan iptables melakukan pencarian linear melalui ruleet, dan terlalu lama untuk memproses banyak aturan ini. Pada perangkat keras modern, menempatkan item 1M dalam daftar hitam iptables memperlambat server menjadi sekitar 2 lusin paket per detik. Jadi IPTable dan null rute keluar.
ipset
, seperti yang direkomendasikan oleh Jimmy Hedman, akan sangat bagus, kecuali bahwa itu tidak memungkinkan Anda untuk melacak lebih dari 65536 alamat dalam satu set, jadi saya bahkan tidak dapat mencoba menggunakannya kecuali seseorang memiliki ide.
Tampaknya satu-satunya solusi untuk memblokir banyak IP ini adalah melakukan pencarian indeks di lapisan aplikasi. Bukan begitu?
Informasi Lebih Lanjut:
Kasus penggunaan dalam kasus ini memblokir daftar "alamat yang diketahui melanggar" dari alamat IP dari mengakses konten statis di server web. FWIW, melakukan pemblokiran melalui Apache Deny from
sama lambatnya (jika tidak lebih) karena ia juga melakukan pemindaian linier.
FYI: Solusi kerja terakhir adalah menggunakan mod_rewrite apache bersama dengan peta DB berkeley untuk melakukan pencarian terhadap daftar hitam. Sifat terindeks DB berkeley memungkinkan daftar untuk skala dengan kinerja O (log N).
Jawaban:
coba gunakan iptables dan bangun pohon multi-level untuk mengurangi jumlah pencarian.
dan seterusnya - menambahkan tingkat bersarang; jelas Anda akan memerlukan cara otomatis untuk membangun aturan dan Anda harus memiliki rantai hanya untuk jaringan di mana Anda memiliki satu atau lebih pelanggar - dengan cara ini Anda dapat mengurangi jumlah pencarian yang harus dilakukan cukup signifikan dan saya pikir itu mungkin sebenarnya bekerja.
sumber
Ini tepat untuk apa
ipset
.Dari situs webnya http://ipset.netfilter.org/ :
Jika Anda menghendaki
maka ipset mungkin menjadi alat yang tepat untuk Anda.
Ini ditulis oleh anggota tim inti netfilter Jozsef Kadlecsik (yang juga menulis target TOLAK) jadi ini adalah pilihan terbaik yang bisa saya pikirkan.
Bahkan termasuk dalam kernel baru-baru ini.
sumber
H * 40byte + (N/4 + N%4) * 4 * element size
yang mencapai sekitar 64MB untuk alamat 1M dalam hash slot 1,5m. Menggunakan solusi apache / berkdb menyimpan data pada disk dan hanya memuat halaman alamat aktif.Saya belum mengujinya sendiri, tetapi ketika saya mendengar deskripsi masalah Anda, saya langsung berpikir "
pf
" (seperti dari OpenBSD).pf
memiliki konsep tabel alamat yang mungkin hanya apa yang Anda cari.Menurut beberapa penelitian yang sangat sepintas yang saya lakukan, tampaknya ini memiliki potensi untuk skala yang lebih baik daripada
ipset
. Menurut bab FAQ PF tentang Opsi Runtime , di luar kotak tanpa tuning, pf mendukung total 1.000 tabel, dengan total 200.000 entri di semua tabel secara default. (100.000 jika sistem memiliki <100MB memori fisik). Ini membuat saya percaya bahwa paling tidak pantas mempertimbangkan mencoba untuk menguji ini untuk melihat apakah itu bekerja pada tingkat berguna apa pun.Tentu saja, saya berasumsi Anda menjalankan server Anda di Linux, jadi Anda harus memiliki kotak firewall terpisah yang menjalankan beberapa OS dengan pf (seperti OpenBSD atau FreeBSD). Anda mungkin juga dapat meningkatkan throughput dengan menghilangkan semua jenis penyaringan paket stateful sama sekali.
sumber
Sudahkah Anda menyelidiki menggunakan FIB_TRIE alih-alih FIB_HASH.
FIB_TRIE seharusnya skala jauh lebih baik untuk jumlah awalan Anda. (/ 32-an null rute masih awalan, hanya sangat spesifik)
Anda mungkin perlu mengkompilasi kernel Anda sendiri untuk menggunakannya, tetapi itu membantu.
FIB_TRIE Catatan
sumber
Untuk keturunan: menurut
ipset
dokumen ukuran default dari set adalah 65536, ini dapat diubah dengan opsi.Saya meletakkan ini di sini karena saya belum bisa berkomentar.
sumber
Beberapa catatan bermanfaat bagi siapa saja yang menemukan masalah ini di masa mendatang:
Pertama-tama, jangan menganalisis lalu lintas apa pun yang tidak perlu Anda lakukan. Jika Anda memblokir lalu lintas TCP, misalnya, hanya filter paket SYN, dengan cara itu Anda hanya menekan filter sekali per koneksi. Anda dapat menggunakan
-m state
jika Anda mau, tetapi pelacakan koneksi memiliki overhead sendiri yang mungkin ingin Anda hindari jika kinerja merupakan masalah.Kedua, memasukkan sejuta aturan ke iptables membutuhkan waktu yang lama: beberapa menit. Jika Anda perlu melacak banyak entitas itu, sebaiknya Anda tetap keluar dari netfliter. Ukuran tipis dari peraturan memang membuat perbedaan.
Ketiga, tujuannya adalah untuk menghindari pemindaian linear; tapi sayangnya, kedua iptables dan iproute2 secara inheren linier. Anda dapat membagi aturan menjadi gaya pohon biner menjadi sejumlah besar rantai yang membatasi jumlah aturan yang harus Anda baca, tetapi meskipun demikian, iptables tidak cocok untuk ukuran masalah ini. Ini akan berhasil , tetapi itu adalah pemborosan sumber daya yang berharga.
Keempat, dan yang paling penting, mendorong beban kerja Anda ke userspace bukanlah ide yang buruk. Ini memungkinkan Anda untuk menulis kode ketat Anda sendiri atau menggunakan solusi off-the-shelf yang disetel ke set masalah Anda. Solusi saya sendiri untuk masalah ini, seperti yang disebutkan, adalah menggunakan pencarian BDB yang dipicu melalui sistem mod_rewrite apache. Ini memiliki manfaat tambahan dengan memicu hanya satu pencarian per sesi, dan hanya setelah permintaan yang valid diajukan. Dalam hal ini, kinerjanya sangat cepat dan biaya pemblokiran hampir dapat diabaikan.
Anda dapat melakukan manipulasi userspace serupa dengan iptables dengan menggunakan
-j QUEUE
target bersamaanlibnetfilter_queue
. Alat ini sangat kuat, sederhana, dan tidak terdokumentasi dengan baik. Saya akan merekomendasikan membaca sebanyak mungkin dari banyak sumber yang dapat Anda temukan, karena ada banyak bahan menarik yang tersebar di web yang bukan merupakan bagian dari dokumentasi resmi apa pun.sumber