#!/sbin/runscript # firewall it! -Javier Barrio- Febrero 2003 # modificado en Julio 2003 # retocado para wifi en Enero 2004 start() { INTERFAZ_LOOP="lo" INTERFAZ_INET="eth0" INTERFAZ_LAN="eth1" INTERFAZ_WIFI="eth2" DHCP="si" NAT="si" SERVER_DHCP="81.202.91.1" IP_LO="127.0.0.1" IP_LAN="192.168.0.1" IP_WIFI="10.66.0.96" RANGO_LAN="192.168.0.0/16" RANGO_WIFI="10.66.0.96/28" PUERTOS_FORWARD="1863:1872 4661:4669" IPTABLES=`which iptables` echo -e " >>> ARRANCANDO FIREWALL... <<<\n" PROCVARS="ip_forward ip_dynaddr" echo -e "* Habilitando las siguientes variables de /proc:\n" echo " -> ${PROCVARS}..." for i in ${PROCVARS}; do echo 1 > /proc/sys/net/ipv4/${i}; done PROCVARS="rp_filter proxy_arp" echo " -> ${PROCVARS}..." for i in $PROCVARS; do echo 1 > /proc/sys/net/ipv4/conf/all/${i}; done echo -ne ">> POLITICAS\n" CADENAS="INPUT OUTPUT FORWARD" for i in ${CADENAS} do echo -n " -> Aplicando DROP a la cadena predefinida ${i}..." ${IPTABLES} --policy ${i} DROP echo -ne "[ ok ]\n" done # creamos una cadena para paquetes chungos y permitidos # y otras para diferenciar entre tcp, udp e icmp echo -ne "\n>> CADENAS\n" MISCADENAS="tcp_nigros permitidos paquetes_tcp paquetes_udp paquetes_icmp" for i in ${MISCADENAS} do echo -n " -> Creando cadena personal ${i}..." ${IPTABLES} --new-chain ${i} echo -ne "[ ok ]\n" done # filtramos y logueamos cualquier paquete marcado como NEW # en el estado de la conexion que no sea un SYN echo -n " -> Filtrando conexiones nuevas (NEW) que no tengan el flag de SYN activado... " ${IPTABLES} --append tcp_nigros --protocol TCP --tcp-flags SYN,ACK SYN,ACK \ --match state --state NEW --jump REJECT --reject-with tcp-reset echo -n "[ ok ]" # comentada porque genera demasiada broza #${IPTABLES} --append tcp_nigros --protocol TCP ! --syn --match state --state NEW --jump LOG \ #--log-prefix "Nuevo y no syn:" ${IPTABLES} --append tcp_nigros --protocol TCP ! --syn --match state --state NEW --jump DROP ${IPTABLES} --append permitidos --protocol TCP --syn --jump ACCEPT ${IPTABLES} --append permitidos --protocol TCP --match state --state ESTABLISHED,RELATED --jump ACCEPT ${IPTABLES} --append permitidos --protocol TCP --jump DROP echo -e "\n\n>> PROTOCOLOS\n" ####### # TCP # ####### echo "* Permitiendo el paso de los siguientes servicios TCP:" PUERTOS="20 21 24 25 80 81 110 113 143 220 443 873 993 995" for i in ${PUERTOS} do echo -n " -> Habilitando acceso TCP al puerto ${i}... " ${IPTABLES} --append paquetes_tcp --protocol TCP --src 0/0 --destination-port ${i} --jump permitidos echo -ne "[ ok ]\n" done ####### # UDP # ####### echo -e "\n* Permitiendo el paso de los siguientes servicios UDP:" SRVUDP="20 53 110 143 220 993" for i in ${SRVUDP} do echo -n " -> Habilitando acceso UDP en el puerto ${i}... " ${IPTABLES} --append paquetes_udp --protocol UDP --src 0/0 --source-port ${i} --jump ACCEPT echo -ne "[ ok ]\n" done if [ ${DHCP} == "si" ] then echo -n " -> Filtrando correctamente el servicio DHCP... " ${IPTABLES} --append paquetes_udp --protocol UDP -s $SERVER_DHCP --source-port 67 --dport 68 --jump ACCEPT echo -ne "[ ok ]\n" fi # Si usamos NetBEUI sin WINS se nos llenaran de broza los logs, # con esto se intenta prevenir echo -n " -> Filtrando peticiones NetBIOS para no cargar los LOGS... " ${IPTABLES} --append paquetes_udp --protocol UDP --in-interface ${INTERFAZ_INET} \ --destination-port 135:139 --jump DROP echo -ne "[ ok ]\n" # Esta para no llenar los logs de mierda de DHCP_REQUEST desde fuera de la LAN echo -n " -> Filtrando posibles peticiones DHCP desde internet... " ${IPTABLES} --append paquetes_udp --protocol UDP --in-interface ${INTERFAZ_INET} \ --destination 255.255.255.255 --destination-port 67:68 --jump DROP echo -ne "[ ok ]\n" ######## # ICMP # ######## echo -e "\n* Trafico de control ICMP:" # aceptamos echo request y reply TICMP="8 11" for i in ${TICMP} do echo -n " -> dejando pasar paquetes ICMP del tipo ${i}... " ${IPTABLES} --append paquetes_icmp --protocol ICMP --src 0/0 --icmp-type ${i} --jump ACCEPT echo -ne "[ ok ]\n" done # fieXta, aplicamos las reglas a las cadenas ######### # INPUT # ######### echo -e "\n>> Aplicando las reglas a las cadenas...\n" #Igual que en la OpenBSD, filtramos los paquetes incompletos y/o raros ${IPTABLES} --append INPUT --protocol TCP --jump tcp_nigros # aceptamos conexiones provenientes de la LAN y del Loopback ${IPTABLES} --append INPUT --protocol ALL --in-interface $INTERFAZ_LAN --src $RANGO_LAN --jump ACCEPT ${IPTABLES} --append INPUT --protocol ALL --in-interface $INTERFAZ_LOOP --jump ACCEPT # servimos dhcp a la LAN de forma correcta ${IPTABLES} --append INPUT --protocol UDP --in-interface $INTERFAZ_LAN \ --destination-port 67 --source-port 68 --jump ACCEPT # aceptamos conexiones desde internet _YA_ establecidas ${IPTABLES} --append INPUT --protocol ALL --in-interface $INTERFAZ_INET \ --match state --state ESTABLISHED,RELATED --jump ACCEPT # asignamos cada protocolo a su cadena ${IPTABLES} --append INPUT --protocol TCP --in-interface $INTERFAZ_INET --jump paquetes_tcp ${IPTABLES} --append INPUT --protocol UDP --in-interface $INTERFAZ_INET --jump paquetes_udp ${IPTABLES} --append INPUT --protocol ICMP --in-interface $INTERFAZ_INET --jump paquetes_icmp # denegamos las broacasts de las redes MS ${IPTABLES} --append INPUT --in-interface $INTERFAZ_INET --destination 224.0.0.0/8 --jump DROP # demasiada broza #${IPTABLES} --append INPUT --match limit --limit 3/minute --limit-burst 3 --jump LOG \ #--log-level DEBUG --log-prefix "IPT: paquete INPUT muerto: " ########### # FORWARD # ########### ${IPTABLES} --append FORWARD --protocol TCP --jump tcp_nigros ${IPTABLES} --append FORWARD --in-interface $INTERFAZ_LAN --jump ACCEPT ${IPTABLES} --append FORWARD --match state --state ESTABLISHED,RELATED --jump ACCEPT #${IPTABLES} --append FORWARD --match limit --limit 3/minute --limit-burst 3 --jump LOG \ #--log-level DEBUG --log-prefix "IPT: paquete FORWARD muerto: " for i in ${PUERTOS_FORWARD} do echo -n " -> Forwardeando rango de puertos ${i} a la LAN... " ${IPTABLES} --append FORWARD -i eth0 --protocol TCP -d ${RANGO_LAN} --dport ${i} --jump ACCEPT echo -ne "[ ok ]\n" done ########## # OUTPUT # ########## ${IPTABLES} --append OUTPUT --protocol TCP --jump tcp_nigros ${IPTABLES} --append OUTPUT --protocol ALL --src $IP_LO --jump ACCEPT ${IPTABLES} --append OUTPUT --protocol ALL --src $IP_LAN --jump ACCEPT ${IPTABLES} --append OUTPUT --protocol ALL --out-interface $INTERFAZ_INET --jump ACCEPT #${IPTABLES} --append OUTPUT --match limit --limit 3/minute --limit-burst 3 --jump LOG \ #--log-level DEBUG --log-prefix "IPT: paquete OUTPUT muerto: " ############### # POSTROUTING # ############### if [ ${NAT} == "si" ] then echo -n " [NAT] -> Aplicando Network Address Translation..." ${IPTABLES} --table nat --append POSTROUTING --out-interface ${INTERFAZ_INET} --jump MASQUERADE echo -ne "[ ok ]\n" fi ############## # PREROUTING # ############## for i in ${PUERTOS_FORWARD} do echo -n " [RED] -> Permitiendo el envio de archivos por el puerto ${i} desde la LAN... " ${IPTABLES} --append PREROUTING --table nat -i eth0 --protocol TCP --dport ${i} --jump DNAT --to 192.168.0.2 echo -ne "[ ok ]\n" done echo -n " [RED] -> Redireccionando el puerto 23 al 24... " ${IPTABLES} --append PREROUTING --table nat -p tcp --dport 23 -j REDIRECT --to-ports 24 echo -ne "[ ok ]\n" echo -n " [TOS] -> Aplicando un TTL comun a todos los paquetes..." ${IPTABLES} --append PREROUTING --table mangle -i eth0 -j TTL --ttl-set 64 echo -ne "[ ok ]\n" echo -n " [TOS] -> Cambiando los campos TOS para prioridad de ancho de banda entrante a WWW y SSH... " ${IPTABLES} --append PREROUTING --table mangle --protocol TCP --source-port 80 \ --jump TOS --set-tos Maximize-Throughput ${IPTABLES} --append PREROUTING --table mangle --protocol TCP --source-port 22 \ --jump TOS --set-tos Minimize-Delay echo -ne "[ ok ]\n" ########## # OUTPUT # ########## echo -n " [TOS] -> Cambiando los campos TOS para prioridad de ancho de banda saliente a WWW y SSH..." ${IPTABLES} --append OUTPUT --table mangle --protocol TCP --destination-port 80 \ --jump TOS --set-tos Maximize-Throughput ${IPTABLES} --append OUTPUT --table mangle --protocol TCP --destination-port 22 \ --jump TOS --set-tos Minimize-Delay echo -ne "[ ok ]\n" echo -e "\n>> Reglas aplicadas\n" echo ">>> FIREWALL COMPLETAMENTE ACTIVADO <<<" } stop() { IPTABLES=`which iptables` echo -e " >>> PARANDO FIREWALL <<<\n" echo -e "Reiniciando pol<ED>ticas por defecto..." for i in INPUT FORWARD OUTPUT; do ${IPTABLES} --policy ${i} ACCEPT; done for i in PREROUTING POSTROUTING OUTPUT; do ${IPTABLES} --table nat --policy ${i} ACCEPT; done for i in PREROUTING OUTPUT; do ${IPTABLES} --table mangle --policy ${i} ACCEPT; done echo -ne "[ ok ]\n" for i in filter nat mangle do echo -n " -> Flusheando tabla ${i}..." ${IPTABLES} --table ${i} --flush echo -ne "[ ok ]\n" done for i in filter nat mangle do echo -n " -> Borrando cadenas no predefinidias de la tabla ${i}..." ${IPTABLES} --table ${i} --delete-chain echo -ne "[ ok ]\n" done echo -e "\n >>> FIREWALL COMPLETAMENTE PARADO <<< \n" } panic () { IPTABLES=`which iptables` TABLAS="nat mangle limit" for i in ${TABLAS} do ${IPTABLES} --flush --table $i ${IPTABLES} --zero --table $i done echo "Modo paranoico, cerrandolo TODO." ${IPTABLES} --policy INPUT --jump DROP ${IPTABLES} --policy FORWARD --jump DROP ${IPTABLES} --policy OUTPUT --jump DROP echo "Hecho. Aqui no se mueve ni dios xD" }