====== 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