Nginx set_real_ip_from ที่อยู่ตัวโหลดบาลานซ์ของ AWS ELB


22

ฉันมีชุดเซิร์ฟเวอร์ Nginx ที่อยู่เบื้องหลังโหลดบาลานซ์ของ Amazon ELB ฉันใช้ set_real_ip (จากHttpRealIpModule ) เพื่อให้ฉันสามารถเข้าถึงที่อยู่ IP ไคลเอนต์ต้นทางบนเซิร์ฟเวอร์เหล่านี้ (สำหรับการส่งผ่านไปยัง php-fpm และใช้ในHttpGeoIPModule )

ดูเหมือนว่าset_real_ip_fromในการกำหนดค่า nginx สามารถยอมรับที่อยู่ IP เท่านั้น อย่างไรก็ตามเกี่ยวกับเครื่อง ELB Amazon พูดว่า:

หมายเหตุ: เนื่องจากชุดของที่อยู่ IP ที่เชื่อมโยงกับ LoadBalancer สามารถเปลี่ยนแปลงได้ตลอดเวลาคุณจึงไม่ควรสร้างระเบียน "A" ด้วยที่อยู่ IP ใด ๆ หากคุณต้องการใช้ชื่อ DNS ที่เป็นมิตรสำหรับ LoadBalancer ของคุณแทนชื่อที่สร้างโดยบริการ Elastic Load Balancing คุณควรสร้างระเบียน CNAME สำหรับชื่อ DNS LoadBalancer หรือใช้ Amazon Route 53 เพื่อสร้างโซนโฮสต์ สำหรับข้อมูลเพิ่มเติมให้ดูที่การใช้ชื่อโดเมนพร้อมการโหลดแบบยืดหยุ่น

แต่ถ้าฉันต้องการใส่ที่อยู่ IP ฉันไม่สามารถใช้ CNAME ได้ (ทั้ง amazon หรือของตัวเอง) มีวิธีแก้ไขปัญหานี้หรือไม่?

คำตอบ:


40

หากคุณสามารถรับประกันได้ว่าคำขอทั้งหมดจะมาจาก ELB (ฉันไม่คุ้นเคย) คุณสามารถลอง:

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

นั่นควรบอกให้ nginx เชื่อใจส่วนหัว X-Forwarded-For จากใครก็ได้ ข้อเสียคือถ้าทุกคนเข้าถึงเซิร์ฟเวอร์ของคุณโดยตรงพวกเขาจะสามารถปลอมแปลงส่วนหัว X-Forwarded-For และ nginx จะใช้ที่อยู่ IP ของลูกค้าผิด


2
ขอบคุณ - ฉันไม่ได้ตระหนักถึงฉันจะเพิ่มช่วง IP มี ... ฉันจะตรวจสอบว่ามีเป็นช่วงที่เฉพาะเจาะจงมากขึ้นว่า ELB อาจจะเกี่ยวกับ (ฉันคิดว่า10.0.0.1/8จะทำงานแม้ว่าอาจจะมีบางสิ่งบางอย่างเฉพาะเจาะจงมากขึ้น)
vitch

ฉันได้เพิ่มคำถามเพื่อติดตามว่าใครรู้ช่วงที่ถูกต้อง: serverfault.com/questions/331697/…
vitch

หากเป็น VPC ALB ช่วงของคุณคือ (เหมือน) เหมือนกับช่วงเครือข่ายย่อยของคุณซึ่ง LB เป็นส่วนหนึ่ง
talonx

17

แนวปฏิบัติที่ดีที่สุดในวันนี้คือการใช้ VPC ดังนั้นคุณจะรู้ CIDR ที่แน่นอนสำหรับ ELB ของคุณ จากนั้นคุณสามารถเพิ่มสิ่งนี้ในไฟล์กำหนดค่า Nginx ของคุณ:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;

เห็นว่าเป็นคำถามจาก 2011 เป็นไปได้ว่าไม่มีตัวเลือกนั้น ฉันเพิ่งรวมเครือข่ายส่วนตัวที่เป็นไปได้ทั้งหมดเนื่องจากผู้ใช้ภายนอกจะไม่สามารถเข้าถึงพวกเขาได้อย่างง่ายดาย
Jordan Reiter

7

ใช้ VPC CIDR สำหรับset_real_ip_fromคุณสามารถค้นหาได้ในคอนโซล Amazon ภายใต้ VPC => VPC ของคุณ (แทนที่<your VPC CIDR here>ด้วย):

real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;

4

การตั้งค่าช่วงที่เชื่อถือได้เป็น 0.0.0.0/0 บน Amazon ELB นั้นแน่นอนว่าจะทำให้คุณเดือดร้อน คุณสามารถรับประกันได้ว่าคำขอมาจาก ELB หากคุณสามารถกำหนดค่ากลุ่มความปลอดภัยสำหรับเซิร์ฟเวอร์ nginx ของคุณได้ แต่คำขอดั้งเดิมจะมาจากแหล่งใด ๆ ที่เป็นไปได้ (Amazon ELBs เป็นอินเทอร์เฟซสาธารณะ)

การทดสอบง่ายๆจะเปิดเผยสิ่งนี้:

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

บันทึกในเซิร์ฟเวอร์ nginx ของคุณจะแสดง 1.2.3.4 เป็น IP จริงซึ่งเป็นไฟล์ปลอมแปลง ดูIP Range สำหรับ IP ส่วนตัวภายในของ Amazon ELBสำหรับคำตอบที่ดีกว่า


3
นี่จะเป็นปัญหาเฉพาะเมื่อคุณตั้งค่าreal_ip_recursiveซึ่งไม่ใช่ค่าเริ่มต้นและไม่มีอยู่จริงเมื่อฉันตอบคำถามในตอนแรก
kolbyjack

3

realip_moduleรัฐว่าในกรณีของ X-Forwarded-For โมดูลนี้จะใช้ที่อยู่ IP สุดท้ายใน X-Forwarded-For ส่วนหัวสำหรับการทดแทน โมดูลนี้จะไม่ทำงานเมื่อมีเพียงreal_ip_headerและset_real_ip_formเป็นชุด นี่เป็นเพราะโมดูลนี้จะใช้ที่อยู่ IP พร็อกซีแทน IP ของลูกค้า เพื่อแก้ไขreal_ip_recursiveคำสั่งนี้ควรเปิดใช้งาน

นอกจากนี้หากคุณมีใบรับรอง SSL ที่ปรับใช้และต่ออายุในอินสแตนซ์ (เช่นพูดว่า allowencrypt หรือใบรับรอง certbot) ผู้ออกใบรับรองเหล่านี้อาจพยายามตรวจสอบใบรับรองเหล่านั้นผ่าน IPV6

ดังนั้นสิ่งสำคัญคือต้องมี IPV6 ดังนั้นไฟล์กำหนดค่า Nginx ควรมีที่อยู่ set_real_ip_from 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>;

หากมีข้อ จำกัด ด้านความปลอดภัยเพิ่มเติมเราอาจต้องรวมset_real_ip_fromVPC CIDR (ทั้ง IPV4 และ IPV6) สำหรับเครือข่ายย่อย cloudfront / elb / ec2

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.