Tóm lược
Tôi sử dụng Nginx làm proxy ngược và đặc biệt là chức năng của nó proxy_bind
để gửi IP máy khách thực sự đến chương trình phụ trợ. tôi đã theo dõi tài liệu này từ nginx.com.
Nó hoạt động tốt, cả khi máy chủ HTTP được lưu trữ trên một máy khác hoặc trực tiếp trên một trong các proxy ngược, ngoại trừ trường hợp thứ hai nếu máy chủ HTTP lắng nghe trên máy chủ cục bộ.
=> Tôi không thể làm cho cấu hình này hoạt động:
# /etc/nginx/conf.d/nginx-revprox-test.conf
người phục vụ {
nghe 80;
địa điểm / {
proxy_pass http://127.0.0.1:8080;
proxy_bind $remote_addr trong suốt;
}
}
Chi tiết
Giả thuyết:
- Các địa chỉ IP:
- Proxy ngược/Phụ trợ cục bộ:
192.168.1.90 (eth0)
& 172.17.0.1 (eth1)
- Phụ trợ bên ngoài:
172.17.0.2
- Khách hàng:
192.168.1.91
- Cổng:
- giao diện người dùng:
80
(không có TLS)
- phụ trợ:
8080
Trường hợp số 1: Máy chủ HTTP được lưu trữ trên phụ trợ bên ngoài (http://172.17.0.2:8080).
# /etc/nginx/conf.d/nginx-revprox-test.conf
người phục vụ {
nghe 192.168.1.90:80;
địa điểm / {
proxy_pass http://172.17.0.2:8080;
proxy_bind $remote_addr trong suốt;
}
}
Các thủ công nói rằng chúng ta phải cấu hình iptables do đó:
iptables -t mangle -A PREROUTING -p tcp -s 172.17.0.2 --sport 8080 -j MARK --set-xmark 0x1/0xffffffff
quy tắc ip thêm fwmark 1 tra cứu 100
tuyến ip thêm cục bộ 0.0.0.0/0 dev lo bảng 100
=> Nó hoạt động tốt.
Trường hợp số 2: Máy chủ HTTP được lưu trữ trên cùng một máy với proxy ngược và lắng nghe eth1
(http://172.17.0.1:8080).
# /etc/nginx/conf.d/nginx-revprox-test.conf
người phục vụ {
nghe 192.168.1.90:80;
địa điểm / {
proxy_pass http://172.17.0.1:8080;
proxy_bind $remote_addr trong suốt;
}
}
Dựa theo câu trả lời này và sơ đồ này, chỉ có ĐẦU RA và SAU ĐƯỜNG áp dụng cho các gói được tạo cục bộ. Do đó, chúng ta cần thay đổi quy tắc iptables của mình:
iptables -t mangle -A OUTPUT -p tcp -s 172.17.0.2 --sport 8080 -j MARK --set-xmark 0x1/0xffffffff
=> Nó cũng hoạt động.
Trường hợp số 3: Máy chủ HTTP được lưu trữ cục bộ nhưng hãy lắng nghe lo
(http://127.0.0.1:8080).
# /etc/nginx/conf.d/nginx-revprox-test.conf
người phục vụ {
nghe 192.168.1.90:80;
địa điểm / {
proxy_pass http://127.0.0.1:8080;
proxy_bind $remote_addr trong suốt;
}
}
=> [!] Tôi không thể làm cho nó hoạt động, ngay cả với một ĐẦU RA quy tắc trong iptables.
cuộn tròn http://192.168.1.90:80
không hoạt động từ máy khách (nó chỉ hoạt động từ máy chủ nhưng đó không phải là vấn đề).
Tôi đã bỏ lỡ điều gì đó về iptables. Bạn có thể giúp tôi?