2012-06-16 81 views
20

Tengo algunas reglas iptables que redirigen las solicitudes para el puerto 80 a nuestro servidor de aplicaciones (GlassFish) en el puerto 8080 (y también puertos SSL pero las he omitido por simplicidad) .iptables redirigir 80 a 8080 pero bloquear 8080 acceso público

Si bien lo que tenemos funciona bien (y personalmente no tengo un problema) el puerto 8080 también está abierto al mundo exterior si alguien desea especificarlo en la url. Se ha ordenado que el puerto 8080 se cierre del acceso desde el mundo exterior y solo 80 estén abiertos.

No deseo cambiar el oyente en el servidor de la aplicación (como para usar el puerto 80 esto parece necesitar permisos elevados para el usuario que ejecuta el servidor de aplicaciones) y el oyente en el puerto 8080 necesita saber la IP de origen de el paquete a medida que la aplicación audita las solicitudes a la aplicación (es decir, no podemos cambiar la dirección IP de origen a una local).

La configuración actual de iptables está debajo. ¿Alguien sabe si hay una manera de bloquear 8080 de la internet pública mientras se retiene la IP de origen en los paquetes redirigidos desde el puerto 80?

Muchas gracias de antemano.


    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

¿Consideró bloquear el puerto 8080 y retransmitir en httpd proxypass? –

+0

Gracias por la sugerencia. No hay apache o mod_proxy disponibles en este servidor en la actualidad (que entiendo que necesitaría ...), pero obviamente, si no es posible con iptables, o paquetes estándar de Linux, entonces supongo que es algo que hay que investigar. – lazidar

Respuesta

20

Una forma que he encontrado para lograr esto es usar el objetivo MARK en cadena PREROUTING de la tabla mangle.

Añadir una regla para marcar los paquetes que desea bloquear:

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

Entonces, antes de permitir que el puerto 8080 Añadir esto a caer los paquetes marcados:

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

Perfecto - Me preguntaba si era posible con iptables solo, pero esto funcionó bien. Gracias. – lazidar

+0

@lazidar Si fue perfecto, ¿por qué no lo marca correctamente? –

+1

No fue permitido cuando lo intenté - ¡me dijo que no tenía suficiente reputación! ... Algo que escucho con demasiada frecuencia. – lazidar

2

he manejado esto en un poco Manera diferente. Reenví 443 a 3000 (como arriba) pero también reenví 3000 a 443. Luego permití el tráfico en 3000 pero lo bloqueé en 443. Cuando filtre el tráfico 443 debería ser originalmente del puerto 3000.

Estoy usando ufw entonces las reglas de filtro fueron ingresadas usando esa herramienta. Agregué las reglas nat en /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 
Cuestiones relacionadas