Estoy intentando crear un firewall para mi Raspberry Pi. Las reglas que quiero son
Permitir SSH entrante: esto funciona
Permitir ssh saliente: esto NO funciona y es mi principal problema
- Permitir VNC entrante y saliente: actualmente esto funciona parcialmente y puedo conectarme pero no puedo realizar ninguna acción. Realmente no es una prioridad
- 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.
- Permitir correos electrónicos salientes: esto funciona
- Permitir pings salientes y obtener una respuesta: esto funciona
- 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 22
desde 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 --dport
en 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 lo
para 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 NEW
estado 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: INPUT
o OUTPUT
, solo una vez. Por lo tanto, queda más claro que --sport 22
SSH no estaba ayudando en el caso saliente ( --dport 22
es necesario). RELATED
Habría sido útil si hubiera udp
reglas para las respuestas de error relacionadas icmp
. En este entorno puede que no sea necesario.