Apache 2: SetEnvIf "Rentang IP"

10

Dalam konfigurasi Apache saya, saya ingin mengatur variabel lingkungan jika saya melihat bahwa pengunjung berasal dari rentang IP tertentu. Saat ini saya melakukannya dengan cara ini:

SetEnvIfNoCase Remote_Addr "^194\.8\.7[45]\." banned=spammer-ip
SetEnvIfNoCase Remote_Addr "^212\.156\.170\." banned=spammer-ip

Yang saya inginkan adalah sesuatu seperti ini:

SetEnvIfIpRange 194.8.74.0/23 banned=spammer-ip
SetEnvIfIpRange 212.156.170.0/24 banned=spammer-ip

... karena saya berpikir bahwa mengubah alamat IP menjadi sebuah string dan kemudian melakukan ekspresi reguler adalah pemborosan total sumber daya.

Saya bisa melakukan

Deny From 194.8.74.0/23

... tapi kemudian saya tidak mendapatkan variabel yang bisa saya periksa di halaman kesalahan 403 saya - untuk menemukan alasan mengapa akses telah ditolak.

Ada saran yang mungkin saya lewatkan? Apakah ada MOD Apache2 yang dapat mengatur variabel lingkungan berdasarkan "IP Address Ranges"?

BlaM
sumber

Jawaban:

4

Apa yang Anda dapatkan (SetEnvIfNoCase Remote_Addr "^ abc" env_key = env_value) adalah yang terbaik yang akan Anda lakukan dengan mudah. Saya telah melihat gaya konfigurasi ini diimplementasikan pada sekelompok mesin yang banyak dimuat, tanpa penurunan kinerja yang nyata. Saya setuju menggunakan ekspresi reguler, ketika rentang CIDR lebih tepat mengganggu. Anda bisa menulis program kecil untuk secara otomatis menghasilkan konfigurasi dari daftar rentang CIDR.

Jika Anda terbiasa dengan Perl, Anda bisa membuat pengendali modperl, yang akan mengizinkan / menolak permintaan dengan cara apa pun yang Anda pilih. modperl memungkinkan kode Anda dijalankan pada titik yang berbeda di seluruh permintaan HTTP - mod_perl 2.0 HTTP Cycle Fases . PerlAuthzHandler akan menjadi penangan yang tepat untuk digunakan.

Lockie

Lockie
sumber
8

perlu diketahui bahwa variabel yang ditetapkan melalui SetEnv tidak terlihat pada beberapa operasi (lihat matriks):

http://www.onlinesmartketer.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/

solusi Anda adalah

SetEnvIfExpr "-R '10.0.0.0/8' || -R '172.16.0.0/12' || -R '192.168.0.0/16'" rfc1918

lihat https://httpd.apache.org/docs/trunk/mod/mod_setenvif.html#SetEnvIfExpr

Hans-Joachim Kliemeck
sumber
Ini harus menjadi jawaban yang diterima! Itu yang terbaik. Ini juga berfungsi di .htaccess
Jeroen Vermeulen - MageHost
8

Anda dapat menggunakan format CIDR dengan Apache 2.4 yang memungkinkan <If>:

<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
    SetEnv banned = spammer-ip
</If>
Greg
sumber
Terima kasih jawaban anda! Perhatikan bahwa ada bug dalam versi Apache saya, sehingga saya harus menyertakan rentang IP dalam tanda kutip tunggal: mail-archives.apache.org/mod_mbox/httpd-docs/201406.mbox/…
Lucas Cimon
0

Ini sebenarnya bukan solusi untuk beralih dari RegExp ke IP Ranges , tetapi saya menemukan skrip yang bagus yang diselenggarakan oleh Google untuk mengubah rentang IP ke regexp yang cocok. Dapat bermanfaat bagi sebagian dari Anda, juga ...

Bagaimana cara mengecualikan lalu lintas dari berbagai alamat IP?

[Memperbarui]

Sepertinya Google telah menghapus Alat Alamat IP (atau setidaknya tautan yang mereka miliki di situs mereka rusak), tetapi ada alat serupa di sini: http://www.analyticsmarket.com/freetools/ipregex

BlaM
sumber