haproxy และส่งต่อที่อยู่ IP ของลูกค้าไปยังเซิร์ฟเวอร์


15

ฉันมีปัญหากับ HAproxy

ฉันใช้ HAproxy เป็น load balancer ซึ่งกระจายการร้องขอ http ขาเข้าไปยัง 5 เว็บเซิร์ฟเวอร์ โดยปกติคำขอของลูกค้าจะถูกส่งต่อไปยังเว็บเซิร์ฟเวอร์ที่มี IP ของ loadbalancer แต่ฉันต้องการ IP ของลูกค้าหรือ IP จริงที่ร้องขอบางอย่างจากเว็บเซิร์ฟเวอร์ เพราะเราจำเป็นต้องบันทึก IP ของลูกค้าจริง

ฉันพยายามรับ IP ของลูกค้าบนเว็บเซิร์ฟเวอร์ แต่ฉันไม่สามารถประสบความสำเร็จได้ในตอนนี้ ฉันเห็น IP ของตัวโหลดบาลานซ์เสมอ

ฉันใช้ตัวเลือก x-forward-for แต่ไม่สามารถแก้ปัญหาได้ หลังจากนั้นฉันพบตัวเลือกอื่น " source 0.0.0.0:80 usesrc clientip " แต่ฉันมี eror ในขณะที่พยายามเรียกใช้ HAproxy ซึ่งเป็นเรื่องเกี่ยวกับการรวบรวมความต้องการด้วยตัวเลือก USE_TPROXY ของ HAproxy ฉันทำแล้วฉันจะคอมไพล์ HAproxy ด้วยตัวเลือก USE_TPROXY แต่ไม่เปลี่ยนแปลงอะไรเลย ฉันจะทำอย่างไรเพื่อเรียนรู้ IP ของลูกค้าจริง

เคอร์เนลรุ่น linux ของฉันคือ 2.6.32-34 ฉันหมายความว่าเคอร์เนลรองรับพร็อกซีแบบโปร่งใส และฉันใช้ UBUNTU 10.4 LTS

ไฟล์ config ของฉันอยู่ที่นี่

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    (1)source 0.0.0.0:80 interface hdr_ip(x-forwarded-for,-1)
        (2)source 0.0.0.0:80 usesrc clientip
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor header X-Client
    option http-server-close
    stats enable
    stats refresh 10s
    stats hide-version
    stats scope   .
    stats uri     /lb?stats
    stats realm   LB2\ Statistics
    stats auth admin:xXx

    server  S1 192.168.1.117:80 check inter 2000 fall 3
    server  S2 192.168.1.116:80 check inter 2000 fall 3
    server  S3 192.168.1.118:80 check inter 2000 fall 3

(1) (2) ขณะทดสอบ HAproxy ฉันใช้หนึ่งในสองบรรทัดนี้

มีใครช่วยฉันเรียนรู้ IP ที่แท้จริงของลูกค้าที่ได้รับการร้องขอจากเซิร์ฟเวอร์ของเราหรือไม่?


สิ่งที่คุณกำลังมองหาเรียกว่า 'พร็อกซีโปร่งใส' iptables เกี่ยวข้อง แต่อย่างใด แต่ฉันก็ไม่แน่ใจเหมือนกัน
sysadmin1138

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

คำตอบ:


15

ฉันแก้ไขปัญหานี้แล้ว อาจเป็นได้ว่าไม่ใช่ปัญหาตั้งแต่ต้น ฉันค้นหา google เมื่อฉันประสบปัญหานี้และฉันเห็นสิ่งนั้น

option forwardfor

บรรทัดเพื่อใช้ในไฟล์ haproxy.cfg และตัวเลือกอื่น ๆ ฉันลองใช้ตัวเลือกเหล่านั้นรวมถึงการคอมไพล์ haproxy อีกครั้ง ... แต่ปัญหาที่แท้จริงเกี่ยวกับการเรียนรู้ IP ของลูกค้าจริงบนเว็บเซิร์ฟเวอร์ไม่ได้มาจาก HAproxy มันเกี่ยวกับการอ่านส่วนหัวโดยสคริปต์เซิร์ฟเวอร์ในกรณีของเราภาษาสคริปต์นี้คือ PHP

ฉันพยายามเรียนรู้ IP ของลูกค้าด้วยคำสั่งเหล่านี้

echo 'Client IP: '.$_SERVER["REMOTE_ADDR"];
echo 'Client IP: '.$_SERVER["HTTP_CLIENT_IP"];

และคำสั่งเหล่านี้แสดง IP ของ loadbalancer ถูกต้อง แต่นั่นไม่ใช่สิ่งที่ฉันคาดหวัง แม้จะมีตัวเลือกการส่งต่อสำหรับคำสั่งเหล่านี้ แต่ก็ให้ IP ของ loadbalancer

ด้วยการใช้ตัวเลือกการส่งต่อเพื่อให้เราเปิดใช้งาน HAproxy เพื่อแทรกส่วนหัว x-forwarded-for ลงในคำขอของลูกค้าที่ส่งไปยังเว็บเซิร์ฟเวอร์ของเรา HAproxy ใส่ฟิลด์นี้ไปที่ส่วนหัว แต่ฉันไม่สนใจสิ่งนี้ วันนี้ฉันรู้ว่านี่เป็นส่วนหัวและฉันต้องอ่านส่วนหัวเช่นนี้

echo 'Client IP: '.$_SERVER["HTTP_X_FORWARDED_FOR"];

ด้วยคำสั่งนี้ฉันได้รับที่อยู่ IP ของลูกค้าไม่ใช่ที่อยู่ IP ของ loadbalancer

แต่ข้อเสนอของฉันคือการรับข้อมูลส่วนหัวเพื่อตรวจสอบข้อมูลอื่น ๆ คือ getallheaders () ฟังก์ชั่นสำหรับ PHP

//from php.net http://php.net/manual/en/function.getallheaders.php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value<br>\n";
}

ในตอนท้ายของไฟล์ haproxy.cfg สุดท้ายของฉันคือด้านล่าง

global
    maxconn 100000
    uid 99
    gid 99
    daemon

defaults
    option forwardfor except 127.0.0.1
    mode    http
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

listen  myWeb 0.0.0.0:80
    mode http
    balance source
    option forwardfor
    option http-server-close
    stats enable
    stats refresh 10s
    stats hide-version
    stats scope   .
    stats uri     /lb?stats
    stats realm   LB2\ Statistics
    stats auth admin:passwd

    server  S1 192.168.1.117:80 check inter 2000 fall 3
    server  S2 192.168.1.116:80 check inter 2000 fall 3
    server  S3 192.168.1.118:80 check inter 2000 fall 3

อย่างไรก็ตามฉันมีหลายสิ่งที่ขาดหายไปเกี่ยวกับ HAproxy เช่นความหมาย uid หรือ gid


2

หากคุณต้องการไคลเอนต์ IP addr ในบันทึก Apache คุณสามารถเปลี่ยน apache conf ของคุณเพื่อบันทึก X-forwarded-for ในตำแหน่งเดิม (5 ชม.)

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

ขอบคุณสำหรับคำตอบของคุณ Marcelo แต่เราไม่ต้องการที่อยู่ IP ของลูกค้าในบันทึก Apache เราพยายามที่จะเรียนรู้โดยสคริปต์ PHP ของเรา
ระบบ

1

เพียงแค่พยายาม @ วิธีการแก้ปัญหาของระบบและดูเหมือนว่าชื่อส่วนหัวก็เปลี่ยนจากการHTTP_X_FORWARDED_FOR x-forwarded-forอาจเกี่ยวข้องกับเวอร์ชัน HAproxy 'ทำให้คำตอบถูกเขียนเมื่อ 5 ปีที่แล้ว ... ?

เป็นตัวอย่างการทำงานกับการผลิต:

String requestIp = httpRequest.getHeader("x-forwarded-for");

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