#!/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