Chúng tôi có một số máy chủ PHP trên EC2 sau ELB. Chúng tôi muốn xác định miền địa phương/khu vực theo địa chỉ IP của khách hàng kết nối với máy chủ của chúng tôi. Vấn đề là các máy chủ PHP chỉ thấy địa chỉ IP của ELB. Chúng tôi muốn xem địa chỉ IP của khách hàng được chuyển qua ELB.Xác định địa chỉ IP của khách hàng Đằng sau Amazon ELB
Trả lời
Theo AWS docs, các ELB nên được thiết lập 'X-Forwarded-For' HTTP header mà bảo tồn bản gốc địa chỉ khách hàng ip:
Yêu cầu tiêu đề X-Forwarded-For giúp bạn xác định Địa chỉ IP của một khách hàng. Bởi vì cân bằng tải chặn lưu lượng giữa máy khách và máy chủ, nhật ký truy cập máy chủ của bạn chỉ chứa địa chỉ IP của trình cân bằng tải. Để xem địa chỉ IP của máy khách, hãy sử dụng tiêu đề yêu cầu X-Forwarded-For.
Bạn có thể truy cập nó bằng cách sử dụng mã PHP sau (giả sử apache):
$http_headers = apache_request_headers();
$original_ip = $http_headers["X-Forwarded-For"];
bạn có thể yêu cầu khách hàng báo cáo địa chỉ IP của mình một cách rõ ràng không? Kiểm tra điều này post.
Không thực sự. Trong một số trường hợp, khách hàng có thể nhấp vào liên kết trong email. Khi lần truy cập đầu tiên vào máy chủ của chúng tôi, chúng tôi cần xác định nội dung nào sẽ hiển thị dựa trên khu vực của họ. – BillR
Đây là một vấn đề lớn, vì vậy hãy thử này: D
<?php
if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$real_client_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
$real_client_ip = $_SERVER["REMOTE_ADDR"];
}
Điều này giả định rằng bạn tin tưởng khách hàng cung cấp X-Forwarded-For (tức là, vì khách hàng là một cân bằng tải). Mã này thực sự nên kiểm tra REMOTE_ADDR đối với danh sách trắng các IP được chấp nhận hoặc nó mở mã của bạn đến mức dễ bị tổn thương. – ZiggyTheHamster
Nếu bạn sử dụng Apache, hãy xem mô-đun mod_remoteip. Nó được bao gồm trong Apache 2.4 và mới hơn, nhưng cũng có thể tìm thấy backports cho 2.2.
Mô-đun ghi đè địa chỉ IP của khách hàng để kết nối với địa chỉ IP người dùng được báo cáo trong tiêu đề yêu cầu được định cấu hình với chỉ thị RemoteIPHeader.
Sau khi được thay thế theo hướng dẫn, địa chỉ IP người dùng được ghi đè này sau đó được sử dụng cho tính năng yêu cầu mod_authz_host Yêu cầu ip, được báo cáo bởi mod_status và được ghi bởi mod_log_config% a và core% a string định dạng. IP khách hàng cơ bản của kết nối có sẵn trong chuỗi định dạng% {c}.
Nói cách khác, bạn có thể đặt tiêu đề để sử dụng (ví dụ: Chuyển tiếp X-For) và IP nào được tin cậy (ví dụ: trình cân bằng tải của bạn). Các IP đáng tin cậy được loại bỏ khỏi tiêu đề và IP không đáng tin cậy đầu tiên được sử dụng làm ứng dụng khách gốc. IP này sau đó được Apache sử dụng nội bộ trong các mô-đun khác, chẳng hạn như để ghi nhật ký, xác thực máy chủ, v.v.
Điều này làm cho nó hữu ích hơn là chỉ xử lý tiêu đề XFF trong PHP, vì mod_remoteip quản lý toàn bộ ngăn xếp, đảm bảo nhật ký truy cập của bạn là chính xác, v.v.
Lưu ý: Ngoài ra còn có mô-đun mod_rpaf là tiền thân của mô-đun này. Nó còn hạn chế hơn nhiều. Ví dụ, nó không thể xử lý các phạm vi ip tin cậy. Bạn cần điều này vì bạn không biết IP của ELB trước đó. Nó cũng không thể xử lý nhiều bước nhảy, chẳng hạn như ELB trước Varnish, trước Apache. Tôi muốn đề nghị bỏ qua các module rpaf và sử dụng remoteip để thay thế.
Dường như mod_cloudflare có thể là một lựa chọn tốt hơn cho một số - especialy v2.2 người đã Đọc thêm tại blog của chap này: http://knowledgevoid.com/blog/2012/01/13/logging-the-correct-ip-address-using-apache-2-2-x-and-amazons-elastic-load-balancer/
giải pháp tối ưu cho PHP ứng dụng đằng sau AWS ELB:
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$commaPos = strrchr($_SERVER['HTTP_X_FORWARDED_FOR'], ',');
if ($commaPos === FALSE) $remote_addr = $_SERVER['HTTP_X_FORWARDED_FOR'];
else $remote_addr = trim(substr($_SERVER['HTTP_X_FORWARDED_FOR'], $commaPos + 1));
} else {
$remote_addr = $_SERVER['REMOTE_ADDR'];
}
Ghi chú: X-Forwarded-For có thể là một dấu phẩy không gian tách ra danh sách các proxy, với cuối cùng trong danh sách được kết nối với ELB của AWS, và do đó người duy nhất chúng ta có thể tin tưởng là không bị giả mạo.
- 1. Địa chỉ IP từ xa với nút-js phía sau amazon ELB
- 2. Bảo mật WCF bằng địa chỉ IP của khách hàng
- 3. Làm thế nào để xác định địa chỉ IP của khách hàng yêu cầu?
- 4. Nhận địa chỉ IP của khách hàng ở Sinatra?
- 5. Địa chỉ IP của khách hàng trong ASP.NET (.asmx) webservices
- 6. Cách nhận địa chỉ ip của khách hàng/người dùng?
- 7. Có thể xác định chính xác địa chỉ IP của ứng dụng khách trong java servlet
- 8. WICKET: cách lấy địa chỉ ip/địa chỉ của khách hàng
- 9. Làm cách nào để sử dụng giao thức PROXY để nhận địa chỉ IP thực của khách hàng?
- 10. Xác định địa chỉ IP của máy khách từ xa cho cuộc gọi Java RMI
- 11. Cách xác định địa chỉ IP của hệ thống Solaris
- 12. Nhận địa chỉ IP của ứng dụng khách trong JSP
- 13. Cách nhận IP của khách hàng?
- 14. Máy chủ HTTP NodeJS - Cách xác minh địa chỉ IP và thông tin đăng nhập của khách hàng?
- 15. Amazon ELB trong VPC
- 16. Nhận địa chỉ IP của khách truy cập sau khi biểu mẫu AJAX gửi
- 17. Cách lấy địa chỉ IP của khách hàng với thư viện WebSocket (websockets/ws) trong Node.js?
- 18. Nhận địa chỉ IP của khách hàng: REMOTE_ADDR, HTTP_X_FORWARDED_FOR, điều gì khác có thể hữu ích?
- 19. Nhận địa chỉ IP của khách hàng trong dịch vụ web RemObjects
- 20. Lấy địa chỉ IP của khách hàng trong GWT và Google App Engine
- 21. cách lấy địa chỉ IP của khách hàng trong lớp tĩnh trong asp.net mvc
- 22. Xác định địa chỉ IP và cổng của kết nối TCP/IP đến trong Erlang
- 23. Làm cách nào để xác định địa chỉ IP của ứng dụng web (cho JSP)?
- 24. Làm thế nào để có được IP khách hàng phía sau một ELS AWS?
- 25. Sử dụng địa chỉ IP tĩnh với Amazon EC2
- 26. Cách nhận địa chỉ IP từ xa/khách hàng bằng dịch vụ web RESTful trong java?
- 27. Nhận địa chỉ IP của người dùng
- 28. Địa chỉ IP "Rác" với dấu hai chấm trong $ _SERVER ['REMOTE_ADDR'] cho một số khách hàng
- 29. Làm thế nào để có được địa chỉ IP từ một người truy cập (còn nếu đằng sau một Proxy)
- 30. ServerSocket + client Socket - làm cách nào để nhận địa chỉ IP của ứng dụng khách?
Nếu bạn quan tâm đến bảo mật, bạn nên ngăn các kết nối đến máy chủ web của mình từ bất kỳ thứ gì ngoài ELB. Nếu không, kẻ tấn công có thể giả vờ là một ELB, đặt tiêu đề này và nói dối bạn về địa chỉ IP từ xa thực sự. http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/using-elb-security-groups.html –
Lưu ý rằng tiêu đề X-Forwarded-For có thể chứa danh sách địa chỉ IP được phân cách bằng dấu phẩy nếu có nhiều người giao nhận. Cái đầu tiên là IP của máy khách gốc. http://en.wikipedia.org/wiki/X-Forwarded-For#Format – mmindenhall
Trong trường hợp khách hàng cung cấp X-Forwarded-For của riêng mình, nó sẽ là người đầu tiên trong danh sách IP được phân tách bằng dấu phẩy được cung cấp cho bạn ứng dụng. IP thực sự luôn luôn là mục cuối cùng, rõ ràng. –