IpTables

De WikiMar
Dreceres ràpides: navegació, cerca

General

A page with a lot of information can be found at from http://www.cyberciti.biz/faq/how-do-i-save-iptables-rules-or-settings/

Here a copy of a selected part:


For example, save current iptables firewall rules:

# iptables-save > /root/dsl.fw

To restore iptables rules:

# iptables-restore < /root/dsl.fw

To Save the rules to /etc/sysconfig/iptables file:

# /etc/init.d/iptables save

To Restore the rules from /etc/sysconfig/iptables file:

# /etc/init.d/iptables start


To force NAT to work after using a virtual private Network (like OpenVPN)

sudo iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o eth0 -j MASQUERADE

En cas de no tenir suport pel MASQUERADE (aixo passa en algunes virtualitzacions com el OpenVZ):

sudo iptables -t nat -s 10.0.0.2 -A POSTROUTING -j SNAT --to 66.197.149.168



Per fer Port Forwarding a la mateixa maquina (Port Redirect):

iptables -A PREROUTING -t nat -p tcp --dport 26 -j REDIRECT --to-port 25


Per fer Port Forwarding a una altra maquina, cal canviar la ip de desti i fer nat de la d'origen:

iptables -t nat -A PREROUTING -i venet0 -p tcp -d 66.197.149.177 --dport 443 -j DNAT --to 66.197.149.176:444
iptables -t nat -A POSTROUTING -o venet0 -d 66.197.149.176 -p tcp -j SNAT --to-source 66.197.149.177

El que arribi a 66.197.149.177:443 anirà a 66.197.149.176:444 (més info a http://www.linuxquestions.org/questions/linux-networking-3/iptables-port-forwarding-599401/)

Cal tenir el ip_forward activat:

echo 1 > /proc/sys/net/ipv4/ip_forward

Que el Iptables engegi automaticament

Que el iptables es carregui al engegar el PC:

rc-update show   (<-- mirar si apareix)
rc-update iptables add default

En cas que s'hagi instalat el iptables manualment, no hi haurà el Startup Script dins de /etc/init.d i per tant cal primer crear-lo. Es pot crear un manualment seguint l'exemple de http://ubuntuforums.org/archive/index.php/t-19106.html

El script /etc/init.d/iptables seria:

#!/bin/sh
#
#This is a ubuntu adapted iptables script from gentoo
#(http://www.gentoo.org) which was originally distributed
# under the terms of the GNU General Public License v2
#and was Copyrighted 1999-2004 by the Gentoo Foundation
#
#This adapted version was intended for and ad-hoc personal
#situation and as such no warranty is provided.

IPTABLES_SAVE="/etc/default/iptables-rules"
SAVE_RESTORE_OPTIONS="-c"
SAVE_ON_STOP="yes"

checkrules() {
if [ ! -f ${IPTABLES_SAVE} ]
then
echo "Not starting iptables. First create some rules then run"
echo "\"/etc/init.d/iptables save\""
return 1
fi
}

save() {
echo "Saving iptables state"
/sbin/iptables-save ${SAVE_RESTORE_OPTIONS} > ${IPTABLES_SAVE}
}

start(){
checkrules || return 1
echo "Loading iptables state and starting firewall"
echo -n "Restoring iptables ruleset"
start-stop-daemon --start --quiet --exec /sbin/iptables-restore -- ${SAVE_RESTORE_OPTIONS} < ${IPTABLES_SAVE}
}

case "$1" in
save)
save
echo "."
;;

start)
start
echo "."
;;
stop)
if [ "${SAVE_ON_STOP}" = "yes" ]; then
save || exit 1
fi
echo -n "Stopping firewall"
for a in `cat /proc/net/ip_tables_names`; do
/sbin/iptables -F -t $a
/sbin/iptables -X -t $a

if [ $a == nat ]; then
/sbin/iptables -t nat -P PREROUTING ACCEPT
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P OUTPUT ACCEPT
elif [ $a == mangle ]; then
/sbin/iptables -t mangle -P PREROUTING ACCEPT
/sbin/iptables -t mangle -P INPUT ACCEPT
/sbin/iptables -t mangle -P FORWARD ACCEPT
/sbin/iptables -t mangle -P OUTPUT ACCEPT
/sbin/iptables -t mangle -P POSTROUTING ACCEPT
elif [ $a == filter ]; then
/sbin/iptables -t filter -P INPUT ACCEPT
/sbin/iptables -t filter -P FORWARD ACCEPT
/sbin/iptables -t filter -P OUTPUT ACCEPT
fi
done
start-stop-daemon --stop --quiet --pidfile /var/run/iptables.pid --exec /sbin/iptables
echo "."
;;

restart)
echo -n "Flushing firewall"
for a in `cat /proc/net/ip_tables_names`; do
/sbin/iptables -F -t $a
/sbin/iptables -X -t $a
done;
start
echo "."
;;
*)
echo "Usage: /etc/init.d/iptables {start|stop|restart|save}" >&2
exit 1
;;
esac

exit 0


More information

A good page about IpTables and forwarding can be found at: http://lpi.aluzina.org/wiki/Se/cl_2

Here a copy of one part of it:


  • Netfilter es el cortafuegos nativo de Linux 2.6. Todo se hace en el núcleo, la utilidad que gestiona las reglas del núcleo es iptables en 2.6 y 2.4, ipchains en el 2.2 y ipfwadm en 2.0.
  • El sistema de netfilter del núcleo es realmente potente y permite implementar un cortafuegos con estados. Virtualmente es capaz de filtrar sobre cualquier campo de las cabeceras de nivel 2, nivel 3 y nivel 4.

Configuración

  • El núcleo: Activar Networking -> Network packet filtering framework (Netfilter), cuando se activen las opciones habrá que reiniciar aunque se pongan como módulos.
  • El programa de usuario: emerge iptables

Cómo funciona?

  • El programa iptables hace una llamada al sistema: socket(PF_INET, SOCK_RAW, IPPROTO_RAW) y después se comunica con este socket especial mediante las llamadas getsockopt y setsockopt. Lo probamos con el strace: strace iptables -L.
  • El sistema de filtrado de Linux puede hacer tres funcionalidades distintas sobre paquetes:
    • Filtrar.
    • Traducir.
    • Y en general, Cambiar contenido de las cabeceras.
  • Para cada una de estas tres funciones distintas, hay tres únicas tablas en el sistema (no se puedan crear más ni eliminarlas). Éstas tablas son: filter, nat y mangle.
  • Las reglas no se colocan directamente en las tablas, si no que se agrupan en cadenas de reglas, ya que en realidad se ponen una detrás de la otra realizando una función en cadena, al final se aplica la política por defecto de la cadena.
  • Por lo tanto, hay tres tablas, cada una hace su función, dentro de cada tabla hay cadenas, y dentro de las cadenas las reglas.
  • Se pueden crear, borrar y modificar cadenas y reglas, pero hay 5 cadenas ya predefinidas que no pueden borrarse: PREROUTING, POSTROUTING, INPUT, OUPUT y FORWARD, tienen una función predefinida. Lo vemos con esta ruta de paquetes en el núcleo. Versión simple:

Iptables.png

  • Ruta de paquetes en el núcleo. Versión completa (con ebtables):

Diagrama linux netfilter iptables.png

Sintaxis

iptables -t tabla comando cadena regla -j OBJETIVO

Comandos de cadena

  • -N cadena: Crea una cadena
  • -X cadena: Borra una cadena
  • -E cadena: Renombra una cadena
  • -P cadena objetivo: Establece la política por defecto de una cadena PREDEFINIDA (INPUT, OUTPUT,...)

Comandos de reglas

  • -A cadena: Añade reglas
  • -D cadena: Borra reglas
  • -I cadena: Inserta reglas
  • -F cadena: Borra todas las reglas

Condiciones de regla

  • -p protocolo
  • -d ip-destino
  • -s ip-origen
  • -i interfaz de entrada
  • -o interfaz de salida
  • --sport puerto de entrada
  • --dport puerto de salida
  • --tcp-flags SYN,ACK,RST
  • --icmp-type tipo
  • --mac-source mac
  • --limit tasa limite de activación
  • --limit-burst num
  • --tos tipo de servicio
  • --mark 25 (por ejemplo, funciona con el objetivo MARK).

Objetivos (-j OBJETIVO)

  • una cadena cualquiera
  • ACCEPT
  • DROP, ignora el paquete y no envía ningún tipo de respuesta
  • RETURN, vuelve a la cadena que lo llamó
  • MARK, marca el paquete para un procesamiento posterior
  • REJECT, envia un ICMP destination unreachable o el que sea
  • TOS, establece el campo Type of service de la cabecera IP.
  • SNAT, hace nat estático en el orígen, se usa con --to-source.
  • DNAT, hace nat estátido de destino, usado con --to-destination.
  • MASQUERADE, hace nat dinámico.
  • REDIRECT, redirecciona puertos.

Guardar reglas

  • Si hacemos un equery f iptables veremos unos scripts llamados iptables-save e iptables-restore, que sirven para guardar las reglas en un fichero de texto y luego cargar el servicio iptables al inicio con las reglas que guardamos. Muy útil para implementar el firewall nosotros mismos manualmente.

Uso avanzado de Netfilter

  • Mediante el objetivo QUEUE se puede implementar un firewall avanzado con un programa de usuario, sin modificar el núcleo, mediante la librería libipq. He aquí un ejemplo de uso de la librería libipq: ipq1.c.
  • Un ejemplo de tal sofisticación sería un port knocker.