Problemas de IPtables: se agradece la ayuda

Problemas de IPtables: se agradece la ayuda

Estoy intentando crear un firewall para mi Raspberry Pi. Las reglas que quiero son

  1. Permitir SSH entrante: esto funciona

  2. Permitir ssh saliente: esto NO funciona y es mi principal problema

  3. Permitir VNC entrante y saliente: actualmente esto funciona parcialmente y puedo conectarme pero no puedo realizar ninguna acción. Realmente no es una prioridad
  4. Permitir https salientes: puedo visitar un sitio web, pero creo que necesito agregar otra línea de DNS para que esto funcione correctamente en el arranque.
  5. Permitir correos electrónicos salientes: esto funciona
  6. Permitir pings salientes y obtener una respuesta: esto funciona
  7. Deje todo lo demás: supongo que esto funciona porque no puedo hacer SSH saliente, así que creo que el problema está en mi regla.

Sé que mi ssh funciona en general, ya que sin el firewall cargado puedo realizar un SSH saliente de un pi a otro.

    #!/bin/sh

    #Flush all rules
    iptables -F

    #Allow incoming and outgoing SSH
    sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A OUTPUT  -p tcp --sport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

    #Allow VNC sessions
    sudo iptables -A INPUT -s 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -j ACCEPT
    sudo iptables -A OUTPUT -d 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --sports 5900:5905,6000:6005 -j ACCEPT

    #Accept only incoming etstablished and allow new or established outgoing
    sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

    #Accept port 587 for email
    sudo iptables -A INPUT -p tcp --sport 587 -j ACCEPT
    sudo iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

    #Allow ping requests to go out and get a reply
    sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

    #Drop all other packets and protocols
    sudo iptables -P INPUT DROP
    sudo iptables -P FORWARD DROP
    sudo iptables -P OUTPUT DROP

Respuesta1

Su problema con la línea SSH es que está intentando permitir el puerto de origen 22desde su máquina local. Sin embargo, cuando se conecta a un servidor SSH remoto, su máquina no utiliza el puerto 22 para ello. Está utilizando un puerto aleatorio, generalmente en el rango de puertos más alto. Esto tiene sentido porque si usara el puerto 22 para conexiones SSH salientes, solo podría conectarse a un servidor SSH a la vez.

Para solucionar este problema, la forma más sencilla es utilizar --dporten lugar de --sport, permitiendo cada conexión que tenga un puerto de destino 22(ssh).

sudo iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Tenga en cuenta que debeagregaresta línea en lugar de reemplazarla, como señaló @ bcs78 en los comentarios.

Generalmente, también es una mala idea bloquear el tráfico de la conexión loopback interna. Algunos programas dependen de esta conexión y no funcionarán correctamente sin ella. Agregue esto al comienzo de su script:

sudo iptables -A INPUT -i lo -j ACCEPT

Respuesta2

Agregue, una vez por cadena, un comodíncon estadoregla que simplificará la mayoría de las otras reglas:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -F

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Además de la regla de interfaz habitual lopara permitir todos los servicios locales, elimínela si cree que realmente no es necesaria:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Ahora no tiene que duplicar sus otras reglas (dejaré el NEWestado cuando estaba allí, incluso si no es muy útil y no estuvo presente constantemente):

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 10.10.10.1 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.0.150 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT

iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

Todo está controlado por las dos primeras reglas, no es necesario duplicar cada regla y ahora la dirección inicial del flujo es clara: INPUTo OUTPUT, solo una vez. Por lo tanto, queda más claro que --sport 22SSH no estaba ayudando en el caso saliente ( --dport 22es necesario). RELATEDHabría sido útil si hubiera udpreglas para las respuestas de error relacionadas icmp. En este entorno puede que no sea necesario.

información relacionada