2012-06-16 5 views
20

Ho alcune regole iptables che reindirizzano le richieste per la porta 80 sul nostro server delle applicazioni (GlassFish) alla porta 8080 (e anche le porte SSL ma le ho lasciate fuori per semplicità) .iptables reindirizza 80 a 8080 ma blocca l'accesso pubblico 8080

Mentre ciò che funziona funziona bene (e personalmente non ho un problema con esso) la porta 8080 è aperta anche al mondo esterno se qualcuno volesse specificarlo nell'URL. È stato imposto che la porta 8080 debba essere chiusa dall'accesso dal mondo esterno e che solo 80 siano aperti.

Non desidero modificare l'ascoltatore sul server delle applicazioni (in quanto utilizzare la porta 80 sembra richiedere autorizzazioni elevate per l'utente che esegue il server dell'app) e il listener sulla porta 8080 deve conoscere l'IP di origine di il pacchetto come l'applicazione verifica le richieste all'applicazione (cioè non possiamo cambiare l'indirizzo IP di origine a quello locale).

La configurazione attuale di iptables è la seguente. Qualcuno sa se esiste un modo per bloccare 8080 dall'internet pubblico mantenendo l'IP di origine nei pacchetti reindirizzati dalla porta 80?

Molte grazie in anticipo.


    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

hai preso in considerazione il blocco della porta 8080 e l'inoltro su httpd proxypass? –

+0

Grazie per il suggerimento. Al momento non ci sono apache o mod_proxy disponibili su questo server (che capisco sarebbe necessario ..?), Ma ovviamente se non è possibile con iptables - o pacchetti Linux standard - allora immagino che sia qualcosa da esaminare. – lazidar

risposta

20

Un modo che ho trovato per raggiungere questo obiettivo è di usare il target MARK nella catena PREROUTING della tabella mangle.

Aggiungere una regola per contrassegnare i pacchetti che si desidera bloccare:

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

Poi, prima di consentire la porta 8080 aggiungere questo per eliminare i pacchetti marcati:

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

Perfetto - Mi stavo chiedendo se fosse possibile con iptables da solo, ma questo ha funzionato bene. Grazie. – lazidar

+0

@lazidar Se fosse perfetto perché non lo segnate correttamente. –

+1

Non è stato permesso quando ho provato - mi ha detto che non avevo abbastanza reputazione! ... Qualcosa che sento troppo spesso. – lazidar

2

ho gestito questo in un po ' un modo differente. Ho inoltrato il numero da 443 a 3000 (come sopra), ma ho inoltrato anche il numero da 3000 a 443. Quindi il traffico sul 3000 si blocca su 443. Quando il filtro del 443 deve essere originariamente dalla porta 3000.

Sto usando ufw quindi le regole del filtro sono state inserite usando quello strumento. Ho aggiunto le regole nat in /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