#!/bin/bash # # TiChou ################################################################################ # Création du vérou # ################################################################################ while [ -f /var/lock/subsys/firewall ] do sleep 1 done >/var/lock/subsys/firewall ################################################################################ # Localisation des commandes iptables, réseaux et shells # ################################################################################ IPTABLES=/sbin/iptables LSMOD=/sbin/lsmod INSMOD=/sbin/insmod GREP=/bin/grep AWK=/bin/awk SED=/bin/sed PERL=/usr/bin/perl IFCONFIG=/sbin/ifconfig IP=/sbin/ip ARP=/sbin/arp GETHOSTIP="/root/bin/gethostip -d" getif() { eval local `$IFCONFIG $2 2>/dev/null|$SED -n '/inet /{s/inet //;s/[^[:alnum:]\.: ]/_/g;s/:/=/gp}'` case "$1" in ip) [ "$addr" ] && echo $addr ;; mask|netmask) [ "$Mask" ] && echo $Mask ;; prefix) [ "$Mask" ] && { prefix=0 while [ $[((((${Mask//./)*256+}>>$prefix)%2] = 0 ] do let ++prefix done echo $[32-$prefix]; } ;; bcast|broadcast) [ "$Bcast" ] && echo $Bcast ;; net|network) [ "$addr" -a "$Mask" ] && local ip=$[(((${addr//./<<8)+}&(((${Mask//./<<8)+}] [ "$ip" ] && echo $[$ip>>24].$[$ip>>16&0xff].$[$ip>>8&0xff].$[$ip&0xff] ;; gw|gateway) [ "$P_t_P" ] && echo $P_t_P ;; esac } ################################################################################ # Définition des variables globales # ################################################################################ # Interface LAN # INTIF="eth0" # Ports pour le suivi de connexion des protocoles spéciaux # H323PORTS="389 522 1503 1720 1731" FTPPORTS="21,3021,5554,5555" IRCPORTS="6665,6666,6667,6668,6669,7000" # Réseau Internet # UNIVERSE="0.0.0.0/0" ################################################################################ # Détermination de l'IP interne et du réseau LAN # ################################################################################ INTIP=`getif ip $INTIF` INTNET=`getif net $INTIF`/`getif prefix $INTIF` echo "Lien LAN UP" echo " interface = $INTIF" echo " ip = $INTIP" echo " network = $INTNET" ################################################################################ # Initialisation des tables de Netfilter # ################################################################################ # Définition de la politique par défaut # $IPTABLES -t filter -P INPUT ACCEPT $IPTABLES -t filter -P OUTPUT ACCEPT $IPTABLES -t filter -P FORWARD DROP $IPTABLES -t nat -P PREROUTING ACCEPT $IPTABLES -t nat -P OUTPUT ACCEPT $IPTABLES -t nat -P POSTROUTING ACCEPT $IPTABLES -t mangle -P PREROUTING ACCEPT $IPTABLES -t mangle -P INPUT ACCEPT $IPTABLES -t mangle -P OUTPUT ACCEPT $IPTABLES -t mangle -P FORWARD ACCEPT $IPTABLES -t mangle -P POSTROUTING ACCEPT # Suppression de toutes les rêgles / Chargement des modules des tables # $IPTABLES -t filter -F $IPTABLES -t nat -F $IPTABLES -t mangle -F # Suppression de toutes les chaînes utilisateurs (user-defined chain) # $IPTABLES -t filter -X $IPTABLES -t nat -X $IPTABLES -t mangle -X # Remise à zéro de tous les compteurs # $IPTABLES -t filter -Z $IPTABLES -t nat -Z $IPTABLES -t mangle -Z # Création d'une chaine DROP et LOG # $IPTABLES -N DROP-LOG $IPTABLES -A DROP-LOG -j LOG --log-level info $IPTABLES -A DROP-LOG -j DROP ################################################################################ # Chargement des modules de Netfilter # ################################################################################ modules() { local IFS=$'\n' for module in $1 do if ! $LSMOD|$GREP -qw ^${module% *} then eval $INSMOD $module fi done } # Suivi des connexions # MODULES="ip_conntrack ip_conntrack_ftp ports=$FTPPORTS ip_conntrack_irc ports=$IRCPORTS ip_conntrack_h323" modules "$MODULES" # NATage des protocoles spéciaux # MODULES="iptable_nat ip_nat_ftp ports=$FTPPORTS ip_nat_irc ports=$IRCPORTS ip_nat_h323" modules "$MODULES" ################################################################################ # Configuration des paramètres kernel # ################################################################################ # Activation de l'IP forwarding # echo 1 >/proc/sys/net/ipv4/ip_forward # Prise en charge de l'IP dynamique # #echo 1 >/proc/sys/net/ipv4/ip_dynaddr # Protection contre les pings broadcast # echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ################################################################################ # Initialisation des tables de routage # ################################################################################ # Création de la liste des tables de routage /etc/iproute2/rt_tables # echo -e "252\tlan">/etc/iproute2/rt_tables echo -e "253\tdefault">>/etc/iproute2/rt_tables # Suppression de toutes les règles de source routing # $IP rule show|while read PRIO RULE do $IP rule del prio ${PRIO%%:*} ${RULE/all/0.0.0.0/0} &>/dev/null done # Suppression de toutes les routes dans les tables # autre que local, main ou default # for ((table=1;table<=252;table++)) do $IP route flush table $table &>/dev/null done # Définition des règles de source routing des principales tables # $IP rule add prio 32766 from $UNIVERSE table main $IP rule add prio 32767 from $UNIVERSE table default # Le routage local utilise la table principale # $IP rule add from $INTNET to $INTNET table main pref 100 # Définition de la route à emprunter pour la table 'lan' # $IP route add table lan via $INTIP dev $INTIF ################################################################################ # Configuration des liens Internet opérationnel # et du partage de connexion (forward et NAT) sur les machines internes associées # ################################################################################ for ppp in /var/run/ppp-*.pid do # Détermination du nom du lien # LINKNAME=${ppp#/var/run/ppp-} LINKNAME=${LINKNAME%.pid} # Détermination du nom de l'interface du lien $LINKNAME # et du PID du process pppd de ce lien # { read PPPD_PID; read EXTIF; } <$ppp # Vérification que le lien $LINKNAME est réellement opérationnel # if { [ `cat /var/run/$EXTIF.pid` == $PPPD_PID ] && \ kill -CHLD $PPPD_PID && \ $IP link show "$EXTIF"|$GREP -qE "^[[:digit:]]+: $EXTIF: <(|[^>]+,)UP(,[^>]+|)>"; } &>/dev/null then # Détermination de l'IP Internet et de l'IP gateway du lien $LINKNAME # EXTIP=`getif ip $EXTIF` EXTGW=`getif gw $EXTIF` echo "Lien $LINKNAME UP" echo " interface = $EXTIF" echo " ip = $EXTIP" echo " gateway = $EXTGW" # Définition des variables propres au lien $LINKNAME # et mise à jour des variables globales # unset TABLENAME TABLEID MACHINES BADMACHINES RULES PORTFW ICQFW H323FW [ -f /etc/ppp/ppp-$LINKNAME.conf ] && . /etc/ppp/ppp-$LINKNAME.conf [ $TABLENAME ] || TABLENAME=$LINKNAME [ $TABLEID ] || TABLEID=$[${EXTIF#ppp}+200] # Ajout de la table de routage $TABLENAME dans /etc/iproute2/rt_tables # echo -e "$TABLEID\t$TABLENAME">>/etc/iproute2/rt_tables IFS=$' ,\t\n' for machine in $MACHINES do # Autorisation de forwarder toutes les connexions sortantes de $machine # et uniquement sur le lien $LINKNAME # $IPTABLES -A FORWARD -i $INTIF -o $EXTIF -s $machine -j ACCEPT $IPTABLES -A FORWARD -i $INTIF -o ppp+ -s $machine -j REJECT --reject-with icmp-host-unreachable # Autorisation de forwarder uniquement les connexions entrantes de $machine déjà existantes # et uniquement sur le lien $LINKNAME # $IPTABLES -A FORWARD -i $EXTIF -o $INTIF -d $machine -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -i ppp+ -o $INTIF -d $machine -m state --state ESTABLISHED,RELATED -j REJECT --reject-with icmp-host-unreachable # Le routage du traffic de $machine allant vers Internet utilise la table $TABLENAME # $IP rule add from `$GETHOSTIP $machine` to $UNIVERSE table $TABLENAME pref 200 done for machine in $BADMACHINES do # Interdiction de forwarder les connexions sortantes de $machine # allant vers le lien $LINKNAME # $IPTABLES -A FORWARD -i $INTIF -o $EXTIF -s $machine -j REJECT --reject-with icmp-net-prohibited # Interdiction de forwarder les connexions entrantes de $machine # venant du lien $LINKNAME # $IPTABLES -A FORWARD -i $EXTIF -o $INTIF -d $machine -j REJECT --reject-with icmp-net-prohibited done # Activation du SNAT du réseau interne vers le lien Internet $LINKNAME # $IPTABLES -t nat -A POSTROUTING -o $EXTIF -s $INTNET -j SNAT --to $EXTIP # Blocage sur le lien $LINKNAME du traffic entrant se disant être local (spoofé) # $IPTABLES -A INPUT -i $EXTIF -s $INTNET -d $UNIVERSE -j DROP-LOG # Blocage du traffic local sortant sur le lien $LINKNAME # $IPTABLES -A OUTPUT -o $EXTIF -s $UNIVERSE -d $INTNET -j DROP-LOG # Le routage du traffic venant du lien Internet $LINKNAME allant vers le réseau Interne utilise la table 'lan' $IP rule add from $EXTIP to $INTNET table lan pref 300 # Le routage du traffic Internet local du lien $LINKNAME allant vers l'extérieur utilise la table $TABLENAME $IP rule add from $EXTIP to $UNIVERSE table $TABLENAME pref 400 # Définition de la route par défaut à emprunter pour la table $TABLENAME $IP route add table $TABLENAME via $EXTGW dev $EXTIF for rule in $RULES do IFS=\|;set -- $rule;IFS=$' ,\t\n' from=${1:-0.0.0.0/0} to=${2:-0.0.0.0/0} pref=${3:-200} $IP rule add from $from to $to table $TABLENAME pref $pref done # Définition des redirections de ports (port forwarding) # portfw() { local IFS=/;set -- $1;IFS=$' \t\n' local machine=$1 INTPORT=$2 EXTPORT=${3:-$2} protocole=${4:-tcp} type=${5:-simple} for proto in ${protocole/both/tcp/udp} do $IPTABLES -A FORWARD -i $EXTIF -o $INTIF -p $proto -d $machine --dport $INTPORT -m state --state NEW -j ACCEPT $IPTABLES -t nat -A PREROUTING -p $proto -d $EXTIP --dport $EXTPORT -j DNAT --to `$GETHOSTIP $machine`:${INTPORT/:/-} if [ "$type" = "full" ] then $IPTABLES -A FORWARD -i $INTIF -o $INTIF -p $proto -d $machine --dport $INTPORT -s $INTNET -m state --state NEW -j ACCEPT $IPTABLES -A FORWARD -i $INTIF -o $INTIF -p $proto -d $INTNET -s $machine --sport $INTPORT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -t nat -A OUTPUT -p $proto -d $EXTIP --dport $EXTPORT -j DNAT --to `$GETHOSTIP $machine`:${INTPORT/:/-} $IPTABLES -t nat -A POSTROUTING -p $proto -d $machine --dport $INTPORT -s $INTNET -j SNAT --to $INTIP fi done } for portfw in $PORTFW do portfw $portfw done for icqfw in $ICQFW do portfw $icqfw done [ $H323FW ] && for port in $H323PORTS do portfw $H323FW/$port done else echo "Lien $LINKNAME DOWN" fi done # Autorisation pour les autres machines du LAN de forwarder toutes les connexions sortantes # et de forwarder uniquement les connexions entrantes déjà existantes # $IPTABLES -A FORWARD -i $INTIF -o ppp+ -j ACCEPT $IPTABLES -A FORWARD -i ppp+ -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT # Blocage de tous les autres forward # $IPTABLES -A FORWARD -j DROP-LOG ################################################################################ # Suppression du vérou # ################################################################################ rm -f /var/lock/subsys/firewall