3 votos

El reenvío de puertos de iptables (preenrutamiento del puerto 80) y el cortafuegos no funcionan juntos

He leído muchos artículos y respuestas sobre este tema y he discutido con el soporte de Linode, pero nadie parece ser capaz de responder a mi problema exacto.

Parece fácil - me gustaría usar un firewall iptables para restringir el acceso a todos los puertos excepto 22, 80 y 443. Linode tiene una gran escritura aquí: https://library.linode.com/securing-your-server#sph_creating-a-firewall y utilicé sus reglas de firewall tal cual. El cortafuegos funciona bien.

También quiero pre-enrutar algunos puertos, porque esta es una aplicación nodejs. Así que he utilizado:

sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3000

Estas reglas funcionan si no tengo las reglas del firewall. De hecho, las estoy usando ahora mismo, pero he tenido que dejar el cortafuegos desactivado.

Si añado las reglas del cortafuegos, el PREROUTING deja de funcionar. Si guardo las reglas iptables activas en un archivo para verlas, tanto el firewall (reglas de filtrado) como el PREROUTING (reglas nat) están presentes, pero sólo funcionan las reglas del cortafuegos. Ver aquí:

# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*security
:INPUT ACCEPT [1606:135329]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*raw
:PREROUTING ACCEPT [1620:139613]
:OUTPUT ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*nat
:PREROUTING ACCEPT [4:248]
:INPUT ACCEPT [6:376]
:OUTPUT ACCEPT [12:728]
:POSTROUTING ACCEPT [12:728]
-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
-A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3000
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*mangle
:PREROUTING ACCEPT [1620:139613]
:INPUT ACCEPT [1606:135329]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1206:144815]
:POSTROUTING ACCEPT [1206:144815]
COMMIT
# Completed on Wed Mar 26 02:40:04 2014
# Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
-A FORWARD -j DROP
-A OUTPUT -j ACCEPT
COMMIT
# Completed on Wed Mar 26 02:40:04 2014 

Si utilizo iptables -F se eliminarán sólo las reglas del cortafuegos (filtro) y el PREROUTING comenzará a funcionar de nuevo. Así que definitivamente es un conflicto. El orden de los bloques de reglas no parece importar, ya que esto (arriba) es la salida estándar de iptables, independientemente del orden en que guardé las reglas en iptables.

A mí me parece que es una de dos cosas:

  1. PREROUTING puertos que también tienen la regla ACCEPT podría significar que el preenrutamiento sea ignorado
  2. que soy PREROUTING a un puerto que está técnicamente bloqueado (pero pensé que ahí estaba el "PRE")

¿Alguien lo sabe?

Gracias.

Paul

6voto

LinuxDevOps Puntos 1188

Después del PREROUTING los paquetes locales van al filtro local donde se descartan (su caso 2).

Así que sólo tienes que permitir el tráfico entrante a esos puertos en iptables:

iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT

iptables -A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT

Como estás redirigiendo el tráfico http(s) del 80/443 al 8080/3000 es como si estos últimos puertos estuvieran abiertos y expuestos a Internet de todos modos, así que no hay diferencia desde el mundo exterior y no hay más implicaciones de seguridad.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: