Ouala 
petite parenthèse:
avis aux DEBUTANT , ne pas utiliser ce script pour votre par feux surtout sur un serveur !
note : il fait un petit disque en ram
note 2.- il consome un peux de cpu
note 3 .- c’est sympa d’avoir juste a autoriser le processus mai , le probleme c’est que c’est pas tout a fait fiable.
enfin il dat d’il y a 2 ans aux moins a mes debut ,donc c’est mal coder m’enfin je voulais savoir si c’était possible de le faire.
#!/bin/sh
DAEMON="Firewall 0.4"
NAME="Firewall"
ID=$$
DESC="Firwall 0.4"
#programe autoriser
ProgAuto=(wget ssh nfsd hddtemp)
#performance et securiter
# PauseForBreak=0.1
# PauseForClose=0.1
PauseWhile=0.5
#protocole -i4 =ipv4 -i6 = ipv6 -i=tous
protocol="-i"
# votre interface reseaux
ETH="eth0"
#Fichier temporaire pour les appelles lsof
File="/home/dd_ram/lsof_auto"
# si vous voulez que sa scan en permance laisser sure true et i = 1 et boucledesortie = 0
# si vous voulez que celasoie juste pour le demarrage régler a
# une valeur qui vous convienne environ 300
#toute foit avant de rectiver le par feux vous devrez l'a appler de cette manière:
#/etc/init.d/firewall stop && /etc/init.d/firewall start
boucleinfinie="true"
boucledesortie="0"
i="1"
#log des prog,port fermer (ON : OFF)
LOG="ON"
#permet de loguer avec iptables (ici avec ulog) (ON : OFF)
LOGIP="OFF"
prefix="LOGIP-ON"
#fichier permettant facilment de savoir si un port est fermer
pathlog="/home/dd_ram/close.log"
#Repertoire qui ser aux montage d'un volume en ram
ddvol="/home/dd_ram"
# cela represente une faille
Restricted="0755"
#Contien le PID en cour
PID="/home/dd_ram/pid"
echo "Configuration des règles de base"
#root interdi en sortie sauf sur le port 53 !
idroot="0"
#state input
DROPSTATE="-m state --state NEW,INVALID"
#Mise a zero des regle (par précaution)
#
# On remet la police par défaut à ACCEPT
#
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
#
# On vide (flush) toutes les règles existantes
#
iptables -F
iptables -t nat -F
#
# Et enfin, on efface toutes les chaînes qui ne
# sont pas à defaut dans la table filter et nat
iptables -X
iptables -t nat -X
#==============================================
# on autorise tout ce qui est en local
#règle de filtrage pour rejeter les paquets en prioriter et pour proteger les service par defaut qui son ouvert
iptables -A INPUT -f -j DROP
iptables -A INPUT -i $ETH $DROPSTATE -j DROP
iptables -A INPUT -i $ETH -s 192.168.1.0/24 -j ACCEPT
#loopack
iptables -A INPUT -i lo -j ACCEPT
#iptables -t filter -A INPUT -i $ETH -m limit --limit 24/h --limit-burst 1 -p all -j ULOG --ulog-prefix="USER INPUT Final"
#==============================================
#==============================================
#le loopack
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -p TCP --dport 53 -m owner --uid-owner $idroot -j ACCEPT
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -p UDP --dport 53 -m owner --uid-owner $idroot -j ACCEPT
iptables -A OUTPUT -o $ETH -m owner --uid-owner $idroot -j DROP
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o $ETH -d 192.168.1.0/24 -j ACCEPT
#iptables -t filter -A OUTPUT -o $ETH -m limit --limit 24/h --limit-burst 1 -p all -j ULOG --ulog-prefix="USER OUTPUT Final"
#===============================================
set -m
case "$1" in
start)
echo "montage du disque virtuel"
mount -t tmpfs -o size=5m,nr_inodes=10k,mode=$Restricted tmpfs "$ddvol"
echo "montage du disque terminer"
echo "$$" > "$PID"
while $boucleinfinie ;do
lsof $protocol -P > $File
while read line ;do
n1=`echo $line | cut -d":" -f2 | cut -d"(" -f1 | cut -d"-" -f1`
n2=`echo $line | cut -d" " -f1`
Found="FALSE"
if [ "COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME" != "$n1" ] ;then
for TB in ${ProgAuto[*]} ;do
if [ "$TB" = "$n2" ] ;then
#echo "affichage " $n2 "===" $TB "sure le port" $n1
Found="TRUE"
#sleep $PauseForBreak
break
fi
done
#if [ "$Found" = "TRUE" ] ;then
# echo "app auto $n2 sur le port $n1"
if [ ! -n "${PortClose["$n1"]}" -a "$Found" != "TRUE" ] ;then
echo "app interdi $n2 sur le port $n1"
PortClose[$n1]="TRUE"
if [ "$LOGIP" = "ON" ] ;then
iptables -t filter -A INPUT -i $ETH -m limit --limit 24/h --limit-burst 1 -p tcp --dport $n1 -j ULOG --ulog-prefix="$prefix"
iptables -t filter -A INPUT -i $ETH -m limit --limit 24/h --limit-burst 1 -p tcp --sport $n1 -j ULOG --ulog-prefix="$prefix"
iptables -t filter -A INPUT -i $ETH -m limit --limit 24/h --limit-burst 1 -p udp --dport $n1 -j ULOG --ulog-prefix="$prefix"
iptables -t filter -A INPUT -i $ETH -m limit --limit 24/h --limit-burst 1 -p udp --dport $n1 -j ULOG --ulog-prefix="$prefix"
iptables -t filter -A OUTPUT -o $ETH -m limit --limit 24/h --limit-burst 1 -p tcp --dport $n1 -j ULOG --ulog-prefix="$prefix"
iptables -t filter -A OUTPUT -o $ETH -m limit --limit 24/h --limit-burst 1 -p tcp --sport $n1 -j ULOG --ulog-prefix="$prefix"
iptables -t filter -A OUTPUT -o $ETH -m limit --limit 24/h --limit-burst 1 -p udp --dport $n1 -j ULOG --ulog-prefix="$prefix"
iptables -t filter -A OUTPUT -o $ETH -m limit --limit 24/h --limit-burst 1 -p udp --dport $n1 -j ULOG --ulog-prefix="$prefix"
iptables -A INPUT -i $ETH -p tcp --dport $n1 -j DROP
iptables -A INPUT -i $ETH -p tcp --sport $n1 -j DROP
iptables -A INPUT -i $ETH -p udp --dport $n1 -j DROP
iptables -A INPUT -i $ETH -p udp --sport $n1 -j DROP
iptables -A OUTPUT -o $ETH -p tcp --dport $n1 -j DROP
iptables -A OUTPUT -o $ETH -p tcp --sport $n1 -j DROP
iptables -A OUTPUT -o $ETH -p udp --dport $n1 -j DROP
iptables -A OUTPUT -o $ETH -p udp --sport $n1 -j DROP
else
iptables -A INPUT -i $ETH -p tcp --dport $n1 -j DROP
iptables -A INPUT -i $ETH -p tcp --sport $n1 -j DROP
iptables -A INPUT -i $ETH -p udp --dport $n1 -j DROP
iptables -A INPUT -i $ETH -p udp --sport $n1 -j DROP
iptables -A OUTPUT -o $ETH -p tcp --dport $n1 -j DROP
iptables -A OUTPUT -o $ETH -p tcp --sport $n1 -j DROP
iptables -A OUTPUT -o $ETH -p udp --dport $n1 -j DROP
iptables -A OUTPUT -o $ETH -p udp --sport $n1 -j DROP
fi
#sleep $PauseForClose
if [ "$LOG" = "ON" ] ;then
echo "$n2 >=======> $n1" >> $pathlog
fi
# elif [ "${PortClose["$n1"]}" = "TRUE" ] ;then
# echo "port déjà fermer : " $n1
# else
# echo "ERREUR inconnue : " ${PortClose[$n1]}
fi
fi
done < $File
sleep $PauseWhile
i=$(($i+1))
if [ "$i" = "$boucledesortie" ] ;then
boucleinfinie="false"
echo "Le contrôle des programes est terminer le: " `date` >> $pathstop
fi
done
;;
stop)
PID="/home/dd_ram/pid"
ddvol="/home/dd_ram"
kill -n 9 $(cat $PID) 2>/dev/null
echo "Demontage du volume"
sleep 2
umount -t tmpfs "/home/dd_ram"
# umount -t tmpfs "$ddvol"
echo "Demontage terminer"
echo "Mise a zero des regles d'iptables"
#
# On remet la police par défaut à ACCEPT
#
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
#
# On vide (flush) toutes les règles existantes
#
iptables -F
iptables -t nat -F
#
# Et enfin, on efface toutes les chaînes qui ne
# sont pas à defaut dans la table filter et nat
iptables -X
iptables -t nat -X
echo "$DAEMON est terminer"
;;
*)
N=/etc/init.d/$NAME
echo "Ne pas utiliser /etc/init.d/iptable_auto {start} OR news {start}=stop " $DAEMON >&2
echo "Usage /etc/init.d/firewall stop && (OR) /etc/init.d/firewall start"
exit 1
;;
esac
exit 0