#!/bin/sh # # Script de partage de connexion !!! # # Veuillez me mettre dans /usr/local/sbin... # ME RENOMMER EN : firewall.sh : TRES IMPORTANT !!! # # Creation des variables locales ! IFC=/sbin/ifconfig RTE=/sbin/route eth0_ip=`$IFC eth0 | grep Bcast | awk '{print $2}' | cut -d : -f 2` eth0_bdc=`$IFC eth0 | grep Bcast | awk '{print $3}' | cut -d : -f 2` eth0_mask=`$IFC eth0 | grep Bcast | awk '{print $4}' | cut -d : -f 2` eth0_net=`$RTE -n | grep $eth0_mask | awk '{print $1}'` ppp0_ip=`$IFC ppp0 | grep Bcast | awk '{print $2}' | cut -d : -f 2` ppp0_gw=`$RTE -n | grep ppp0 | awk '{print $2}' | tail +2` lan="$eth0_net/24" wan="0.0.0.0/0" # Echo des differentes variables - A decommenter ! #echo "$eth0_ip" #echo "$eth0_mask" #echo "$eth0_net" #echo "$eth0_bdc" #echo "$ppp0_ip" #echo "$ppp0_gw" #echo "$lan" #echo "$wan" # # Active les differents filtres necessaires # # No Spoofing ! On evite de se faire piquer notre IP Publique... if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] then for filtre in /proc/sys/net/ipv4/conf/*/rp_filter do echo 0 > filtre done fi # No ICMP ! ... On interdit les reponses ICMP (Ping, Traceroute, ...) if [ -e /proc/sys/net/ipv4/icmp_echo_ignore_all ] && [ -e /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ] && [ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ] then echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses fi # Desactive les redirections ICMP ! for filtre in /proc/sys/net/ipv4/conf/*/accept_redirects do echo 0 > filtre done for filtre in /proc/sys/net/ipv4/conf/*/send_redirects do echo 0 > filtre done # Desactive les Packets Sources Routes for filtre in /proc/sys/net/ipv4/conf/*/accept_source_route do echo 0 > filtre done # Log Packets Spoofes, Source Routes, Rediriges ! for filtre in /proc/sys/net/ipv4/conf/*/log_martians do echo 1 > filtre done # Protection SYNCOOKIES if [ -e /proc/sys/net/ipv4/tcp_syncookies ] then echo 1 > /proc/sys/net/ipv4/tcp_syncookies fi # Reduit les possibilites d'attaque DoS (Denial Of Service) ## par reduction des timeouts if [ -e /proc/sys/net/ipv4/tcp_fin_timeout ] && [ -e /proc/sys/net/ipv4/tcp_windows_scaling ] && [ -e /proc/sys/net/ipv4/tcp_timestamps ] && [ -e /proc/sys/net/ipv4/tcp_sack ] && [ -e /proc/sys/net/ipv4/tcp_max_syn_backlog ] then echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout echo 0 > /proc/sys/net/ipv4/tcp_windows_scaling echo 0 > /proc/sys/net/ipv4/tcp_timestamps echo 0 > /proc/sys/net/ipv4/tcp_sack echo 1024 > /proc/sys/net/ipv4/tcp_max_syn_backlog fi # # On vide les trois tables... Par prudence ! # iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X # Refus de tout paquet... Tout autant prudent !! iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT iptables -t mangle -P PREROUTING ACCEPT iptables -t mangle -P INPUT ACCEPT iptables -t mangle -P FORWARD ACCEPT iptables -t mangle -P OUTPUT ACCEPT iptables -t mangle -P POSTROUTING ACCEPT # # Creation de chaines utilisateurs (en minuscule selon les spec... d'Iptables !) # Attention, personnellement, j'use du daemon ULOG non implémenté par défaut # # chaine 'log_drop' pour LOG de tout paquet DROPpe que l'on veut logue iptables -N log_drop iptables -A log_drop -j LOG --log-prefix '[IpTables DROP]' iptables -A log_drop -j DROP # chaine 'log_accept' pour LOG de tout paquet ACCEPTe que l'on veut logue iptables -N log_accept iptables -A log_accept -j LOG --log-prefix '[IpTables ACCEPT]' iptables -A log_accept -j ACCEPT # chaine 'log_rejet' pour LOG de tout paquet REJE(C)Te que l'on veut logue iptables -N log_rejet iptables -A log_rejet -j LOG --log-prefix '[IpTables REJECT]' iptables -A log_rejet -j REJECT # # Gestion des differents traffics ! # DEFINITION : '! INVALID = NEW, ESTABLISHED, RELATED' # Par principe, on permet d'abord les connexions qui sortent, # puis celles qui veulent rentrer ! # A chaque fois, on est plus critique en spécifiant la source et la destination # réseau ... et, si possible, aussi, le port source et destination... # sur lesquels on ne désire que ce traffic !! # Sans oublier de préciser, l'état des paquets que l'on va gérer !!! # # ACCEPT le traffic local machine (lo)... # Important sinon il n'y a aucune communication possible ! iptables -A OUTPUT -o lo -m state --state ! INVALID -j ACCEPT iptables -A INPUT -i lo -m state --state ! INVALID -j ACCEPT # ACCEPT le traffic interne au LAN iptables -A OUTPUT -o eth0 -s $eth0_ip -d $lan -m state --state ! INVALID -j ACCEPT iptables -A INPUT -i eth0 -s $lan -d $eth0_ip -m state --state ! INVALID -j ACCEPT # ACCEPT le traffic DHCP vers LAN iptables -A OUTPUT -o eth0 -s $eth0_ip -d $eth0_bdc -m state --state ! INVALID -j ACCEPT iptables -A INPUT -i eth0 -s $eth0_bdc -d $eth0_ip -m state --state ! INVALID -j ACCEPT # ACCEPT le traffic BootDHCP vers LAN - si server DHCP actif sur FW - A decommenter ! #iptables -A INPUT -i eth0 -s 0.0.0.0 -d 255.255.255.255 -p udp --sport bootpc --dport bootps -m state --state NEW,ESTABLISHED -j ACCEPT # On gere les differentes connexions FireWall <-> Internet # On pourrait mieux les suivre par '-j log_accept' - # cela grossit considerablement le fichier LOG ! A vous de voir... iptables -A OUTPUT -o ppp0 -s $ppp0_ip -p all -m state --state ! INVALID -j ACCEPT iptables -A INPUT -i ppp0 -d $ppp0_ip -p all -m state --state RELATED,ESTABLISHED -j ACCEPT # On securise la machine Firewall en regard d'Internet : # Je refuse tout traffic que je n'ai pas établi moi-meme - A decommenter ! #iptables -A OUTPUT -o ppp0 -s $ppp0_ip -d $ppp0_gw -p all -m state --state INVALID -j log_drop #iptables -A INPUT -i ppp0 -d $ppp0_ip -s $ppp0_gw -p all -m state --state ! RELATED,ESTABLISHED -j log_drop # Gestion du NAT ! # Normalement, on active les modules kernel - A decommenter ! # /sbin/insmod ip_conntrack # /sbin/insmod iptable_nat # /sbin/insmod ip_nat_ftp # /sbin/insmod ip_nat_irc # /sbin/insmod ip_conntrack_ftp # /sbin/insmod ip_conntrack_irc # Forwarding ! Important... # Permet de rediriger tout paquet sur le LAN # Autrement dit : PARTAGE de CONNEXION echo 1 > /proc/sys/net/ipv4/ip_forward #echo "NAT" iptables -A FORWARD -i eth0 -o ppp0 -s $lan -m state --state ! INVALID -j ACCEPT iptables -A FORWARD -i ppp0 -o eth0 -d $lan -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A POSTROUTING -o ppp0 -s $lan -j MASQUERADE # -s $eth0_net # # Regles de Destruction !!! # #echo "DROP" # Detruit les connexions sur ppp0 <- Internet qui aurait pour adr_ip celles d'une classe privee ! ## Une variante de 'no-spoofing' ! iptables -A INPUT -i ppp0 -s 127.0.0.0/8 -j DROP # adr de Loopback iptables -A INPUT -i ppp0 -s 10.0.0.0/8 -j DROP # adr Class A privee iptables -A INPUT -i ppp0 -s 169.254.0.0/16 -j DROP # adr Link Local Network iptables -A INPUT -i ppp0 -s 172.16.0.0/12 -j DROP # adr Class B privee iptables -A INPUT -i ppp0 -s 192.0.2.0/24 -j DROP # adr TEST-NET iptables -A INPUT -i ppp0 -s 192.168.0.0/24 -j DROP # adr Class C Privee iptables -A INPUT -i ppp0 -s 224.0.0.1/4 -j DROP # adr Class D MultiCast iptables -A INPUT -i ppp0 -s 240.0.0.0/4 -j DROP # adr Class E Réservee # Detruit certaines connexions precises pour simplifier le traffic ## les ports 4660:4700 servent aux connexions, style eMule et cie... iptables -A OUTPUT -o ppp0 -p tcp --sport 4660:4700 -j DROP iptables -A INPUT -i ppp0 -p tcp --dport 4660:4700 -j DROP iptables -A OUTPUT -o ppp0 -p udp --sport 4660:4700 -j DROP iptables -A INPUT -i ppp0 -p udp --dport 4660:4700 -j DROP # Rejet de tout autre traffic non défini ! # On peut les DROP directement sans chercher à log_drop ... # simplement modifier 'log_drop' par 'DROP' ! iptables -A FORWARD -j log_drop iptables -A INPUT -j log_drop iptables -A OUTPUT -j log_drop