Dudas con iptables: ¿como véis este script?
-
Hola, estoy empezando a escribir reglas de iptables y tengo algunas dudas. He escrito un primer script pero creo que algo tiene que estar mal, si fuerais tan amables de decirme los fallos que he cometido…. es que yo no los veo
#!bin/sh # Firewall iptables básico #------------------------------ ################################################3 echo Aplicando las reglas del firewall iptables... ## Primeras reglas /sbin/iptables -P INPUT ACCEPT /sbin/iptables -F INPUT /sbin/iptables -P OUTPUT ACCEPT /sbin/iptables -F OUTPUT /sbin/iptables -P FORWARD ACCEPT /sbin/iptables -F FORWARD /sbin/iptables -t nat -F ## Localhost es amigable /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -A OUTPUT -o lo -j ACCEPT ## Aceptar cualquier entrada relacionada con conexiones legítimas /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ## Sólo se permite conexión por ssh desde la red local /sbin/iptables -A INPUT -i eth0 -s 192.168.0.1/24 -p TCP --dport 22 -j ACCEPT /sbin/iptables -A INPUT -i eth0 -s 0.0.0.0/0 -p TCP --dport 22 -j DROP ## Sólo se permite conexión a smb desde la red local /sbin/iptables -A INPUT -i eth0 -s 192.168.0.1/24 -p TCP --dport 139 -j ACCEPT /sbin/iptables -A INPUT -i eth0 -s 192.168.0.1/24 -p TCP --dport 445 -j ACCEPT /sbin/iptables -A INPUT -i eth0 -s 0.0.0.0/0 -p TCP --dport 139 -j DROP /sbin/iptables -A INPUT -i eth0 -s 0.0.0.0/0 -p TCP --dport 445 -j DROP ## Filtramos el puerto 10000 (WEBMIN) /sbin/iptables -A INPUT -i lo -p TCP --dport 10000 -j ACCEPT /sbin/iptables -A INPUT -i eth0 -s 0.0.0.0/0 --dport 10000 -j DROP ## Filtramos el puerto 901 (SWAT) /sbin/iptables -A INPUT -i lo -p TCP --dport 901 -j ACCEPT /sbin/iptables -A INPUT -i eth0 -s 0.0.0.0/0 --dport 901 -j DROP ## Filtramos el puerto 631 (CUPS) /sbin/iptables -A INPUT -i lo -p TCP --dport 631 -j ACCEPT /sbin/iptables -A INPUT -i eth0 -s 0.0.0.0/0 --dport 631 -j DROP ## FORWARD ## Log del forward /sbin/iptables -A FORWARD -j LOG ## Forward para la LAN iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE echo 1 > /proc/sys/net/ipv4/ip_forward #Configuración terminada echo Las reglas del firewall están aplicadas #--------------------------------------------------------------------
Para empezar es que cuando lanzo el script me salen estos "errores"
osiris:/var/lib/iptables# sh firewall-iptables Aplicando las reglas del firewall iptables... iptables v1.2.9: Unknown arg `--dport' Try `iptables -h' or 'iptables --help' for more information. iptables v1.2.9: Unknown arg `--dport' Try `iptables -h' or 'iptables --help' for more information. iptables v1.2.9: Unknown arg `--dport' Try `iptables -h' or 'iptables --help' for more information. Las reglas del firewall están aplicadas
…pero no sé que tengo que cambiar en el script para que vaya bien
¿Me podéis ayudar? Si hay alguna regla más que deba añadir estaría bien que la pusierais, así podríamos hacer un megapost con configuraciones de iptables que nos vendrían muy bien a todos:p
-
A ver si te puedo ayudar, pero de de iptables se lo básico.
Primero, podrías poner el '/sbin/iptables' como una variable (IPTABLES, por ejemplo) para no escribir tanto.
## Primeras reglas /sbin/iptables -P INPUT ACCEPT /sbin/iptables -F INPUT /sbin/iptables -P OUTPUT ACCEPT /sbin/iptables -F OUTPUT /sbin/iptables -P FORWARD ACCEPT /sbin/iptables -F FORWARD /sbin/iptables -t nat -F
El flush de reglas se hace al principio y luego las políticas por defecto, si aplicas una politica por defecto para INPUT, OUTPUT y FORWARD y después la borras, como si no hicieses nada. Te quedaría algo así:
IPTABLES='/sbin/iptables' # flush de reglas $IPTABLES -F $IPTABLES -X $IPTABLES -Z $IPTABLES -t nat -F # politicas por defecto $IPTABLES -P INPUT ACCEPT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -P FORWARD ACCEPT
## Localhost es amigable /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -A OUTPUT -o lo -j ACCEPT ## Aceptar cualquier entrada relacionada con conexiones legítimas /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Estas reglas, en principio, no tienen sentido, ya que tu política por defecto es ACCEPT, por lo tanto no harían falta (a no ser que después cerrases con otra regla, que no hay puesta), esto haría falta si DROP fuese nuestra política por defecto para INPUT.
Luego ya podrías cerrar los puertos como estabas haciendo.
Para hacer debug de tus scripts puedes poner añadir un '-x' a la primera línia, quedándote: #!/bin/sh -x
y así te mostrará la ejecución del script línea a línea viendo dónde falla, que en tu caso es cuando deniegas el acceso a los puertos 10000, 901 y 631 porque te falta el argumento '-p tcp' .## FORWARD ## Log del forward /sbin/iptables -A FORWARD -j LOG ## Forward para la LAN iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Aquí no estoy seguro del todo, pero creo que tu última regla no se tendría en cuenta porque cualquier paqute que llegue a FORWARD será logeado y al coincidir con una regla de iptables, dejará de comprobar; por lo tanto deberías poner el LOG de paquetes al final.
Así se te quedaría así:
#!/bin/sh # Firewall iptables básico #------------------------------ ################################################3 echo Aplicando las reglas del firewall iptables... IPTABLES='/sbin/iptables' OUR_NET='192.168.0.1/24' ANY='0.0.0.0/0' # flush de reglas $IPTABLES -F $IPTABLES -X $IPTABLES -Z $IPTABLES -t nat -F # politicas por defecto $IPTABLES -P INPUT ACCEPT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -P FORWARD ACCEPT # Sólo permintimos acceder desde la red local a $IPTABLES -A INPUT -i eth0 -s $OUR_NET -p tcp --dport 22 -j ACCEPT $IPTABLES -A INPUT -i eth0 -s $ANY -p tcp --dport 22 -j DROP ## Sólo se permite conexión a smb desde la red local $IPTABLES -A INPUT -i eth0 -s $OUR_NET -p tcp --dport 139 -j ACCEPT $IPTABLES -A INPUT -i eth0 -s $OUR_NET -p tcp --dport 445 -j ACCEPT $IPTABLES -A INPUT -i eth0 -s $ANY -p tcp --dport 139 -j DROP $IPTABLES -A INPUT -i eth0 -s $ANY -p tcp --dport 445 -j DROP ## Filtramos el puerto 10000 (WEBMIN) $IPTABLES -A INPUT -i lo -p tcp --dport 10000 -j ACCEPT $IPTABLES -A INPUT -i eth0 -s $ANY -p tcp --dport 10000 -j DROP ## Filtramos el puerto 901 (SWAT) $IPTABLES -A INPUT -i lo -p tcp --dport 901 -j ACCEPT $IPTABLES -A INPUT -i eth0 -s $ANY -p tcp --dport 901 -j DROP ## Filtramos el puerto 631 (CUPS) $IPTABLES -A INPUT -i lo -p tcp --dport 631 -j ACCEPT $IPTABLES -A INPUT -i eth0 -s $ANY -p tcp --dport 631 -j DROP ## FORWARD ## Forward para la LAN $IPTABLES -t nat -A POSTROUTING -o eth0 -j MASQUERADE ## Log del forward $IPTABLES -A FORWARD -j LOG # Activar el forwarding echo 1 > /proc/sys/net/ipv4/ip_forward #Configuración terminada echo Las reglas del firewall están aplicadas
-
Muchas gracias josefu;)