Điểm:0

iptables và proxy ngược Nginx cho máy chủ cục bộ

lá cờ pk

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àysơ đồ này, chỉ có ĐẦU RASAU ĐƯỜ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?

lá cờ pk
Độ chính xác: trường hợp thứ ba không có `proxy_bind` hoạt động tốt, nhưng tất nhiên chúng tôi mất tính minh bạch của IP.
lá cờ us
Tôi sẽ triển khai chuyển địa chỉ IP thực trong tiêu đề và sau đó phần phụ trợ sẽ sử dụng địa chỉ IP đó. Thực hiện hack bảng định tuyến để đạt được mục tiêu này khiến giải pháp trở nên khó hiểu hơn.
djdomi avatar
lá cờ za
bạn cũng không thể đặt tiêu đề tùy chỉnh? NGINX có thể làm được điều này, nhưng ứng dụng của bạn?

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.