====== iptables ======
cortafuegos firewall rule regla network red NAT
===== Redirigir paquetes entre 2 interfaces =====
http://wiki.legido.com/doku.php?id=informatica:linux:red:mapear_trafico_entre_interfaces
===== Escribir en log =====
2 objetivos:
-Anyadirle una etiqueta a cada tipo de mensaje en funcion de la cadena que coincide, al objeto de facilitar posteriormente el analisis de los logs
-Escribir (con rsyslog) en un log distinto a /var/log/messages
1. Ejemplo del script para crear reglas de iptables, lo grabamos como '/tmp/cortafuegos.sh':
#!/bin/bash
# Creamos variables
IPTABLES=/sbin/iptables
# Borrado de reglas de iptables
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -t filter -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
########################## LOG ###############################
LOG_PREFIX="IPTABLES -"
# Si las reglas no funcionan escribo una linea
$IPTABLES -A FORWARD -j LOG --log-prefix "$LOG_PREFIX FILTER_FORWARD " --log-tcp-options --log-ip-options
$IPTABLES -A INPUT -j LOG --log-prefix "$LOG_PREFIX INPUT " --log-tcp-options --log-ip-options
$IPTABLES -t nat -A PREROUTING -j LOG --log-prefix "$LOG_PREFIX NAT_PREROUTING " --log-tcp-options --log-ip-options
$IPTABLES -t nat -A POSTROUTING -j LOG --log-prefix "$LOG_PREFIX NAT_POSTROUTING " --log-tcp-options --log-ip-options
$IPTABLES -t nat -A OUTPUT -j LOG --log-prefix "$LOG_PREFIX NAT_OUTPUT " --log-tcp-options --log-ip-options
$IPTABLES -A OUTPUT -j LOG --log-prefix "$LOG_PREFIX OUTPUT " --log-tcp-options --log-ip-options
########################## DROP ###############################
# Cierro todo a cal y canto
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
En este ejemplo el prefijo es "IPTABLES -".
2. Damos permisos de ejecucion y lo ejecutamos:
chmod +x /tmp/cortafuegos.sh
sudo /tmp/cortafuegos.sh
3. Crear el siguiente archivo:
sudo mkdir -p /etc/rsyslog.conf/iptables.conf
Con el siguiente contenido:
:msg, contains, "IPTABLES -" -/var/log/iptables.log
& ~
4. Reiniciar el servicio y asegurarnos que arranca correctamente:
sudo /etc/init.d/rsyslog restart
ps ax | grep syslog
5. Probamos a conectarnos al puerto TCP 666:
telnet localhost 666
6. En otor terminal, en el mismo servidor:
sudo tail -F /var/log/iptables.log
Y veremos algo asi:
Oct 17 09:15:13 kvm kernel: [746890.975199] IPTABLES - OUTPUT IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=40 TOS=0x10 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=666 DPT=55703 WINDOW=0 RES=0x00 ACK RST URGP=0
7. (OPCIONAL) Rotamos logs:
/etc/logrotate.d/iptables
/var/log/iptables.log
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
invoke-rc.d rsyslog reload > /dev/null
endscript
}
===== Ejemplo OpenVZ =====
#!/bin/bash
# Creamos variables
IPTABLES=/sbin/iptables
DEPMOD=/sbin/depmod
MODPROBE=/sbin/modprobe
ROUTER="192.168.1.1"
VM="192.168.0.0/24"
PROXMOX="192.168.1.200"
INTERNET_HOSTS="
192.168.0.203
"
# Interfaces
EXTIF="vmbr0"
INTIF="venet0"
# Verifica que los módulos del núcleo están bien
$DEPMOD -a
# Carga manualmente el módulo iptables
$MODPROBE ip_tables
# Éste módulo se carga automáticamente cuando se habilita la
# funcionalidad MASQ
$MODPROBE ip_conntrack
# Opcional: reenvío de tráfico ftp
$MODPROBE ip_conntrack_ftp
# Opcional: reenvío de tráfico irc
$MODPROBE ip_conntrack_irc
# Éste módulo se carga automáticamente cuando se habilita la
# funcionalidad MASQ
$MODPROBE iptable_nat
# Opcional: soporte non-PASV FTP.
$MODPROBE ip_nat_ftp
#CRÍTICO: habilitar redirección IPv4, deshabilitado por defecto
echo "1" > /proc/sys/net/ipv4/ip_forward
# Soporte para ip dinámica
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
# Borrado de reglas de iptables
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -F FORWARD
$IPTABLES -t nat -F
############################ Variable #############################
# Abrir acceso hacia fuera
for host in $INTERNET_HOSTS
do
if [[ "$host" != "#"* ]]
then
$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -s "$host" -j ACCEPT
fi
done
# Permitir acceso de las VM's afuera en respuesta a conexiones externas
$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -s "$VM" -m state --state ESTABLISHED,RELATED -j ACCEPT
# Permitir DNS lookups
# TODO: creo que jugando con NAT NO deberia ser necesario estos lookups
$IPTABLES -A FORWARD -p udp --dport 53 -s $VM -d $ROUTER -j ACCEPT
# FTP
$IPTABLES -t nat -I PREROUTING -p tcp --dport 8021 -j DNAT --to-destination 192.168.0.203:21
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -p tcp --dport 21 -d "192.168.0.203" -j ACCEPT
# VPN
$IPTABLES -t nat -I PREROUTING -p tcp --dport 1723 -j DNAT --to-destination 192.168.0.203:1723
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -p tcp --dport 1723 -d "192.168.0.203" -j ACCEPT
# Casca acceso a VM desde Proxmox
#iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.0.203
# Permitir la redirección desde una interfaz a la otra solo de determidas conexiones
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $EXTIF
# Habilitar NAT masquerade en la interfaz externa
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
# Si las reglas no funcionan escribo una linea
$IPTABLES -A FORWARD -j LOG --log-prefix "FORWARD "
#$IPTABLES -A INPUT -j LOG --log-prefix "INPUT "
#$IPTABLES -A OUTPUT -j LOG --log-prefix "OUTPUT "
===== Mostrar numero de paquetes =====
sudo iptables -L -n -v -x
Chain INPUT (policy ACCEPT 384086 packets, 61462048 bytes)
pkts bytes target prot opt in out source destination
398 23805 ACCEPT udp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
3 897 ACCEPT udp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
156432 229715525 ACCEPT all -- * virbr1 0.0.0.0/0 10.0.0.0/24 state RELATED,ESTABLISHED
92451 5243004 ACCEPT all -- virbr1 * 10.0.0.0/24 0.0.0.0/0
3 897 ACCEPT all -- virbr1 virbr1 0.0.0.0/0 0.0.0.0/0
8 480 ACCEPT tcp -- eth0 virbr1 0.0.0.0/0 10.0.0.3 tcp dpt:1723
0 0 ACCEPT 47 -- eth0 * 0.0.0.0/0 10.0.0.3
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `FILTER_FORWARD '
Chain OUTPUT (policy ACCEPT 370021 packets, 87787030 bytes)
pkts bytes target prot opt in out source destination