All pastes #815330 Raw Edit

Someone

public text v1 · immutable
·published 2007-12-13 23:36 UTC
rendered paste body
#!/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