Score:3

ฉันจะทำให้ nginx ไม่แทนที่ x-forwarded-for เมื่อพร็อกซีได้อย่างไร

ธง cn

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

ฉันมีสิ่งนี้ในการกำหนดค่า nginx:

/etc/nginx/conf.d/real_ip.conf
set_real_ip_from {{ปอนด์ IP}};
real_ip_header X-Real-IP;
real_ip_recursive บน;

และนี่คือโฮสต์เสมือน:

เซิร์ฟเวอร์ {
    ฟัง 443 ssl;
    ฟัง [::]:443 ssl;
    server_name *.domain โดเมน;
    รวม /etc/nginx/snippets/domain_ssl.conf;

  add_header X-Nginx-Debug "สวัสดี";

  เปิด proxy_pass_request_headers;

  ที่ตั้ง    / {
    เปิด proxy_pass_request_headers;
    proxy_pass http://คอนเทนเนอร์-php;
    proxy_http_version 1.1;
    proxy_set_header อัพเกรด $http_upgrade;
    proxy_set_header การเชื่อมต่อ "อัพเกรด";
    proxy_set_header โฮสต์ $http_host;
    proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
    proxy_set_header X-Remote-Addr $remote_addr;
    proxy_set_header X-Real-IP $http_x_real_ip;
    proxy_set_header X-Header-Test "Hello World - $http_x_forwarded_for";
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

แต่สิ่งที่ฉันได้รับจากคอนเทนเนอร์คือ:

อาร์เรย์ (19) {
  ["การเชื่อมต่อ"]=>
  สตริง (7) "อัปเกรด"
  ["โฮสต์"]=>
  สตริง (19) "โดเมน"
  ["X-ส่งต่อ-สำหรับ"]=>
  สตริง (12) "{{LB IP}}"
  ["X-Header-Test"]=>
  สตริง (13) "สวัสดีชาวโลก -"
  ["X-Forwarded-Proto"]=>
  สตริง (5) "https"
  ["การควบคุมแคช"]=>
  สตริง (9) "อายุสูงสุด = 0"
  ["sec-ch-ua"]=>
  string(64) "" ไม่ใช่;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97""
  ["sec-ch-ua-mobile"]=>
  สตริง (2) "?0"
  ["sec-ch-ua-platform"]=>
  สตริง (9) "" Windows ""
  ["คำขออัปเกรดที่ไม่ปลอดภัย"]=>
  สตริง(1) "1"
  ["ตัวแทนผู้ใช้"]=>
  string(114) "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML เช่น Gecko) Chrome/97.0.4692.71 Safari/537.36"
  ["ยอมรับ"]=>
  string(135) "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v =b3;q=0.9"
  ["sec-fetch-site"]=>
  สตริง (4) "ไม่มี"
  ["โหมดดึงข้อมูลวินาที"]=>
  สตริง (8) "นำทาง"
  ["sec-fetch-user"]=>
  สตริง (2) "?1"
  ["sec-fetch-dest"]=>
  สตริง (8) "เอกสาร"
  ["ยอมรับการเข้ารหัส"]=>
  สตริง (17) "gzip, ยุบ, br"
  ["ยอมรับภาษา"]=>
  สตริง (26) "en-GB,en-US;q=0.9,en;q=0.8"
}

โดยเฉพาะอย่างยิ่ง X-Real-IP, X-Fowarded-For ดูเหมือนจะไม่ได้รับการตั้งค่า และไม่ได้ตั้งค่า remote_addr ไฟล์ที่ให้บริการโดยตรงจาก nginx มีการตั้งค่า x-forwarded-for อย่างถูกต้อง ดังนั้น LB จึงส่งส่วนหัวด้านขวาลงมา

ฉันพลาดขั้นตอนหรือไม่?

Score:2
ธง br

ฉันคิดว่าปัญหาอยู่ในการกำหนดค่า ip จริงของคุณ

set_real_ip_from {{ปอนด์ IP}};

real_ip_header X-Real-IP;

real_ip_recursive บน;

เมื่อใดควรตั้งค่า real_ip_header (ในกรณีของคุณ) เป็น X-Forwarded-For ฉันจะถือว่าส่วนหัว X-Forwarded-For ของคุณจาก LB มีลักษณะดังนี้:

X-Forwarded-For: {{Original client ip}}, {{LB ip}}

ดังนั้นเมื่อคุณตั้งค่า real_ip_header (ส่วนหัวที่ใช้แทนที่ ip ไคลเอ็นต์) เป็น X-Forwarded-For มันจะตรงกับ ip ไคลเอ็นต์ดั้งเดิม ไคลเอ็นต์ดั้งเดิมควรอยู่ภายใต้ตัวแปร $realip_remote_addr ซึ่งคุณสามารถส่งไปยัง proxy_set_header X-Forwarded-For :

proxy_set_header X-ส่งต่อ-สำหรับ $realip_remote_addr

โปรดแจ้งให้เราทราบหากฉันได้รับความช่วยเหลือใดๆ !

cn flag
นั่นคือสิ่งที่แปลก กับ ```set_real_ip_จาก 49.12.23.194; real_ip_recursive บน; ``` และ ``` ที่ตั้ง / { proxy_pass http://คอนเทนเนอร์-php; proxy_set_header X-ส่งต่อ-สำหรับ $realip_remote_addr; proxy_set_header X-Forwarded-Debug "Remotep $realip_remote_addr"; ``` ฉันยังคงได้รับ ``` ["X-ส่งต่อ-สำหรับ"]=> สตริง (26) ",49.12.23.194,49.12.23.194"``
Score:1
ธง my

นี่คือคำสั่งที่แทนที่ส่วนหัว X-Forwarded-For:

proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;

สมมติว่าคุณต้องการรักษา IP ไคลเอนต์เดิมในส่วนหัวนั้น คุณควรเขียน:

proxy_set_header X-ส่งต่อ-สำหรับ $remote_addr;

cn flag
นั่นคือสิ่งที่ฉันมีในตอนแรก แต่ $remote_addr ณ จุดนั้นคือ IP ของตัวจัดสรรภาระงาน
Score:0
ธง cn

ในที่สุดฉันก็แก้ปัญหานี้ด้วยวิธีที่ได้ผล แต่ไม่ได้แก้ปัญหาต้นตอจริงๆ เท่าที่ฉันสามารถบอกได้ LB อัปสตรีมกำลังตั้งค่า "X-Forwarded-For" เป็นที่อยู่ระยะไกลและความพยายามมายากลของ nginx ที่ตั้งค่าอย่างถูกต้องสำหรับพร็อกซีย้อนกลับมักทำให้เข้าใจผิดและตั้งค่าเป็นที่อยู่ LB หรือว่างเปล่า สตริง

ฉันเปลี่ยนจากโปรโตคอล HTTP เป็น PROXY สำหรับ LB->Server bit แทน ตั้งค่าต่อไปนี้ใน /etc/nginx/proxy_params:

proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;

และสิ่งนี้ใน conf.d:

 /etc/nginx/conf.d/real_ip.conf
set_real_ip_from {{ LB_IP }};
real_ip_header proxy_protocol;

ดัดแปลงมาจากสิ่งนี้:

https://www.x33u.org/docs/kubernetes-stuff/hetzner-loadbalancer-setup/

และตอนนี้ทุกอย่างใช้งานได้

Score:0
ธง cn

จากคำอธิบายของคุณ ปัญหาของคุณไม่เกี่ยวข้องโดยตรงกับ nginx แต่กับ apache

ขึ้นอยู่กับการกำหนดค่าของคุณ โฟลว์การรับส่งข้อมูลของคุณอาจมีลักษณะดังนี้:

ภายนอก -> nginx -> apache -> php (ทำงานเป็น fpm)

หรือ

ภายนอก -> nginx -> โมดูล apache + php

คุณควรตรวจสอบการกำหนดค่า apache เพื่อให้แน่ใจว่า apache ไม่ได้ละทิ้งไฟล์ x-ส่งต่อ-สำหรับ และ x-เรียลไอพี ส่วนหัวเมื่อส่งคำขอไปยัง PHP

หากโฟลว์การรับส่งข้อมูลของคุณสอดคล้องกับตัวอย่างแรก คุณมี apache ที่พร็อกซีคำขอไปยัง php ด้วย ซึ่งอาจนำไปสู่ปัญหาอื่นๆ อีกมากมายหาก nginx และ apache ไม่ "ซิงค์"

หากคุณจัดการ php proxying ด้วย nginx เพียงอย่างเดียว คุณเพียงแค่ต้องเพิ่มสิ่งต่อไปนี้ใน php ของคุณ ที่ตั้ง การกำหนดค่า:

ตำแหน่ง ~ \.php$ {
        #...กฎอื่นๆ
        fastcgi_param REMOTE_ADDR $http_x_real_ip;
        #...กฎอื่นๆ
}

ด้วยวิธีนี้ PHP REMOTE_ADDR จะได้ตั้งค่าถูก


เกี่ยวกับการกำหนดค่า nginx ของคุณหาก nginx {{ปอนด์ IP}} เป็นแบบคงที่ คุณสามารถตั้งค่าได้โดยตรงในการกำหนดค่า

/etc/nginx/conf.d/real_ip.conf
set_real_ip_from {{ปอนด์ IP}};
real_ip_recursive บน;

คุณไม่จำเป็นต้อง real_ip_header X-Real-IP; ในไฟล์ปรับแต่งของคุณ ที่จะแทนที่ set_real_ip_from คำสั่ง

โปรดทราบว่าคุณต้องเปิดใช้งานโมดูล real_ip ใน nginx เพื่อให้สามารถใช้งานได้

cn flag
ใช่ ตัวเลือกแรกคือวิธีการทำงาน การไหลที่แม่นยำกว่าเล็กน้อยคือ ``` ภายนอก -> ตัวโหลดบาลานเซอร์ -> nginx -> [DOCKER; apache -> php-fpm]```
cn flag
ฉันไม่เคยคิดว่า Apache จะจัดการส่วนหัวก่อนที่จะถึง PHP เป็นสิ่งที่ดีที่จะตรวจสอบ ฉันจะดูที่

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา