El objetivo de este script es permitir solo el tráfico a través de la VPN, excepto el localhost <-> localhost y el tráfico entrante SSH. Pero cuando ejecuto el script sobre SSH, me desconecto y me veo obligado a reiniciar el vm. ¿Qué tiene de malo mi guión?
#!/bin/bash
iptables -F
#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT
#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT
#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
Su
#SSH
regla implica que ssh es una forma de comunicación unidireccional, que no lo es. Los datos se envían de ida y vuelta.La forma normal de lidiar con esto, ya que no puede conocer el número de puerto en el lado del cliente de antemano, es permitir conexiones que se consideren "establecidas" o "relacionadas" con una conexión establecida. Para hacer esto necesitas:
Antes de sus
DROP
reglas (y preferiblemente en la parte superior, ya que las reglas se procesan en orden y estas dos se aplicarán a la mayoría de los paquetes).Hay una explicación de cómo una conexión TCP se establece aquí ; esencialmente, el hecho de que el servidor responda al paquete permitido por su
#SSH
INPUT
regla lo hace así.fuente
-p tcp
hacer alguna diferencia en este sentido, y mire la explicación posterior para UDP en esa página (es lo mismo). El punto es que el servidor responde sin saber si iptables lo permitirá o no, y cuando iptables recibe esa respuesta del servidor en el sistema local , ahora ha visto tráfico en ambas direcciones (aunque el cliente aún no lo haya hecho), considera la conexión establecida y deja salir la respuesta. El "tecnicismo" aquí depende de que el firewall esté en el medio de las dos partes.