haproxy और अग्रेषित क्लाइंट IP पता सर्वरों के लिए


15

मुझे HAproxy से समस्या है।

मैं लोड बैलेंसर के रूप में HAproxy का उपयोग करता हूं जो आने वाले http अनुरोधों को 5 वेब सर्वरों पर वितरित करता है। सामान्य रूप से क्लाइंट रिक्वेस्ट को लोडबॉलर के आईपी के साथ वेब सर्वर पर भेज दिया जाता है। लेकिन मुझे क्लाइंट आईपी या असली आईपी चाहिए जो वेब सर्वर से कुछ अनुरोध करते हैं। क्योंकि हमें असली ग्राहक के आईपी को लॉग इन करना होगा।

मैं वेब सर्वर पर क्लाइंट के आईपी प्राप्त करने की कोशिश करता हूं, लेकिन अब तक मैं सफल नहीं हो सकता। हमेशा मुझे लोड बैलेंसर का आईपी दिखाई देता है।

मैं x-फॉरवर्ड-फॉर ऑप्शन का उपयोग करता हूं लेकिन यह समस्या हल नहीं होती है। उसके बाद मुझे एक और विकल्प मिला " सोर्स 0.0.0.0:80 यूज़र्स क्लाइंटिप " मैंने ऐसा किया था, मैं HAEExy को USE_TPROXY विकल्प के साथ फिर से जोड़ देता हूं लेकिन कुछ भी नहीं बदलता है। वास्तविक ग्राहक के आईपी सीखने के लिए मैं क्या कर सकता हूं।

मेरा लिनक्स कर्नेल संस्करण 2.6.32-34 है मेरा मतलब है कि कर्नेल पारदर्शी प्रॉक्सी का समर्थन करता है। और मैं UBUNTU 10.4 LTS का उपयोग करता हूं

मेरी विन्यास फाइल यहाँ है

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 का परीक्षण करते समय मैंने इन दो लाइनों में से एक का उपयोग किया।

क्या कोई मुझे उन ग्राहकों के वास्तविक आईपी सीखने में मदद करता है जो हमारे सर्वर से अनुरोध कर रहे हैं?


जो आप खोज रहे हैं उसे 'पारदर्शी प्रॉक्सी' कहा जाता है। iptables किसी तरह शामिल है, लेकिन मुझे यकीन नहीं है कि कैसे।
sysadmin1138

पारदर्शी प्रॉक्सी कहकर मैंने उल्लेख किया है कि, आने वाले कनेक्शन वितरित करते समय प्रॉक्सी जो http हेडर को संशोधित नहीं करता है। इस प्रकार असली वेब पेज रिक्वायरमेंट क्लाइंट का आईपी वेब सर्वर को भेजा जा सकता है। यही वह है जो मैंने पारदर्शी प्रॉक्सी से समझा।
सिस्टम

जवाबों:


15

मैंने इस समस्या को हल किया। हो सकता है कि यह शुरुआत से कोई समस्या नहीं थी। जब मैंने इस समस्या का सामना किया, तो मैंने Google खोज की और मैंने वह देखा

option forwardfor

haproxy.cfg फ़ाइल और अन्य विकल्पों में उपयोग करने के लिए लाइन। मैंने उन विकल्पों की कोशिश की, जिनमें हाइप्रोक्स को फिर से शामिल करना शामिल है ... लेकिन वेब सर्वर पर वास्तविक क्लाइंट के आईपी सीखने से संबंधित वास्तविक समस्या HAproxy से प्राप्त नहीं होती है, यह सर्वर स्क्रिप्ट द्वारा हेडर पढ़ने के बारे में है, हमारे मामले में यह स्क्रिप्टिंग भाषा PHP है।

मैं इन कमांड द्वारा क्लाइंट के आईपी को सीखने की कोशिश करता हूं

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

और ये कमांड लोडबॉलर के आईपी को प्रदर्शित करता है। यह सही है लेकिन यह वह नहीं है जिसकी मुझे उम्मीद है। फ़ॉरवर्ड के विकल्प के बावजूद इन कमांडों ने मुझे लोडबॉलर का आईपी दिया

अग्रेषित विकल्प का उपयोग करके हम अपने वेब सर्वर को भेजे गए क्लाइंट के अनुरोधों में एक्स-फॉरवर्ड किए गए हेडर डालने के लिए HAproxy को सक्षम करते हैं। HAproxy ने इस फ़ील्ड को हेडर में रखा है लेकिन मैंने इसे अनदेखा कर दिया है। आज मुझे महसूस हुआ कि यह एक हेडर फील्ड है और मुझे इस हेडर को इस तरह पढ़ना है

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

इस कमांड के साथ मुझे क्लाइंट का आईपी एड्रेस लोडबॉलर का आईपी एड्रेस नहीं मिला।

लेकिन मेरा प्रस्ताव है कि PHP के लिए अन्य जानकारी getallheaders () फ़ंक्शन की जांच करने के लिए हेडर डेटा प्राप्त करने के लिए है।

//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

यदि आपको Apache लॉग पर क्लाइंट IP Addr की आवश्यकता है, तो आप मूल स्रोत (5h) के स्थान पर X- फ़ॉर्वर्ड किए गए लॉग को लॉग करने के लिए अपने अपाचे को बदल सकते हैं।

#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

आपके उत्तर के लिए धन्यवाद मार्सेलो, लेकिन हमें अपाचे लॉग पर क्लाइंट के आईपी पते की आवश्यकता नहीं है। हम अपने php लिपियों द्वारा सीखने की कोशिश करते हैं।
सिस्टम

1

बस @ प्रणाली के समाधान की कोशिश की और ऐसा लगता है कि शीर्ष लेख नाम से बदल गया था HTTP_X_FORWARDED_FORकरने के लिएx-forwarded-for । शायद यह HAproxy संस्करण से संबंधित है, 'कारण 5 साल पहले लिखा गया था ...?

एक उदाहरण के रूप में, यह उत्पादन पर काम कर रहा है:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.