হ্যাপ্রোক্সি এবং সার্ভারে ক্লায়েন্টের আইপি ঠিকানা forward


15

HAproxy নিয়ে আমার সমস্যা আছে।

আমি HAproxy লোড ব্যালেন্সার হিসাবে ব্যবহার করি যা আগত HTTP অনুরোধগুলি 5 ওয়েব সার্ভারে বিতরণ করে। সাধারণত ক্লায়েন্টের অনুরোধটি লোডবালেন্সারের আইপি সহ ওয়েব সার্ভারগুলিতে ফরোয়ার্ড করা হয়। তবে আমার কাছে ক্লায়েন্টের আইপি বা সত্যিকারের আইপি দরকার যারা ওয়েব সার্ভার থেকে কোনও কিছুর জন্য অনুরোধ করেন। কারণ আমাদের বাস্তব ক্লায়েন্টের আইপিগুলি লগ করতে হবে।

আমি ওয়েব সার্ভারে ক্লায়েন্টের আইপিগুলি পাওয়ার চেষ্টা করি তবে আমি এখন পর্যন্ত সাফল্য পেতে পারি না। সর্বদা আমি লোড ব্যালেন্সারের আইপি দেখতে পাই।

আমি এক্স-ফরোয়ার্ড-এর বিকল্পটি ব্যবহার করি তবে এটি সমস্যার সমাধান হয় না। এর পরে আমি অন্য একটি বিকল্প " উত্স ০.০.০.০.০৮০ ব্যবহার করে সিআরসি ক্লায়েন্টিপ " পেয়েছি তবে এইচএপ্রাক্সি চালানোর চেষ্টা করার সময় আমি অস্থির হয়ে উঠি যা HAproxy এর USE_TPROXY বিকল্পের সাথে সংকলন প্রয়োজন। আমি এটি করেছি, আমি HAproxy কে USE_TPROXY বিকল্পের সাথে পুনরায় সংকলন করি তবে কিছুই পরিবর্তন হয় না। আসল ক্লায়েন্টের আইপি শিখতে আমি কী করতে পারি।

আমার লিনাক্স কার্নেল সংস্করণটি ২.6.৩২-৩৪ আমার অর্থ কার্নেলটি স্বচ্ছ প্রক্সি সমর্থন করে। এবং আমি ইউবুন্টু 10.4 এলটিএস ব্যবহার করি

আমার কনফিগারেশন ফাইল এখানে আছে

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) এইচএপ্রসি পরীক্ষা করার সময় আমি এই দুটি লাইনের একটি ব্যবহার করেছি।

আমাদের সার্ভারের কাছ থেকে অনুরোধ করা ক্লায়েন্টদের আসল আইপি শিখতে কেউ কি আমাকে সহায়তা করছেন?


আপনি যা খুঁজছেন তাকে 'স্বচ্ছ প্রক্সি' বলা হয়। iptables একরকম জড়িত, কিন্তু আমি ঠিক কিভাবে নিশ্চিত না।
sysadmin1138

স্বচ্ছ প্রক্সি বলে আমি উল্লেখ করেছি যে প্রক্সিগুলি আগত সংযোগগুলি বিতরণ করার সময় HTTP শিরোনামগুলিকে সংশোধন করে না। এইভাবে সত্যিকারের ওয়েব পৃষ্ঠায় রক্ষাকারী ক্লায়েন্টের আইপি ওয়েব সার্ভারে প্রেরণ করা যেতে পারে। স্বচ্ছ প্রক্সি থেকে এটিই আমি বুঝতে পেরেছিলাম।
সিস্টেম

উত্তর:


15

আমি এই সমস্যাটি সমাধান করেছি। এটি প্রথম থেকেই কোনও সমস্যা ছিল না। আমি যখন এই সমস্যার মুখোমুখি হয়েছিলাম তখন আমি গুগল অনুসন্ধান করেছি এবং এটি আমি দেখেছি

option forwardfor

haproxy.cfg ফাইল এবং অন্যান্য বিকল্পগুলিতে ব্যবহার করার জন্য লাইন। আমি হ্যাপ্রোক্সিটি পুনরায় সংবিধান সহ সেগুলিগুলির অপশনগুলি চেষ্টা করেছি ... তবে ওয়েব সার্ভারগুলিতে আসল ক্লায়েন্টের আইপি শেখার সাথে সম্পর্কিত আসল সমস্যাটি HAproxy থেকে পাওয়া যায় না, এটি সার্ভার স্ক্রিপ্টগুলির দ্বারা শিরোনাম পড়ার বিষয়ে, আমাদের ক্ষেত্রে এই স্ক্রিপ্টিং ভাষাটি পিএইচপি।

আমি এই আদেশগুলি দ্বারা ক্লায়েন্টের আইপিগুলি শিখতে চেষ্টা করি

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

এবং এই কমান্ডগুলি লোডবালেন্সারের আইপি প্রদর্শন করে। এটি সঠিক তবে এটি আমার প্রত্যাশিত নয়। এই কমান্ডগুলির ফরওয়ার্ড বিকল্পের পরেও আমাকে লোডবালেন্সারের আইপি দিয়েছে

ফরওয়ার্ড বিকল্প ব্যবহার করে আমরা আমাদের ওয়েব সার্ভারে প্রেরিত ক্লায়েন্টের অনুরোধগুলিতে এক্স-ফরোয়ার্ড-ফর শিরোনাম সন্নিবেশ করতে HAproxy সক্ষম করি। HAproxy এই ক্ষেত্রটি শিরোনামে রেখেছিল তবে আমি এটিকে অগ্রাহ্য করেছি। আজ আমি বুঝতে পেরেছি যে এটি একটি শিরোনামের ক্ষেত্র এবং আমাকে এই শিরোনামটি এভাবে পড়তে হবে

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

এই আদেশের সাহায্যে আমি ক্লায়েন্টের আইপি ঠিকানা পেয়েছি লোডবালেন্সারের আইপি ঠিকানা নয়।

তবে আমার অফারটি অন্যান্য তথ্য অনুসন্ধানের জন্য শিরোনামের ডেটা পাওয়ার জন্য পিএইচপি-র জন্য গেটলহেডার () ফাংশন রয়েছে।

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

আমার সব শেষ haproxy.cfg ফাইলের শেষে নীচের মত like

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

অ্যাপাচি লগটিতে আপনার যদি ক্লায়েন্ট আইপি অ্যাড্রারের প্রয়োজন হয় তবে আপনি নিজের অ্যাপাচি কনফটিটি মূল উত্স (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

আপনার উত্তরের জন্য ধন্যবাদ মার্সেলো, তবে অ্যাপাচি লগের জন্য আমাদের ক্লায়েন্টের আইপি ঠিকানা প্রয়োজন নেই। আমরা আমাদের পিএইচপি স্ক্রিপ্টগুলি শিখতে চেষ্টা করি।
সিস্টেম

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.