#!/bin/bash # # Init file for parefeu # # chkconfig: 2345 90 10 # description: Firewall et NAT (Network Address Translation) # # processname: parefeu # pidfile: /var/run/parefeu.pid # ### BEGIN INIT INFO # Provides: parefeu # Required-Start: network iptable # Required-Stop: network # Default-Start: 3 4 5 # Short-Description: Firewall + NAT # Description: Protection d'un réseau local raccordé à Internet ### END INIT INFO LOGFILE="/var/log/parefeu.log" # FireWall fait par Régis Couraud le 30_09_2003 # Modifié par Pierre Jarillon. Utilisable en tant que service par Mandriva. # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network echo " ">$LOGFILE date>>$LOGFILE echo "appel">>$LOGFILE # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 ############################################# ############## VARIABLES ############### ############################################# #INT_EXT="ppp0" INT_EXT="eth2" INT_LAN="eth1" INT_LO="lo" IP_LAN="192.168.33.254/24" # mode de rejet : DROP = Rejeter simple, LOG_DROP = mettre dans /var/log/syslog REJET=DROP #REJET=LOG_DROP echo "init $1">>$LOGFILE case "$1" in #===========================Supprimer le Firewall=================================== stop) #Je vide toutes les ancienne regles iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT # On remet les polices par défaut pour la table NAT iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT # Je flush les règles existantes iptables -F iptables -t nat -F # J'efface toutes chaînes qui ne sont pas à defaut dans la table filter et nat iptables -X iptables -t nat -X # Et j'en remet une couche avec un autre script de flush ;-) # Activation du forwarding echo 1 > /proc/sys/net/ipv4/ip_forward # Ces régles sont la pour pouvoir loguer si je le veux iptables -N LOG_DROP iptables -A LOG_DROP -j LOG --log-prefix '[IPTABLES DROP] : ' iptables -A LOG_DROP -j DROP # Ces régles sont la pour pouvoir loguer si je le veux iptables -N LOG_ACCEPT iptables -A LOG_ACCEPT -j LOG --log-prefix '[IPTABLES ACCEPT] : ' iptables -A LOG_ACCEPT -j ACCEPT echo "Le parefeu est inactif" rm -f /var/lock/subsys/parefeu echo "fin stop">>$LOGFILE ;; #=========================Activation des protections================================ start) # On remet tout à zéro $0 stop echo "debut start">>$LOGFILE # Je veux pas de spoofing if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] then for filtre in /proc/sys/net/ipv4/conf/*/rp_filter do echo 1 > $filtre done fi # Je veux pas icmp echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # Protection contre l'echo en broadcast echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Protection contre les mauvais messages d'erreur echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses # Protection contre l'acceptation des messages ICMP redirigés for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $f done # Protection contre le syn-flood iptables -A FORWARD -p TCP --syn -m limit --limit 1/s -j ACCEPT # Protection contre le test de port furtif iptables -A FORWARD -p TCP --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT # Protection contre le ping de la mort iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT ############################################# ############################################# # Je charge les modules dont j'ai besoin modprobe ip_nat_ftp modprobe ip_nat_irc modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp # Je refuse tout par défault iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP ############################################################## ############## MACHINE LOCAL ############################ ############################################################## # Pour éviter les problèmes, on va tout accepter sur # la machine en local (interface lo). iptables -A INPUT -i $INT_LO -p ALL -j ACCEPT iptables -A OUTPUT -o $INT_LO -p ALL -j ACCEPT # J'autorise tous en sortie # iptables -A INPUT -i $INT_EXT -p ALL -j ACCEPT # iptables -A OUTPUT -o $INT_EXT -p ALL -j ACCEPT iptables -A INPUT -i $INT_EXT --protocol ALL -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -o $INT_EXT --protocol ALL -m state --state NEW,ESTABLISHED -j ACCEPT ############################################################## ################# LAN ####################### ############################################################## # On veut que le LAN connecté à l'interface # $INT_LAN ait un accès complet à internet. iptables -A FORWARD -i $INT_LAN -o $INT_EXT -j ACCEPT iptables -A FORWARD -o $INT_LAN -i $INT_EXT -j ACCEPT iptables -A INPUT -i $INT_LAN -p ALL -j ACCEPT iptables -A OUTPUT -o $INT_LAN -p ALL -j ACCEPT ############################################################## ############## ENTREE VENANT DU WEB #################### ############################################################## # SSH AUTORISER iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p tcp --sport 22 -j ACCEPT # HTTP AUTORISER iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p tcp --sport 80 -j ACCEPT # HTTPS AUTORISER iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p tcp --dport 443 -j ACCEPT iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p tcp --sport 443 -j ACCEPT # Cameras de surveillance #iptables -t nat -A PREROUTING -d $IP_EXT -p tcp --dport 2001 -j DNAT --to $CAMERA1:80 #iptables -A FORWARD -o eth1 -p tcp -d $CAMERA1 -j ACCEPT iptables -t nat -A PREROUTING -d 82.232.64.171 -p tcp --dport 2002 -j DNAT --to 192.168.33.175:80 iptables -A FORWARD -o eth1 -p tcp -d 192.168.33.175 -j ACCEPT iptables -t nat -A PREROUTING -d 82.232.64.171 -p tcp --dport 2003 -j DNAT --to 192.168.33.53:80 iptables -A FORWARD -o eth1 -p tcp -d 192.168.33.53 -j ACCEPT ## J'autorise le ftp ##iptables -A INPUT -p tcp -i $INT_EXT -m state --state NEW,ESTABLISHED --dport 21 -j ACCEPT #iptables -A OUTPUT -p tcp -o $INT_LAN -m state --state NEW,ESTABLISHED --sport 21 -j ACCEPT ##iptables -A INPUT -p tcp -i $INT_EXT -m state --state NEW,ESTABLISHED --dport 20 -j ACCEPT #iptables -A OUTPUT -p tcp -o $INT_LAN -m state --state NEW,ESTABLISHED --sport 20 -j ACCEPT ##iptables -A INPUT -p tcp -i $INT_EXT -m state --state ESTABLISHED,RELATED --dport 10000:65535 -j ACCEPT ##iptables -A OUTPUT -p tcp -o $INT_EXT -m state --state ESTABLISHED,RELATED --sport 10000:65535 -j ACCEPT # Bittorrent iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p tcp --dport 6881:6889 -j ACCEPT iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p tcp --sport 6881:6889 -j ACCEPT # Télévision #iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p tcp --dport 554 -j ACCEPT #iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p tcp --sport 554 -j ACCEPT #iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p udp --dport 554 -j ACCEPT #iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p udp --sport 554 -j ACCEPT # Ekiga #iptables -A INPUT -i $INT_EXT -m state --state NEW,ESTABLISHED -p udp --dport 5060 -j ACCEPT #iptables -A OUTPUT -o $INT_EXT -m state --state ESTABLISHED -p udp --sport 5060 -j ACCEPT ############################################################## # Il faut permettre à l'ensemble du LAN de dialoguer # sur internet avec la même adresse IP iptables -t nat -A POSTROUTING -s $IP_LAN -j MASQUERADE # Toutes les régles n'ayant pas passé les régles du firewall sont loguées iptables -A FORWARD -j $REJET iptables -A INPUT -j $REJET iptables -A OUTPUT -j $REJET # Pour mon alter ego ;-)) echo "Le parefeu et le NAT sont actifs" touch /var/lock/subsys/parefeu echo "fin start">>$LOGFILE ;; #=================================================================================== restart) $0 start ;; #=================================================================================== status) if [ `iptables -t nat -L | grep MASQUERADE | wc -l` -eq 1 ] then echo "Le parefeu et le NAT sont actifs" else echo "Parefeu et NAT inactifs" [ -f /var/lock/subsys/parefeu ] && rm -f /var/lock/subsys/parefeu exit 1 fi ;; #=================================================================================== *) gprintf "Usage: %s\n" "$(basename $0) {start|stop|status}\ Verification : Utiliser nmap et iptables -L" exit 1 esac echo "sortie normale">>$LOGFILE exit 0