Nginx set_real_ip_dari alamat penyeimbang beban AWS ELB

22

Saya memiliki satu set server Nginx di belakang penyeimbang beban ELB Amazon. Saya menggunakan set_real_ip (dari HttpRealIpModule ) sehingga saya dapat mengakses alamat IP klien asal pada server ini (untuk melewati ke php-fpm dan untuk digunakan dalam HttpGeoIPModule ).

Tampaknya set_real_ip_fromdalam konfigurasi nginx hanya dapat menerima alamat IP. Namun, berkaitan dengan mesin ELB Amazon mengatakan:

Catatan: Karena set alamat IP yang terkait dengan LoadBalancer dapat berubah dari waktu ke waktu, Anda tidak boleh membuat catatan "A" dengan alamat IP tertentu. Jika Anda ingin menggunakan nama DNS yang ramah untuk LoadBalancer Anda alih-alih nama yang dihasilkan oleh layanan Elastic Load Balancing, Anda harus membuat catatan CNAME untuk nama DNS LoadBalancer, atau menggunakan Amazon Route 53 untuk membuat zona yang dihosting. Untuk informasi lebih lanjut, lihat Menggunakan Nama Domain Dengan Penyeimbangan Beban Elastis

Tetapi jika saya perlu memasukkan alamat IP saya tidak dapat menggunakan CNAME (baik milik amazon atau milik saya). Apakah ada solusi untuk masalah ini?

Vitch
sumber

Jawaban:

40

Jika Anda dapat menjamin bahwa semua permintaan akan datang dari ELB (Saya tidak terbiasa dengannya), Anda dapat mencoba:

real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;

Itu harus memberitahu nginx untuk mempercayai header X-Forwarded-For dari siapa pun. The downside adalah bahwa jika ada orang yang secara langsung mengakses server Anda, mereka akan dapat menipu header X-Forwarded-For dan nginx akan menggunakan alamat ip klien yang salah.

kolbyjack
sumber
2
Terima kasih - saya tidak menyadari bahwa saya dapat menambahkan rentang IP di sana ... Saya akan memeriksa apakah ada rentang yang lebih spesifik pada ELB (saya pikir 10.0.0.1/8akan berfungsi meskipun mungkin ada sesuatu yang lebih spesifik)
vitch
Saya menambahkan pertanyaan tindak lanjut untuk mengetahui apakah ada yang tahu kisaran yang valid: serverfault.com/questions/331697/…
vitch
Jika itu adalah VPC ALB, rentang Anda sama dengan rentang subnet Anda yang LB merupakan bagiannya.
talonx
17

Praktik terbaik hari ini adalah menggunakan VPC, jadi, Anda akan mengetahui CIDR yang tepat untuk ELB Anda. Kemudian, Anda dapat menambahkan sesuatu seperti ini ke file konfigurasi Nginx Anda:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;
nikolay
sumber
Melihat pertanyaannya adalah dari 2011, kemungkinan opsi itu tidak tersedia saat itu. Saya hanya menyertakan semua jaringan pribadi yang mungkin karena pengguna luar tidak akan mendapatkannya dengan mudah.
Jordan Reiter
7

Gunakan VPC CIDR untuk set_real_ip_fromAnda dapat menemukannya di konsol Amazon di bawah VPC => VPC Anda (ganti <your VPC CIDR here>dengan itu):

real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;
Alexander Paramonov
sumber
4

Mengatur rentang tepercaya ke 0.0.0.0/0 di Amazon ELB pasti akan membuat Anda mendapat masalah. Anda dapat menjamin bahwa permintaan berasal dari ELB jika Anda dapat mengkonfigurasi grup keamanan untuk server nginx Anda, tetapi permintaan asli akan berasal dari sumber yang memungkinkan (Amazon ELB adalah antarmuka publik).

Tes sederhana akan mengungkapkan ini:

curl --header "X-Forwarded-For: 1.2.3.4" "http://your-elb-dns-address/"

Log pada server nginx Anda kemudian akan menampilkan 1.2.3.4 sebagai IP asli, yang merupakan spoofed. Lihat Rentang IP untuk IP pribadi internal Amazon ELB untuk jawaban yang lebih baik.

Bahkan André Fiskvik
sumber
3
Ini hanya akan menjadi masalah jika Anda mengaktifkan real_ip_recursive aktif, yang bukan default, dan bahkan tidak ada ketika saya awalnya menjawab pertanyaan.
kolbyjack
3

The realip_module menyatakan bahwa dalam kasus X-Forwarded-For, modul ini menggunakan alamat ip terakhir di X-Forwarded-For header untuk penggantian. Modul ini tidak akan berfungsi hanya saat real_ip_headerdan set_real_ip_formsudah diatur. Ini karena modul ini akan menggunakan alamat IP proxy alih-alih IP klien. Untuk mengatasi real_ip_recursivearahan ini harus diaktifkan.

Lebih lanjut, jika Anda memiliki sertifikat SSL yang digunakan dan diperpanjang pada contoh (seperti katakan mari kita enkripsi atau sertifikat certbot). Otoritas sertifikat ini mungkin mencoba memvalidasi sertifikat tersebut melalui IPV6.

Jadi penting juga untuk memiliki IPV6. Jadi file konfigurasi Nginx juga harus berisi set_real_ip_dari alamat IPV6.

real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from <your VPC IPV4 CIDR here>;
set_real_ip_from <your VPC IPV6 CIDR here>;

jika pembatasan keamanan tambahan berlaku, kami mungkin juga perlu menyertakan set_real_ip_fromVPC CIDR (baik IPV4 dan IPV6) untuk subnet cloudfront / elb / ec2.

Harish Chennamsetty
sumber