IP ระยะไกลพร้อม HAProxy


19

ฉันกำลังทดสอบการตั้งค่าเซิร์ฟเวอร์เว็บใหม่ซึ่งกำลังมีปัญหาอยู่สองสามข้อ โดยพื้นฐานแล้วเรามีเว็บเซิร์ฟเวอร์โดยที่รหัสนั้นใช้ IP ระยะไกลสำหรับสิ่งที่น่าสนใจและยังมีไดเรกทอรี apache บางส่วนที่ได้รับการรักษาความปลอดภัยให้อยู่ในระดับ IP ที่แน่นอน (สำนักงานของเราเป็นต้น)

อย่างไรก็ตามเราเพิ่งวางไว้ด้านหลัง ha_proxy เพื่อให้เราสามารถดูการเพิ่มแอพเซิร์ฟเวอร์เพิ่มเติมได้ แต่ตอนนี้ IP ระยะไกลมักจะผ่านมาเป็นพร็อกซีไอพีไม่ใช่ผู้ใช้ระยะไกลที่แท้จริง ซึ่งหมายความว่าเราไม่สามารถไปยังสถานที่บางแห่งได้และแอพของเรามีพฤติกรรมแปลก ๆ เล็กน้อยที่ซึ่ง IP ผู้ใช้เป็นสิ่งสำคัญ

config ของเรามีดังนี้:

global
      maxconn 4096
      pidfile /var/run/haproxy.pid
      daemon

defaults
      mode http
      retries 3
      option redispatch
      maxconn 2000
      contimeout 5000
      clitimeout 50000
      srvtimeout 50000

listen farm xxx.xxx.xxx.xxx:80
      mode http
      cookie GALAXY insert
      balance roundrobin
      option httpclose
      option forwardfor
      stats enable
      stats auth username:userpass

      server app1 xxx.xxx.xxx.xxx:80 maxconn 1 check

คำตอบ:


31

ยกมาจากเอกสารที่ HAProxy haproxy.1wt.eu

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

มีการระบุว่าแอปพลิเคชันจะต้องปฏิบัติต่อ X-Forwarded-For HTTP Header เพื่อให้ทราบถึงที่อยู่ IP ของลูกค้า ดูเหมือนว่าวิธีเดียวที่จะไปในกรณีของคุณ

อัปเดตสำหรับ HAProxy 1.4

Haproxy 1.4 แนะนำโหมดใหม่ด้วย "option http-server-close" มันยังคงปิดการเชื่อมต่อกับเซิร์ฟเวอร์ แต่ยังคงรักษาไว้ต่อลูกค้าถ้าเป็นไปได้และใช้ ในการตั้งค่าส่วนใหญ่คุณอาจต้องการใช้สิ่งนั้นเนื่องจากจะช่วยให้มีเวลาแฝงในส่วนที่มีความหน่วงสูงในการเชื่อมต่อของคุณ (ระหว่าง Haproxy และไคลเอนต์)

   option http-server-close
   option forwardfor

2
ใช้งานได้ดีขึ้นoption forwardfor header X-Real-IPและreqidel ^X-Real-IP:นี่จะเป็นการแกล้งทำ IP ในบันทึกของคุณ FYI: X-Real-IPคือส่วนหัวเริ่มต้นสำหรับตัวเลือกNginX ' set_real_ip_from
Tino

คำถามไม่ได้พูดถึง nginx X-Real-IP จะไม่ทำงาน
Rick Fletcher

1. ต้องตั้งค่าตัวเลือกทั้งสองนี้ในส่วนกำหนดค่าส่วนหน้าหรือส่วนหลังหรือไม่ (เพราะพวกมันดูเหมือนจะไม่ทำงานที่นี่) 2. การกำหนดค่าประเภทใดที่จำเป็นต้องใช้ในระดับ Tomcat เช่นกัน?
yglodt

6

มีวิธีการคอมไพล์ HAproxy อีกครั้งเพื่อรวม Tproxy ซึ่งจะช่วยให้การส่งต่อของที่อยู่แหล่งที่มา

มีโพสต์บล็อกเกี่ยวกับที่นี่: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

หมายเหตุเล็กน้อย:

เคอร์เนล linux ล่าสุด (2.6.28-11- เซิร์ฟเวอร์) รวมถึงการสนับสนุนสำหรับ TProxy ดังนั้นการรวบรวมเคอร์เนลใหม่จึงไม่จำเป็น

ตรวจสอบให้แน่ใจว่าได้กำหนดค่าเซิร์ฟเวอร์ในเว็บฟาร์มของคุณด้วยที่อยู่เกตเวย์เริ่มต้นซึ่งชี้ไปที่เซิร์ฟเวอร์ HAProxy


2

ใช้โมดูล rpaf apache http://stderr.net/apache/rpaf/ ฉันรู้ว่านี่คือและโพสต์เก่า แต่มันใช้เวลาหลายวันในการค้นหา สิ่งนี้จะนำเสนอให้กับแอปพลิเคชันใด ๆ ที่ x-forwarded-for ip


1

โปรดทราบว่าจะปรากฏว่าคุณสามารถแทนที่สิ่งที่แอปพลิเคชันเห็นคือการเปลี่ยนหัว Apache ของฉัน:

SetEnvIf X-Forwarded-For (.*) REMOTE_ADDR=$1
SetEnvIf X-Forwarded-For (.*) REMOTE_IP=$1

อย่างไรก็ตามวิธีนี้ใช้ไม่ได้กับการเข้าถึง Apache ผ่าน "อนุญาตจาก" เป็นต้น


สิ่งนี้อาจทำให้เกิดผลลัพธ์ที่คาดเดาไม่ได้หากไคลเอ็นต์ส่งX-Forwarded-Forส่วนหัวที่มีอยู่เนื่องจากที่อยู่ IP ใหม่จะถูกเพิ่มลงในตอนท้ายของรายการที่มีอยู่โดยคั่นด้วยเครื่องหมายจุลภาคและช่องว่าง เปลี่ยนเป็น(.*)เป็น([^ ]*)$เพียงคว้า IP ล่าสุด ... หรือใช้mod_rpafหรือ mod_remoteipสำหรับ Apache 2.4 หรือใหม่กว่า
Ladadadada

1

HAProxy ตามการออกแบบไม่สามารถส่งต่อที่อยู่ IP ดั้งเดิมไปยังเซิร์ฟเวอร์จริง ๆ ได้เช่นเดียวกับพร็อกซีอื่น ๆ

วิธีแก้ไขปัญหาหนึ่งอาจเกิดขึ้นได้หากปัญหาเดียวของคุณคือเว็บเซิร์ฟเวอร์เพื่อค้นหาส่วนหัว HTTP X-forwarded-for HTTP ซึ่งควรมีที่อยู่ของลูกค้า ตอนนี้มันเป็นแอพพลิเคชั่น / ภาษาที่เฉพาะเจาะจง แต่ลองดูตัวอย่างนี้ใน php:

$headers = apache_request_headers();

$real_client_ip = $headers["X-Forwarded-For"];

หากคุณต้องการบันทึกที่อยู่เดิมคุณสามารถแก้ไข LogFormat ใน httpd.conf เพื่อให้มีลักษณะดังนี้:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common


ผิดคุณสามารถมีตัวเลือก "ไปข้างหน้า"
wittwerch

ใช่แล้วตัวเลือกนี้จะเปิดใช้งานตามค่าเริ่มต้น แต่สิ่งที่ทำคือตั้งค่าส่วนหัว X-Forwarded-For HTTP สิ่งที่ฉันพูดและมันก็ดูสำหรับฉันว่าเป็นสิ่งที่ผู้ถามจริงถามคือเกี่ยวกับที่อยู่แหล่งที่แท้จริงของแพ็กเก็ต IP
4323 Thiagodrv

0

ดูเหมือนว่า X-Forwarded-for จะทำงานได้ไม่ดีสำหรับการตั้งค่าของคุณ มีเหตุผลอะไรเป็นพิเศษไหมที่คุณจะยึดติดกับ haproxy? ดูเหมือนว่า IPVS จะมีประโยชน์มากกว่าสำหรับความต้องการของคุณ (ฉันใช้ ldirector ซึ่งในทางกลับกันใช้ ipvs)

ดูที่:

http://kb.linuxvirtualserver.org/wiki/IPVS

และ

http://www.vergenet.net/linux/ldirectord/

การใช้ IPVS ในโหมด 'IP Tunneling' หรือ 'Direct Routing' จะรักษาที่อยู่ของลูกค้า


0

ลอง mod_extract_forwarded จากhttp://www.openinfo.co.uk/apache/

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEFOrder refuse,accept
MEFRefuse all
MEFAccept xxx.xxx.xxx.xxx

-1

วิธีง่ายๆด้วย haproxy ในโหมด tcp และ nginx:

เพิ่ม send-proxy เป็นตัวเลือกเซิร์ฟเวอร์:

haproxy.conf:

.

.

ฟัง ssl 0.0.0.0:443

โหมด tcp

ยอดคงเหลือน้อยที่สุด

ตัวเลือก httpchk GET / ping

ตัวเลือกบันทึกสุขภาพตรวจสอบ

เซิร์ฟเวอร์ w1 192.168.1.1:443 ตรวจสอบ send-proxy check-ssl ตรวจสอบว่าไม่มี

เซิร์ฟเวอร์ w2 192.168.1.1:443 ตรวจสอบ send-proxy check-ssl ตรวจสอบไม่มี

.

.

Nginx ต้องการการสนับสนุน proxy-protocol

nginx.conf:

.

.

ฟัง 192.168.1.1:443 ssl proxy_protocol;

.

.

set_real_ip_from 192.168.1.0/24;

real_ip_header proxy_protocol;

.

.

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