IP từ xa với HAProxy


19

Tôi đang thử nghiệm thiết lập máy chủ web mới có một số vấn đề. Về cơ bản, chúng tôi có một máy chủ web, nơi mã sử dụng IP từ xa cho một số điều thú vị và một số thư mục apache được bảo mật cho một số IP nhất định (văn phòng của chúng tôi, v.v.).

Tuy nhiên, chúng tôi đã giải thích điều này đằng sau ha_proxy để chúng tôi có thể xem xét thêm một số máy chủ ứng dụng, nhưng bây giờ IP từ xa luôn xuất hiện dưới dạng ip proxy chứ không phải người dùng từ xa thực sự. Điều này có nghĩa là chúng tôi không thể đến một số địa điểm và ứng dụng của chúng tôi hoạt động hơi kỳ lạ khi IP của người dùng là quan trọng.

Cấu hình của chúng tôi như sau:

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

Câu trả lời:


31

Trích dẫn từ tài liệu HAProxy tại haproxy.1wt.eu .

- nếu ứng dụng cần đăng nhập IP của máy khách ban đầu, hãy sử dụng
  Tùy chọn "Forwardfor" sẽ thêm tiêu đề "X-Forwarded-For" với
  địa chỉ IP của khách hàng ban đầu. Bạn cũng phải sử dụng "httpc Đóng" để đảm bảo
  rằng bạn sẽ viết lại mọi yêu cầu và không chỉ một trong những yêu cầu đầu tiên
  phiên:
        tùy chọn httpclose
        tùy chọn chuyển tiếp

Có thông báo rằng ứng dụng phải xử lý X-Forwarded-For HTTP Header để biết địa chỉ IP của máy khách. Có vẻ như cách duy nhất để đi trong trường hợp của bạn.

Cập nhật cho HAProxy 1.4

Haproxy 1.4 đã giới thiệu một chế độ mới với "tùy chọn http-server-close". Nó vẫn đóng kết nối với máy chủ nhưng vẫn duy trì trạng thái sống đối với máy khách nếu có thể và được sử dụng. Trên hầu hết các thiết lập, bạn có thể muốn sử dụng nó vì nó có độ trễ trên phần có độ trễ cao duy nhất trong kết nối của bạn (giữa Haproxy và máy khách).

   option http-server-close
   option forwardfor

2
Sử dụng tốt hơn option forwardfor header X-Real-IPreqidel ^X-Real-IP:, điều này dừng giả mạo IP trong nhật ký của bạn. FYI: X-Real-IPlà tiêu đề mặc định cho NginXtùy chọn ' set_real_ip_from.
Tino

Câu hỏi không đề cập đến nginx. X-Real-IP sẽ không hoạt động.
Rick Fletcher

1. hai tùy chọn này có phải được đặt trong phần cấu hình frontend hoặc backend không? (Bởi vì chúng dường như không hoạt động ở đây) 2. Có loại cấu hình nào được yêu cầu ở cấp Tomcat không?
yglodt

6

Có một cách để biên dịch lại HAproxy để bao gồm Tproxy sẽ cho phép chuyển tiếp địa chỉ nguồn.

Có một bài đăng blog ở đây về nó: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

Một vài lưu ý:

Hạt nhân linux mới nhất (2.6.28-11-server) bao gồm hỗ trợ cho TProxy, do đó việc biên dịch lại kernel là không cần thiết.

Đảm bảo định cấu hình các máy chủ trong cụm máy chủ web của bạn với địa chỉ cổng mặc định trỏ đến máy chủ HAProxy.


2

Sử dụng mô-đun apache rpaf http://stderr.net/apache/rpaf/ Tôi biết đây là bài viết cũ và tôi phải mất nhiều ngày để tìm thấy nó. Điều này sẽ trình bày cho bất kỳ ứng dụng nào ip x-Forwarded-for.


1

Lưu ý rằng có vẻ như bạn có thể ghi đè lên những gì ứng dụng thấy là tôi đang thay đổi các tiêu đề Apache:

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

Tuy nhiên, điều này không hoạt động đối với truy cập Apache thông qua "Cho phép từ", v.v.


Điều này có thể gây ra kết quả không thể đoán trước nếu khách hàng gửi X-Forwarded-Fortiêu đề hiện tại khi địa chỉ IP mới được thêm vào cuối danh sách hiện có, được phân tách bằng dấu phẩy và dấu cách. Thay đổi (.*)để ([^ ]*)$chỉ lấy các IP cuối cùng ... hoặc sử dụng mod_rpafhoặc mod_remoteipcho Apache 2.4 hoặc sau đó.
Ladadadada

1

HAProxy, theo thiết kế, không thể chuyển tiếp địa chỉ IP gốc đến máy chủ thực, gần giống như bất kỳ proxy nào khác.

Một giải pháp có thể là, nếu vấn đề duy nhất của bạn là với một máy chủ web, hãy xem xét tiêu đề HTTP được chuyển tiếp X, có chứa địa chỉ của máy khách. Bây giờ, đó là khá nhiều ứng dụng / ngôn ngữ cụ thể, nhưng hãy xem ví dụ này trong php:

$headers = apache_request_headers();

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

Nếu bạn cũng muốn đăng nhập địa chỉ gốc, bạn có thể sửa đổi LogFormat trong httpd.conf để trông giống như thế này:

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


sai, bạn có thể với tùy chọn "chuyển tiếp"
wittwerch

Có, và tùy chọn này được bật theo mặc định, nhưng những gì nó làm là đặt tiêu đề X-Forwarded-For HTTP. Những gì tôi đã nói, và theo tôi đó là những gì người hỏi thực sự hỏi, là về địa chỉ nguồn thực sự của gói IP
Thiagodrv

0

Chà, có vẻ như X-Forwarded-for không hoạt động tốt cho thiết lập của bạn. Vì vậy, có lý do đặc biệt nào để bạn gắn bó với haproxy không? Dường như IPVS phù hợp hơn với nhu cầu của bạn (tôi thực sự sử dụng ldirector, lần lượt sử dụng ipvs).

Hãy xem:

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

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

Sử dụng IPVS trong chế độ 'Đường hầm IP' hoặc 'Định tuyến trực tiếp' sẽ duy trì địa chỉ của khách hàng.


0

Hãy thử mod_extract_forwarded từ 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

Cách dễ dàng với haproxy trong chế độ tcp và nginx:

thêm tùy chọn gửi làm máy chủ:

haproxy.conf:

.

.

nghe ssl 0.0.0.0:443

chế độ tcp

cân bằng ít kết nối

tùy chọn httpchk GET / ping

tùy chọn kiểm tra sức khỏe

máy chủ w1 192.168.1.1:443 kiểm tra proxy gửi kiểm tra-ssl xác minh không

máy chủ w2 192.168.1.1:443 kiểm tra proxy gửi kiểm tra-ssl xác minh không

.

.

Nginx cần hỗ trợ giao thức proxy

nginx.conf:

.

.

nghe 192.168.1.1:443 ssl proxy_protatio;

.

.

set_real_ip_from 192.168.1.0/24;

real_ip_header proxy_protatio;

.

.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.