2012-06-16 18 views
20

Tôi có một số quy tắc iptables chuyển hướng yêu cầu cổng 80 lên máy chủ ứng dụng của chúng tôi (GlassFish) tại cổng 8080 (và cả các cổng SSL nữa nhưng tôi đã bỏ chúng ra để đơn giản) .iptables chuyển hướng 80 đến 8080 nhưng chặn truy cập công cộng 8080

Trong khi những gì chúng tôi có hoạt động tốt (và cá nhân tôi không có vấn đề với nó) cổng 8080 cũng mở cửa cho thế giới bên ngoài nếu ai đó muốn chỉ định nó trong url. Nó đã được bắt buộc rằng cổng 8080 nên được đóng cửa từ truy cập từ thế giới bên ngoài và chỉ 80 được mở.

Tôi không muốn thay đổi người nghe trên máy chủ ứng dụng (như sử dụng cổng 80 điều này dường như cần quyền cao cho người dùng đang chạy máy chủ ứng dụng) và người nghe trên cổng 8080 cần biết IP nguồn gói tin khi ứng dụng kiểm tra các yêu cầu tới ứng dụng (nghĩa là chúng ta không thể thay đổi địa chỉ IP nguồn thành địa chỉ cục bộ).

Cấu hình iptables hiện tại ở bên dưới. Có ai biết nếu có một cách để chặn 8080 từ internet công cộng trong khi giữ lại IP nguồn trong các gói chuyển hướng đến từ cổng 80?

Rất cám ơn trước.


    iptables -P INPUT ACCEPT 
    iptables -P OUTPUT ACCEPT 
    iptables -P FORWARD DROP 

    # allow establishment of connections initialised by my outgoing packets 
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 

    # accept anything on localhost 
    iptables -A INPUT -i lo -j ACCEPT 

    ################################################################ 
    #individual ports tcp 
    ################################################################ 
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT 
    iptables -A INPUT -p tcp --dport 8080 -j ACCEPT 

    #drop everything else 
    iptables -A INPUT -j DROP 

    ################################################################ 
    #Redirection Rules 
    ################################################################ 
    # redirection rules (allowing forwarding from localhost) 
    iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080 

    # redirection http 
    iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080 

+0

bạn có xem xét chặn cổng 8080 và chuyển tiếp trên proxy proxy httpd không? –

+0

Cảm ơn bạn đã đề xuất. Không có apache hoặc mod_proxy có sẵn trên máy chủ này hiện tại (mà tôi hiểu nó sẽ cần ..?), Nhưng rõ ràng nếu nó không thể với iptables - hoặc các gói Linux tiêu chuẩn - sau đó tôi đoán đó là một cái gì đó để xem xét. – lazidar

Trả lời

20

Một cách tôi đã tìm thấy để thực hiện điều này là sử dụng mục tiêu MARK trong chuỗi PREROUTING của bảng mangle.

Thêm một quy tắc để gắn thẻ các gói bạn muốn chặn:

iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j MARK --set-mark 1 

Sau đó, trước khi bạn cho phép cổng 8080 thêm này sẽ giảm gói rõ rệt:

iptables -A INPUT -m mark --mark 1 -j DROP 
+0

Hoàn hảo - Tôi đã tự hỏi nếu nó có thể với iptables một mình, nhưng điều này làm việc tốt. Cảm ơn. – lazidar

+0

@lazidar Nếu nó là hoàn hảo tại sao bạn không đánh dấu nó chính xác. –

+1

Không được phép khi tôi thử - nó nói với tôi rằng tôi không có đủ danh tiếng! ... Một điều tôi nghe thường xuyên. – lazidar

2

tôi xử lý này trong hơi cách khác. Tôi chuyển tiếp 443 đến 3000 (như trên) nhưng cũng chuyển tiếp 3000 đến 443. Sau đó tôi cho phép lưu lượng trên 3000 nhưng chặn nó trên 443. Khi lọc lưu lượng 443 chỉ nên xuất phát từ cổng 3000.

Tôi đang sử dụng ufw do đó, các quy tắc lọc được nhập bằng công cụ đó. Tôi đã thêm các quy tắc nat trong /etc/ufw/before.rules.

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3000 

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 3000 -j REDIRECT --to-ports 443