Selkfoster firewall

From SlackWiki
Jump to: navigation, search

rc.fireball

is a simple and powerful firewall script for a Home PC. The most recent version of this script can be found here: http://selkfoster.com.ar/scripts/rc.fireball.gz

#!/bin/sh
# Start/stop/restart/status
#
# Versión: 0.3	Mié Ago 30 16:42:25 ART 2006
#
# Escrito por Matías A. Fonzo <selkfoster@gmail.com>, <http://selkfoster.com.ar>.

IPT=/usr/sbin/iptables

fireball_start() {
  # INTERFACE POR DEFECTO:
  IFACE="ppp0"

  # Flush de reglas:
  $IPT -F; $IPT -X; $IPT -Z

  # Políticas por defecto:
  $IPT -P INPUT   DROP
  $IPT -P FORWARD DROP
  $IPT -P OUTPUT  ACCEPT

  # Bloquea las conexiones nuevas, excepto, si vienen desde adentro:
  $IPT -N block
  $IPT -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
  $IPT -A block -m state --state NEW -i ! $IFACE -j ACCEPT
  $IPT -A block -m state --state NEW,INVALID -i $IFACE -j DROP
  $IPT -A block -p tcp ! --syn -m state --state NEW -i $IFACE -j DROP
  $IPT -A block -j DROP

  # Prevención de ataques SYN flood:
  $IPT -N syn-flood
  $IPT -A INPUT -i $IFACE -p tcp --syn -j syn-flood
  $IPT -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
  $IPT -A syn-flood -j LOG --log-prefix "SYN flood: "
  $IPT -A syn-flood -j DROP

  # Descartar paquetes fragmentados:
  $IPT -A INPUT -i $IFACE -f -j DROP
  $IPT -A INPUT -i $IFACE -f -j LOG --log-prefix "pkt frag: "

  # Recibir PING's desde el exterior:
  $IPT -A INPUT -i $IFACE -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

  # Loguear peticiónes de Ping:
  $IPT -A INPUT -i $IFACE -p icmp --icmp-type echo-request -j LOG --log-prefix "ping request: "

  # Activar protección contra IGMP's:
  $IPT -A INPUT -i $IFACE -p igmp -j DROP

  # Evitar Spoofing:
  $IPT -A INPUT -i $IFACE -s 127.0.0.0/8 -j REJECT --reject-with icmp-host-prohibited
  $IPT -A INPUT -i $IFACE -s 192.168.0.1/16 -j REJECT --reject-with icmp-host-prohibited


  ## Saltar a la cadena block desde las cadenas INPUT y FORWARD:
  $IPT -A INPUT   -j block
  $IPT -A FORWARD -j block

  # Evitar técnicas del tipo "OS fingerprint guessing":
  $IPT -A OUTPUT -p icmp -o $IFACE --icmp-type 3/4 -j DROP
  $IPT -A OUTPUT -p icmp -o $IFACE --icmp-type 5   -j DROP
  $IPT -A OUTPUT -p icmp -o $IFACE --icmp-type 13  -j DROP
  $IPT -A OUTPUT -p icmp -o $IFACE --icmp-type 14  -j DROP
  $IPT -A OUTPUT -p icmp -o $IFACE --icmp-type 15  -j DROP
  $IPT -A OUTPUT -p icmp -o $IFACE --icmp-type 16  -j DROP
  $IPT -A OUTPUT -p icmp -o $IFACE --icmp-type 17  -j DROP
  $IPT -A OUTPUT -p icmp -o $IFACE --icmp-type 18  -j DROP

# Verificación de dirección.
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do
  echo "1" > $f
done

# Envio de mensajes de redireccion.
for f in /proc/sys/net/ipv4/conf/*/send_redirects ; do
    echo "0" > $f
done

# FORWARD entre interfaces (routing).
echo "0" > /proc/sys/net/ipv4/ip_forward

# Redireccion de interfaces.
for f in /proc/sys/net/ipv4/conf/*/accept_redirects ; do
    echo "0" > $f
done

# Para gateway o enrutador.
for f in /proc/sys/net/ipv4/conf/*/accept_source_route ; do
  echo "0" > $f
done

# IP dinámica (SLIP, PPP o DHCP).
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

# Ignorar respuestas extrañas de ICMP.
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# Ignorar broadcasts.
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Protección TCP SYN Cookie.
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

# Log marciano (paquetes con direcciónes imposibles).
echo "1" > /proc/sys/net/ipv4/conf/all/log_martians

# Timestamps.
echo "0" > /proc/sys/net/ipv4/tcp_timestamps

# Reducir la habilidad de los DoS, reduciendo los timeouts.
# Defaults: 60 - 7200 - 16384
echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout
echo "3600" > /proc/sys/net/ipv4/tcp_keepalive_time
echo "4096" > /proc/sys/net/ipv4/tcp_max_orphans

echo "1" > /proc/sys/net/ipv4/tcp_window_scaling
echo "0" > /proc/sys/net/ipv4/tcp_sack

  echo "fireball start on $IFACE"
}

fireball_stop() {
  # flush de reglas...
  $IPT -F; $IPT -X; $IPT -Z

  # set de políticas...
  $IPT -P INPUT   ACCEPT
  $IPT -P FORWARD ACCEPT
  $IPT -P OUTPUT  ACCEPT

  # remover modulos...
  # para kernel 2.6.16+
  for modules in ipt_REJECT xt_limit ipt_LOG xt_tcpudp xt_state iptable_filter ip_conntrack ip_tables x_tables ; do
    rmmod $modules 2> /dev/null
  done
	
  # anterior a 2.6.16 y de la serie 2.4
  #for modules in ipt_REJECT ipt_limit ipt_LOG ipt_state iptable_filter ip_conntrack ip_tables ; do
  #  rmmod $modules 2> /dev/null
  #done   
	
  echo "fireball stopped"
}

fireball_restart() {
  echo -n "Restarting... "
  fireball_start
}

fireball_status() {
  $IPT -L -n -v
}

case "$1" in
'start')
  fireball_start
  ;;
'stop')
  fireball_stop
  ;;
'restart')
  fireball_restart
  ;;
'status')
  fireball_status
  ;;
  *)
  echo "uso $0 start|stop|restart|status"
esac