Selkfoster firewall
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