¿Cómo puedo configurar estas reglas de iptables para que se ejecuten al inicio?

20

Normalmente ejecuto mis reglas de iptables cada vez que inicio sesión. Desde la terminal escribo;

sudo sh firewall.sh

Configurando la computadora de mi hermana, quiero darle una protección básica de firewall. Ella no iniciará sesión como administrador, solo una cuenta estándar. ¿Cómo puedo hacer que se ejecute un script de firewall cada vez que inicia sesión sin que tenga que escribir ninguna contraseña?

El guión que escribí para la computadora de mi hermana contiene;

#!/bin/sh

modprobe ip_conntrack
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -I OUTPUT -p tcp --dport 80 --sport 32768:61000 -j ACCEPT
iptables -I OUTPUT -p udp --dport 53 --sport 32768:61000 -j ACCEPT
iptables -I OUTPUT -p tcp --dport 443 --sport 32768:61000 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -I OUTPUT -p icmp -j DROP

iptables -I INPUT -p icmp -j DROP
iptables -I INPUT -p udp -j DROP
iptables -I INPUT -p tcp -m tcp --syn -j DROP
iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Lo coloqué en su carpeta de inicio como firewall.sh y lo configuré para que sea ejecutable (haga clic con el botón derecho en el archivo y marque la opción "permitir ejecutar archivo como programa" en la pestaña de permisos).

Ejecutar este script desde la terminal como root funciona bien.

Después de escribir;

sudo sh firewall.sh

Escribí en la terminal

sudo iptables -L -v

y consigo

Chain INPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,ACK/SYN
    0     0 DROP       udp  --  any    any     anywhere             anywhere            
    0     0 DROP       icmp --  any    any     anywhere             anywhere            

Chain FORWARD (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       icmp --  any    any     anywhere             anywhere            
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spts:32768:61000 dpt:https
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere             udp spts:32768:61000 dpt:domain
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spts:32768:61000 dpt:http
    0     0 ACCEPT     all  --  any    lo      anywhere             anywhere

¿Cómo puedo hacer que este script se ejecute automáticamente al iniciar sesión, o posiblemente guardar estas reglas permanentemente para la computadora de mi hermana? ¿Podría proporcionar algún código detallado, ya que mis primeros intentos en el método rc.local y iptables-save no han tenido mucho éxito. En cada reinicio, todas las cadenas INPUT, OUTPUT y FORWARD se restablecen a ACCEPT, sin políticas enumeradas cuando escribosudo iptables -L -v

Mikelane
fuente
Casi dos años después, pero un comentario importante: asegúrate de tener ip6tablesreglas si algún día obtienes conectividad v6, ya que IPv6 es manejado por ip6tablesy no iptables.
Thomas Ward

Respuestas:

38

Es posible que desee utilizar el iptables-persistentpaquete en lugar de meterse con sus scripts de arranque. Primero, ejecute su script para configurar las reglas del firewall. En segundo lugar, corre sudo apt-get install iptables-persistenty sigue las indicaciones. Cuando solicite guardar las reglas actuales, presione "Sí" en ambas indicaciones. Ahora, al reiniciar, sus reglas de iptables serán restauradas.


NOTA: Si cambia sus reglas después de esto, deberá realizar los siguientes comandos después de los cambios:

Para guardar las reglas de iptables de IPv4: sudo su -c 'iptables-save > /etc/iptables/rules.v4'

Para guardar sus reglas de IPv6 ip6tables: sudo su -c 'ip6tables-save > /etc/iptables/rules.v6'

Thomas Ward
fuente
Gracias, eso funcionó. Si quiero cambiar temporalmente las reglas, puedo ejecutar un script desde la terminal, ¿sí?
Mikelane
Sí, o puede manipular directamente el sistema iptables directamente. SIN EMBARGO, si planea usar la regla temporal de manera persistente, no se garantiza que las nuevas reglas se guarden a menos que haga los comandos que establezco en mi respuesta.
Thomas Ward
¿Es una mala idea correr sudo dpkg-reconfigure iptables-persistentdespués de cambiar una regla?
souravc
@souravc la pregunta que responde es "¿Por qué necesitarías o querrías?" La idea es que no tendría que hacerlo y puede reescribir (o sobrescribir (los archivos rules.v4o rules.v6manualmente para que se indexen en el próximo inicio, o inmediatamente si ejecuta iptables-restore < /etc/iptables/rules.v4o)ip6tables-restore < /etc/iptables/rules.v6
Thomas Ward
2

Suponiendo que tiene las reglas de firewall en:

/etc/iptables.up.rules

Quizás la respuesta más obvia será crear un archivo llamado iptables en:

/etc/network/if-pre-up.d

con el contenido:

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

y hacerlo ejecutable usando

sudo chmod +x /etc/network/if-pre-up.d/iptables

De esta manera, antes de que se active su interfaz de red, se cargarán sus reglas.

Antonio J. de Oliveira
fuente
Gracias, ¿arroja el registro a alguna parte? Esto no funciona y sospecho que esto se debe a que mi servidor dns utilizado tiene una resolución aún no iniciada cuando mi host se está iniciando.
Dimitri Kopriwa