#!/bin/sh Ver="0.0.7" PCIP_RESEAUX="192.168.1.64" Limite_bande_passante="300kbit" MAC1="00:18:F6:61:2F:7E" MAC2="00:0A:E4:5E:21:8F" USERROOT="0" USERTNT="1000" SectionSSH="OUI" # active le client ssh idem pour le reste SectionSSHServeur="NON" SectionMail="OUI" SectionNEXIUZ="OUI" SectionNavigateur="OUI" SectionIrc="OUI" SectionTS="OUI" SectionFtp="OUI" SectionAmsn="OUI" SectionSamba="OUI" SectionIcpm="OUI" SectionXLAN="OUI" SectionBAN="OUI" SectionDEBUG="NON" SectionLimiteBandePassante="OUI" MESS="10" case "$1" in start) boucleprincipale() { ( startnoadresse() { ( echo "Pas d adresse ip le par feux est en attente $Ver" ) } startok() { ( echo "Debug firwall X start ok true : $UBX Utilisateur $USER" `date` >> /home/tnt/Desktop/Log_par_feux.txt ) } startend() { ( echo "Le par feux est charger $Ver" echo "Debug firwall X startend faux: $UBX Utilisateur $USER" `date` >> /home/tnt/Desktop/Log_par_feux.txt ) } TR="true" while "$TR" do ETH=`/sbin/ifconfig -s |grep eth | cut -d " " -f 1` if [ -n "$ETH" ] ;then PCIP_ME=`/sbin/ifconfig $ETH | grep inet | cut -d : -f 2 | cut --delimiter=' ' -f 1 | grep 192` fi if [ -n $ETH ] ;then if [ -n $PCIP_ME ] ;then echo "Debug firwall boucle true IP: $PCIP_ME interface $ETH" `date` >> /home/tnt/Desktop/Log_par_feux.txt chmod 0775 /home/tnt/Desktop/Log_par_feux.txt startok TR="false" fi else startnoadresse fi done #permet d'hobtenire l'ip local de la machine,n'est pas utiliser dans ce script mai pourrait servir. #IP=`/sbin/ifconfig $ETH | grep inet | cut -d : -f 2 | cut --delimiter=' ' -f 1` #Astuce la comande arp permet de trouver les adresse mac sur le reseaux local. #================================fonction pour gérer les utilisateurs règles par règle========== #ceci convient pour un pc de bureau, mai pas pour un serveur car cela ferai 1 rêgle pour chaque #utilisateur et serai donc très lourd. l'avantage c'est que les règle son alors facilement adaptable #en suprimant l'apelle de la fonction et en modifiant légèrement la syntax. #Bug: le passage des utilisateur par un tableaux via une boucle plante #for LU in $LISTEUSER;do function output_user() { ( if [ -n "$*" ] ;then RetoureRoot=`echo "$*" | grep UID0 | wc -m` RetoureTnt=`echo "$*" | grep UID1000 | wc -m` if [ "$RetoureRoot" != "0" ] && [ "$RetoureTnt" != "0" ] ;then CalculeRoot=`echo $RetoureRoot -6 |bc` FinCalculeRoot=`echo "$*" | cut -b -$CalculeRoot` CalculeLen=`echo "$FinCalculeRoot" | grep UID1000 | wc -m` CalculeTnt=`echo $CalculeLen -8 |bc` FinCalculeTntEtRoot=`echo "$*" | cut -b -$CalculeTnt` rootonly "$FinCalculeTntEtRoot" useronlytnt "$FinCalculeTntEtRoot" elif [ "$RetoureRoot" != "0" ] ;then CalculeRoot=`echo $RetoureRoot -6 |bc` FinCalculeRoot=`echo "$*" | cut -b -$CalculeRoot` rootonly "$FinCalculeRoot" elif [ "$RetoureTnt" != "0" ] ;then CalculeTnt=`echo $RetoureTnt -8 |bc` FinCalculeTnt=`echo "$*" | cut -b -$CalculeTnt` useronlytnt "$FinCalculeTnt" else echo "Erreur utilisateur non reconnu !" fi fi ) } function rootonly() { ( U1="" U1="$* -m owner --uid-owner $USERROOT -j ACCEPT" $U1 ) } function useronlytnt() { ( U2="" U2="$* -m owner --uid-owner $USERTNT -j ACCEPT" $U2 ) } echo "Debug firwall poursuite du chargement IP: $PCIP_ME interface $ETH" `date` >> /home/tnt/Desktop/Log_par_feux.txt #=============================================================================================== iptables --zero iptables -F iptables -X iptables -t nat -X iptables -t nat -F tc qdisc del dev $ETH root 2> /dev/null iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP #================================== utilisateur aux niveaux global============================ #iptables -A OUTPUT -o $ETH -m owner --uid-owner $USERROOT if [ "$SectionLimiteBandePassante" = "OUI" ] ;then tc qdisc del dev $ETH root 2>/dev/null #tc qdisc add dev $ETH root tbf rate $Limite_bande_passante latency 30ms burst 1540 tc qdisc add dev eth0 root handle 1: htb default 20 tc class add dev eth0 parent 1: classid 1:1 htb rate 1024kbit burst 0k tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1024kbit burst 0k tc class add dev eth0 parent 1:1 classid 1:20 htb rate 875kbit ceil 875kbit burst 0k #tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1kbit ceil 6mbit burst 15k tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 20 tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 20 U32="tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32" $U32 match ip dport 80 0xffff flowid 1:10 $U32 match ip dport 5900 0xffff flowid 1:20 fi #================================== IP BAN =================================================== # si le nombre d'entrée devien importante il peux s'averer utile de crée un fichier des ip bannie if [ "$SectionBAN" = "OUI" ] ;then #Ban_IP="192.168.1.254" Ban_IP_1="255.255.255.255" Ban_IP_2="224.0.0.0-224.0.0.255" #Ban_IP_3="192.168.1.255" #Ban_IP_4="224.0.0.22" iptables -A OUTPUT -o $ETH -m iprange --dst-range $Ban_IP_1 -j DROP iptables -A OUTPUT -o $ETH -m iprange --src-range $Ban_IP_1 -j DROP iptables -A INPUT -i $ETH -m iprange --dst-range $Ban_IP_1 -j DROP iptables -A INPUT -i $ETH -m iprange --src-range $Ban_IP_1 -j DROP iptables -A OUTPUT -o $ETH -m iprange --dst-range $Ban_IP_2 -j DROP iptables -A OUTPUT -o $ETH -m iprange --src-range $Ban_IP_2 -j DROP iptables -A INPUT -i $ETH -m iprange --dst-range $Ban_IP_2 -j DROP iptables -A INPUT -i $ETH -m iprange --src-range $Ban_IP_2 -j DROP # spécial iptables -A INPUT -p tcp -m string --string '\x69\x89' --algo bm -j DROP iptables -A INPUT -p tcp -m string --string '\x6a\x0b' --algo bm -j DROP iptables -A INPUT -p tcp -m string --string '\x6c\x68' --algo bm -j DROP iptables -A INPUT -p tcp -m string --string '\xe1\x52' --algo bm -j DROP iptables -A INPUT -f -j DROP fi #================================ Diver en cour de teste ==================================== #================================== modification du mtu pour le voip ========================== # en cour de teste iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o $ETH -j TCPMSS --set-mss 1370 #1460 iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o $ETH -j TCPMSS --clamp-mss-to-pmtu #================================== log du nouveau protocol sctcp =========================== #par curiositer :) iptables -A INPUT -p sctp -m limit --limit 60/h --limit-burst 60 -j ULOG --ulog-prefix="SCTP entrée" iptables -A OUTPUT -p sctp -m limit --limit 60/h --limit-burst 60 -j ULOG --ulog-prefix="SCTP sortie" #================================== Reseaux local SAMBA ============================================ if [ "$SectionSamba" = "OUI" ] ;then SambaPort2="137,138,139,445" IPVALEUR="iptables -A OUTPUT -p UDP -m multiport --destination-port $SambaPort2 -m iprange --src-range $PCIP_ME --dst-range 192.168.1.255 -m state --state NEW,ESTABLISHED,RELATED UID1000 UID0" output_user $IPVALEUR; IPVALEUR="iptables -A OUTPUT -p TCP -m multiport --destination-port $SambaPort2 -m iprange --src-range $PCIP_ME --dst-range $PCIP_RESEAUX -m state --state NEW,ESTABLISHED,RELATED UID1000 UID0" output_user $IPVALEUR; iptables -A INPUT -p UDP -m multiport --destination-port $SambaPort2 -m iprange --src-range $PCIP_ME --dst-range 192.168.1.255 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p UDP -m multiport --source-port $SambaPort2 -m iprange --src-range 192.168.1.255 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p UDP -m multiport --source-port $SambaPort2 -m iprange --src-range $PCIP_RESEAUX -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p TCP -m multiport --source-port $SambaPort2 -m mac --mac-source $MAC2 -m iprange --src-range $PCIP_RESEAUX -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p UDP -m multiport --destination-port $SambaPort2 -j DROP iptables -A OUTPUT -p TCP -m multiport --destination-port $SambaPort2 -j DROP fi #================================== ouverture ssh serveur et client =========================== if [ "$SectionSSH" = "OUI" ] ;then if [ "$SectionSSHServeur" = "OUI" ] ;then #La durée du ban, permet donc d'avoir X temp duran la qu'elle la première connection est permise Ban_TIME="900" #nombre de connection permise PAR IP, si la connection actuelle est deja (toujours) connectée, #c'est la nouvelle connection qui sera bannie duran le $Ban_TIME mai laisse la première connection active #il est donc iportan de ne pas laisser trop longtemp le temps pour le client ssh puisse ce loguer. afin de pouvoire reprendre la main si les deux client #aurait la meme ip publique #L'avantage c'est que cela limite le nombre de connection par ip. limite aussi le brute force puis qu'il lui faut passe 1 connection la foit par ip #on pourrait pour bien faire limiter le nombre de tentative qui serai valable meme si la perssonne ce deconnecte, puis ce reconnecte #il faudrai alors cree une 2 emem chaine avec un hitcount global, le risque c'est de bloque le serveur completment Ban_FAILD="2" #creation de la chaine iptables -N SSH #on log iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH --rcheck --seconds $Ban_TIME --hitcount $Ban_FAILD -j ULOG --ulog-prefix="SSH" # si hitcount est depasser on ban iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSH --rcheck --seconds $Ban_TIME --hitcount $Ban_FAILD -j DROP # permière et les suivante (si le hitcoun n'est pas atteint ) entrée son enfin aceptée iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT fi #laisse sortir les client ssh IPVALEUR="iptables -A OUTPUT -p TCP --dport 22 -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; IPVALEUR="iptables -A OUTPUT -p TCP --sport 22 -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; IPVALEUR="iptables -A OUTPUT -p TCP --dport 22 -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; IPVALEUR="iptables -A OUTPUT -p TCP --sport 22 -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; iptables -A INPUT -p TCP --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p TCP --dport 22 -j DROP iptables -A OUTPUT -p UDP --dport 22 -j DROP fi #========================================== DNS ======================================== iptables -A INPUT -p UDP --sport 53 -j ACCEPT IPVALEUR="iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -p UDP --dport 53 UID1000 UID0" output_user $IPVALEUR; #==========================================E-MAIL=============================================== if [ "$SectionMail" = "OUI" ] ;then #on force l'ip de sont propre FAI pour eviter d'avoir un port ouvert. m1="212.147.0.153" m2="212.147.0.121" IPVALEUR="iptables -A OUTPUT -p TCP --dport 110 -m iprange --src-range $PCIP_ME --dst-range $m1 UID1000" output_user $IPVALEUR; iptables -A INPUT -p TCP --sport 110 -m iprange --dst-range $PCIP_ME --src-range $m1 -j ACCEPT IPVALEUR="iptables -A OUTPUT -p TCP --dport 25 -m iprange --src-range $PCIP_ME --dst-range $m2 UID1000" output_user $IPVALEUR; iptables -A INPUT -p TCP --sport 25 -m iprange --dst-range $PCIP_ME --src-range $m2 -j ACCEPT iptables -A OUTPUT -p UDP --dport 110 -j DROP iptables -A OUTPUT -p TCP --dport 110 -j DROP fi #================================== IRC ======================================================= if [ "$SectionIrc" = "OUI" ] ;then IPVALEUR="iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -p TCP --dport 6667 UID1000" output_user $IPVALEUR; iptables -A INPUT -p TCP --sport 6667 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p UDP --dport 6667 -j DROP iptables -A OUTPUT -p TCP --dport 6667 -j DROP iptables -A INPUT -p UDP --sport 6667 -j DROP iptables -A INPUT -p TCP --sport 6667 -j DROP fi #================================== Nexuiz===================================================== if [ "$SectionNEXIUZ" = "OUI" ] ;then # plage de port délibererment ouvert, en faite c'est pas pratique et pas fiable (on ne verifie pas ou sa va ce connecter) # j'ai resolut ce petit problème plus bas IPN="69.59.212.88" IPN2="64.22.107.125" #SPN="32809" DPN="27950" IPVALEUR="iptables -A OUTPUT -p UDP --dport $DPN -m iprange --src-range $PCIP_ME --dst-range $IPN -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; IPVALEUR="iptables -A OUTPUT -p UDP --dport $DPN -m iprange --src-range $PCIP_ME --dst-range $IPN2 -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; iptables -A INPUT -p UDP -m mac --mac-source $MAC1 --sport $DPN -m iprange --dst-range $PCIP_ME --src-range $IPN -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p UDP -m mac --mac-source $MAC1 --sport $DPN -m iprange --dst-range $PCIP_ME --src-range $IPN2 -m state --state ESTABLISHED,RELATED -j ACCEPT IPVALEUR="iptables -A OUTPUT -p UDP -m multiport --destination-port 26000:26010 -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; iptables -A INPUT -p UDP -m multiport --source-port 26000:26010 -m state --state ESTABLISHED,RELATED -j ACCEPT IPVALEUR="iptables -A OUTPUT -p TCP -m multiport --destination-port 26000:26010 -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; iptables -A INPUT -p TCP -m multiport --source-port 26000:26010 -m state --state ESTABLISHED,RELATED -j ACCEPT fi #================================== amsn ===================================================== if [ "$SectionAmsn" = "OUI" ] ;then IPVALEUR="iptables -A OUTPUT -p TCP -m multiport --destination-port 1863 -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; iptables -A INPUT -p TCP -m multiport --source-port 1863 -j ACCEPT iptables -A OUTPUT -p TCP --dport 5353 --sport 5353 -m state --state NEW,ESTABLISHED,RELATED -j DROP iptables -A INPUT -p TCP --dport 5353 --sport 5353 -j DROP fi #================================== team speak ========================================================= if [ "$SectionTS" = "OUI" ] ;then TS0="91.121.3.190" TSP0="8767" IPVALEUR="iptables -A OUTPUT -p UDP --dport $TSP0 -m iprange --src-range $PCIP_ME --dst-range $TS0 -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; iptables -A INPUT -p UDP --sport $TSP0 -m iprange --dst-range $PCIP_ME --src-range $TS0 -m state --state ESTABLISHED,RELATED -j ACCEPT fi #================================== ftp ========================================================= if [ "$SectionFtp" = "OUI" ] ;then ftp="212.147.60.253" IPVALEUR="iptables -A OUTPUT -p TCP -m iprange --dst-range $ftp -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; iptables -A INPUT -p TCP -m iprange --src-range $ftp -m state --state ESTABLISHED,RELATED -j ACCEPT fi #================================== xvnc4viewer client==================================================== if [ "$SectionXLAN" = "OUI" ] ;then PX="5900" IPVALEUR="iptables -A OUTPUT -p TCP -m multiport --destination-port $PX -m iprange --src-range $PCIP_ME --dst-range $PCIP_RESEAUX -m state --state NEW,ESTABLISHED,RELATED UID1000" output_user $IPVALEUR; iptables -A INPUT -p TCP -m multiport --source-port $PX -m iprange --src-range $PCIP_RESEAUX -m mac --mac-source $MAC2 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p TCP -m multiport --destination-port $PX -j DROP fi #================================== Navigateur================================================ if [ "$SectionNavigateur" = "OUI" ] ;then #encore quelque subtiliter de ce coter car beacoup de trafique passe par le port 80. iptables -A INPUT -p TCP -m multiport --source-port 80,443 -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A INPUT -p TCP --sport 443 -j ACCEPT IPVALEUR="iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -p UDP --dport 80 UID1000 UID0" output_user $IPVALEUR; IPVALEUR="iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -p TCP -m multiport --destination-port 80,443 UID1000 UID0" output_user $IPVALEUR; iptables -A OUTPUT -p TCP -m multiport --destination-port 80,443 -j DROP iptables -A OUTPUT -p UDP -m multiport --destination-port 80,443 -j DROP iptables -A INPUT -p TCP -m multiport --source-port 80,443 -j DROP iptables -A INPUT -p UDP -m multiport --source-port 80,443 -j DROP fi #================================== scanner et autres logiciel local========================== iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT #================================== ICPM ===================================================== if [ "$SectionIcpm" = "OUI" ] ;then #de nos jours c'est plus une menace,m'enfin reston mefian tout de meme #il pourrait etre bon d'utilise le module recent pour eviter les attack via les zombie. iptables -A INPUT -p 1 -m limit --limit 30/h --limit-burst 30 -j ACCEPT fi #================================== ip passee en ligne de commande ================================ T="true" I="0" #site a rentrer sur la ligne de commande après le start #Ceci permet de rentrer une ip sur la ligne de commande plutot que les placer dans un fichier, #le port n'est pas préciser, cela peux s'averer utile pour Nexiuz ou bitorrent etc #il est possible de placer les ip en fixe mai si elle change il va faloir éditer le fichier #alors que en passant le parramettre sur la ligne de commande il suffi de modifier directement la ligne for B in $@ ;do #I=$(($I+1)) if [ ! -z $B ] && [ $B != "start" ] ;then E=`iptables -A OUTPUT -p TCP -m iprange --dst-range $B -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT` E=`iptables -A INPUT -p TCP -m iprange --src-range $B -m state --state ESTABLISHED,RELATED -j ACCEPT` echo "ip ajoutée: $B" fi done #================================== Règle pour logquer======================================== iptables -A INPUT -i $ETH -m state --state NEW,INVALID -j ULOG --ulog-prefix="Drop New invalide" iptables -A INPUT -i $ETH -m state --state NEW,INVALID -j DROP #============================================================================================== iptables -A INPUT -i $ETH -j ULOG --ulog-prefix="Entrée" #iptables -A OUTPUT -o $ETH -m owner --uid-owner $USERROOT -j ULOG --ulog-prefix="Root" iptables -A OUTPUT -o $ETH -j ULOG --ulog-prefix="Sortie" startend ) } boucleprincipale ;; stop) ETH=`/sbin/ifconfig -s |grep eth | cut -d " " -f 1` iptables --zero iptables -F iptables -X iptables -t nat -X iptables -t nat -F iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT if [ "$SectionLimiteBandePassante" = "OUI" ] ;then tc qdisc del dev $ETH root fi echo "par feux a l'arret $Ver" ;; *) N=/etc/init.d/$NAME echo "Usage: /etc/init.d/firewall {start ¦ stop | sart ip1 ip2 ip3 ip4 etc}" $DAEMON >&2 exit 1 ;; esac exit 0