Saya mencoba membatasi akses ke sumber daya di balik Nginx berdasarkan IP klien yang diteruskan dalam header X-forwarded-for. Nginx berjalan dalam wadah pada Kubernetes Cluster di Google Cloud Platform dan ips klien nyata diteruskan dalam header x-diteruskan-hanya untuk header
Sejauh ini saya sudah berhasil melakukannya untuk satu IP dengan kode berikut:
set $allow false;
if ($http_x_forwarded_for ~* 123.233.233.123) {
set $allow true;
}
if ($http_x_forward_for ~* 10.20.30.40) {
set $allow false;
}
if ($allow = false) {
return 403;
}
Tetapi bagaimana saya bisa melakukan itu untuk seluruh rentang IP? Menentukan ratusan IP dengan tangan tidak masuk akal.
Semua bantuan dihargai
location / { real_ip_header X-Forwarded-For; set_real_ip_from 10.0.0.0/8; real_ip_recursive on; allow xxx.xxx.xxx.xxx;
X-Forwarded-For: <unverified IP(s)>, <immediate client IP>, <global forwarding rule external IP>, <proxies running in GCP> (requests only)
Entri <direct client IP> adalah klien yang terhubung langsung ke load balancer.<global forwarding rule external IP>
dan<proxies running in GCP>
dan menambahkanset_real_ip_from
pernyataan yang mencakup semuanya.<global forwarding rule external IP>
adalah ip eksternal dari layanan saya, tidak ada proksi lain di GCP, pada log nginx saya, saya melihat permintaan dalam format berikut di[31/Jul/2017:20:05:46 +0000] "GET / HTTP/1.1" 403 169 "-" "curl/7.54.0" "aaa.aaa.aaa.aaa, bbb.bbb.bbb.bbb, ccc.ccc.ccc.ccc"
mana ccc.ccc.ccc.ccc adalah aturan penerusan global, bbb.bbb.bbb.bbb klien langsung ip - cocok dengan yang saya lihat di whatsmyip.org. Adakah peluang Anda untuk menyarankan cara mengekstrak bagian itu?set_real_ip_from
untuk semua alamat di sebelah kanan alamat yang ingin Anda izinkan / tolak. Seperti yang ditunjukkan direal_ip_recursive
bagian ini.Jawaban Richard sudah berisi informasi tentang cara terbaik mendapatkan alamat IP asli ke nginx.
Sementara itu, apa yang muncul pada pertanyaan menentukan rentang IP, Anda dapat menggunakan http://nginx.org/en/docs/http/ngx_http_geo_module.html .
The
geo
modul bekerja sepertimap
modul, yaitu, variabel akan ditugaskan nilai tergantung pada nilai alamat IP.Sebuah contoh:
Di sini kita menetapkan
geo
peta, di mana nilai default untuk$allow
adalah 0. Jika alamat IP di subnet192.168.168.0/24
, maka$allow
akan mendapatkan nilai 1, dan permintaan diizinkan.Anda dapat memiliki banyak baris di
geo
blok yang Anda butuhkan untuk menentukan rentang IP Anda.sumber
real_ip_recursive on;
bawah iniset_real_ip_from
tetapi tidak ada bedanyaX-Forwarded-For
tajuk Anda memiliki tiga alamat terpisah, yaitu permintaan datang melalui beberapa proksi? Apakah Anda memiliki header lain di sana yang dapat Anda gunakan, yang hanya berisi IP klien?X-Forwarded-For
header. Selain menambahkanreal_ip_recursive on
Anda juga perlu menambahkanset_real_ip_from
arahan untuk setiap alamat IP server tepercaya dalam rantai proxy Anda. Nginx kemudian akan bekerja melalui masing-masing arahan ini dan mengembalikan IP klien sebagai nilai pertama yang hits diX-Forwarded-For
header yang tidak cocok denganset_real_ip_from
nilai yang Anda tentukanBuat ini bekerja untukku.
Ref: http://nginx.org/en/docs/http/ngx_http_geo_module.html
sumber