#!/bin/bash #NC imcp.ba@free.fr IMCP Blandy Alain #certaine procedure de commande IFCONFIG="/sbin/ifconfig"; #fichier de la distribution ROUTE="/sbin/route"; #fichier de la distribution IPTABLES="/sbin/iptables"; #fichier de la distribution SYSCTL="/sbin/sysctl"; #fichier de la distribution HWCLOCK="/sbin/hwclock"; #fichier de la distribution #certain fichier pour le web BOXALSA=''; #si box alsatis presente : fonctionnement en mode degrade avec la box ###ADIP adresse ip apparait une fois dans ce source (variable myipwhi) #ce programme est un scripte interactif ou boucle (daemon) # qui permet dans l'ordre : # # * FRONTAL GESTION ADSL CONNECTION SUR MODEM EN PPPOE ( C D R ) # avec outils standar roaring pinguinn /etc/ppp/ # legeremnet modifie pour avoir plusieurs mode fai et liaison pppoe # # * GESTION DES RESEAUX ETHERNET HOSTS NETWORK CONF IFCONFIG ROUTAGE IPTABLES SNAT DNAT ( H )....... # surveillance adsl : arret redemarrage adsl # voir si necessaire contacter demos surveillance onduleur 220V # pour arreter et redemarrer tous les pc , tous les modems ... # # adaptation dynamique du parre feux au connexion existante .... # raz des autorization du sosu reseau wifi ... # # * MISE A L'HEURE ( T ) ntpserv # # * DEMMARAGE OU RELANCE DE BIND dns # # * MISE A JOUR PARAMETRE ETAT ANTENNE WIMAX # # * SURVEILLANCE DEBIT ADSL ( V R ) # # En cas de probleme : # rebouclage si-dessus sur FRONTAL redemarrage ppppoe si dessu # Si le probleme subssite transmission d'une demande # d'arret a tous les pc ; arret onduleur pour coupure generale 220V # et redemarrage de tous les equipements ( antenne pc dns ...) # Mais avant cela seront lance # des connexion pppoe dynamiques supplementaire # et d'autree serontn frmees # Ce programme est apelle au demarrage, en mode daemon (boucle): # il initialise les modems adsl les surveille, les relances, # met en place un pare feux, fait qq mise a jour web ... # coupe le 220v dans toutes la station si necessaire # Ce programme peut etre aussi apelle en mode ligne # pour controler ou modifier la configuration .... # ------------------------------------------------------------- # ce listing est un peut long ... # il est necessaire de faire une lecture generale prealable ! # ------------------------------------------------------------- #ce programme est un script qui fonctionne # en interactif avec l'operateur # ou en sous programme non interactif ou en batch daemon # avec possiblite de retour a operateur # -------sous programmes divers situes la par raison de commodite ------ # ------- que vous pouvez sauter en premiere lecture ------- #controle de la laison internet function medianping #sous programme de controle du ping moyen { # cette fonction est utiliser pour controler la liaison effective internet par des pings # parametre d'appel : # $1 host a tester # $2 count nombre de test # $3 limittime ms integer (limite du temps moyen de reponse) # return : # variable globale mediantime echo -n "... "; # extraiere du ping la ligne round-trip # prendre le 4 eme champ # en extraire nombre apres premier / mediantime=`ping -c $2 $1 |grep round-trip |\ (read a b c d rest; echo $d)|(IFS="/"; read a b rest; echo $b)`; echo -n "ping $1 median time de $2 test : $mediantime "; if test "$mediantime" != ""; then #valid mesure mediantime=`echo "$mediantime"| (IFS="."; read inte frac; echo $inte)`; #integer tronk if test "$[ $mediantime > $3 ]" == "1"; then mediantime=""; echo "supperieur a $3 ms !!!"; echo "`date -u` ping $1 median time de $2 test : $mediantime " >>$startedlogfile; # warning else echo "inferieur a $3 ms ."; #ok fi; else echo "Erreur !!!"; #pas de liason ( ou pas de dns si $1 symbolique) echo "`date -u` ping $1 Erreur !!! pas de liaison ou de dns ? " >>$startedlogfile; # warning fi; #return value on global variable mediantime #ok if not vide (retourne le temps moyen) #si defaut detecte alors retourne vide dans mediantime } # ---------------------------------------------------------------------------- # ce groupe de fonctions utilisent des variables globales # pour mesure le debit effectif par ifconfig entre deux instants #il est constitue de 3 fonctions appelees l'une apres l'autre a des instants sperares : # startmesure appele ifconfig a un insatnt Tstart # stopmesure appele ifconfig a un insatnt Tstop # calculdebit optionel (au cas ou on a un doute) # qui peremet d'utiliser les datas memorise par stop et start # usage typique # startmesure # ...... # stopmesure # ...... # calculdebit .... # # objectifs et parametres par defaut : # $carteinterfadsl #le perifreique logique ppp associe par defaut a la mesure du debit # on lui prefere ethx car on sait pas si c'est ppp0 ppp1 ..... # ( c'est biaise si on ouvre le port 80 de IDU alvarion !!! ) #par definition tous les modem sont sur le hub de cette carte debitok=""; minimudebitdown="$[1 * 1024 * 1024 / 8]"; #minimum debit down mega bit KOKKKKK minimudebitup="$[250 * 1024 / 8]"; #minimum debit up ki bit KOKKKKK function startmesure #sous programme de controle debit { if test "$1" != ""; then aval="$1"; fi; #definition du periferique a surveiller debitok=""; #debut mesures debit$ava tifpostart="`$IFCONFIG $carteinterfadsl`"; #start sbin bin KOKKKKKKKKKKKKKKKKKKKKKKKKK ctimepostart="`date +\"%s %N\"`"; tifpostop=" PAS DE MESURE IF CONFIG STOP $carteinterfadsl : RX bytes: .... !"; ctimepostop="$ctimepostart"; #le meme pour instant } function stopmesure #sous programme de controle debit { debitok=""; #fin mesures debit tifpostop="`$IFCONFIG $carteinterfadsl`"; #stop sbin bin KOKKKKKKKKKKKKKKKKKKKKKKKKK ctimepostop="`date +\"%s %N\"`"; } function calculdebit #sous programme de controle debit { debitok=""; #variable globale de reponse en retour #extraction de la bonne ligne ifconfig RX bytes ( et Tx sur la meme ligne ) ifpostart="`echo \"$tifpostart\"|grep \"RX bytes:\"`"; ifpostop="`echo \"$tifpostop\"|grep \"RX bytes:\"`"; #affichage donnees brutes # format %7s pour nom du periferique # format %10s pour affichage temps segondes depuis 1970 echo; echo ">> Reponses des ifconfig precedants :" printf ">> %-75s at %10s s %9s ns if %7s start\n" "\"$ifpostart\"" $ctimepostart $carteinterfadsl; echo; printf ">> %-75s at %10s s %9s ns if %7s stop \n" "\"$ifpostop\"" $ctimepostop $carteinterfadsl; #avec les "" le premeir parametre n'est jammais vide echo; #calcul des dates des mesures & supp zero initial : pas en octal # t.. en segonde et d. en micro segonde timepostart="`echo $ctimepostart |(read a b c; echo $a)`"; dtimepostart="`echo $ctimepostart |(read a b c; echo $b | sed -e \"s/^0*//\")`"; dtimepostart="$[$dtimepostart / 1000000]"; #en micro segonde timepostop="`echo $ctimepostop |(read a b c; echo $a)`"; dtimepostop="`echo $ctimepostop |(read a b c; echo $b | sed -e \"s/^0*//\")`"; dtimepostop="$[$dtimepostop / 1000000]"; #en micro segonde # format %12s 1tera max pour affichage ifconfig #extraire les nombres d'octets des lignes ifconfig donpostart="`echo $ifpostart |sed -e \"s/.*RX bytes://\" | sed -e \"s/ .*//\"`"; if test "$donpostart" == ""; then donpostart="0"; fi; #control ifconfig uppostart="`echo $ifpostart |sed -e \"s/.*TX bytes://\" | sed -e \"s/ .*//\"`"; if test "$uppostart" == ""; then uppostart="0"; fi; #control ifconfig donpostop="`echo $ifpostop |sed -e \"s/.*RX bytes://\" | sed -e \"s/ .*//\"`"; if test "$donpostop" == ""; then donpostop="0"; fi; #control ifconfig uppostop="`echo $ifpostop |sed -e \"s/.*TX bytes://\" | sed -e \"s/ .*//\"`"; if test "$uppostop" == ""; then uppostop="0"; fi; #control ifconfig #calcul des dures des mesures en ms durepoms="$[ $[$[$timepostop - $timepostart] * 1000] + $[$dtimepostop - $dtimepostart]]"; if test "[$durepoms <= 0]" == '1'; then echo ">> IMPOSSIBLE DE CALCULER LE DEBIT !!!!"; else #calculer delta octets deltaoctetpodown="$[$donpostop - $donpostart]"; deltaoctetpoup="$[$uppostop - $uppostart]"; #synthese printf ">> %12s octets RX %12s octets TX at %10s s %3s ms %7s start\n" $donpostart $uppostart $timepostart $dtimepostart $carteinterfadsl printf ">> %12s octets RX %12s octets TX en %16s ms %7s delta\n" $deltaoctetpodown $deltaoctetpoup $durepoms $carteinterfadsl printf ">> %12s octets RX %12s octets TX at %10s s %3s ms %7s stop \n" $donpostop $uppostop $timepostop $dtimepostop $carteinterfadsl echo; #calcul debit debpodown="$[deltaoctetpodown * 1000 / $durepoms]"; #en octets segondse debpoup="$[deltaoctetpoup * 1000 / $durepoms]"; #format printf %6s calcule pour 200.00Mibit/s max : soit %8s oct/s %5s Kioct/s %6s Kibit/ss #info debit adapter unite KOKKKKKKKKKKKKKKKKK printf ">> %7s RX %8s oct/s %5s Kioct/s %6s Kibit/s " $carteinterfadsl $debpodown $[$debpodown / 1024] $[$debpodown * 8 / 1024]; echo; printf ">> %7s TX %8s oct/s %5s Kioct/s %6s Kibit/s " $carteinterfadsl $debpoup $[$debpoup / 1024] $[$debpoup * 8 / 1024]; # info differee ( DOS ?) if test "$[$debpodown >= $minimudebitdown]" == "1"; then debitok=">> Debit entrant $carteinterfadsl $debpodown est superieur a $minimudebitdown octets segondes !"; else if test "$[$debpoup >= $minimudebitup]" == "1"; then debitok=">> Debit sortant $carteinterfadsl $debpoup est superieur a $minimudebitup octets segondes !"; fi fi # info immediate if test "$debitok" == ""; then # autre pb en cours ? ! echo " >> le perifreique $carteinterfadsl n'est pas sature ! le debit mesure >> $debpodown est inferieur a $minimudebitdown octets/segondes dessandant >> $debpoup est inferieur a $minimudebitup octets/segondes montant >> le pb adsl est ailleurs !" fi; fi; echo; } # ---------------------------------------------------------------------------- #pg iterface de gestions des iptables firsterriptables=""; #variables globale qui memorise la premiere erreur dans la programmation des iptables function CALLIPTABLES { #encapsule appel iptables en cas erreur envois message # usage : CALLIPTABLES x y z a; echo " => $IPTABLES $* :"; #KOKK option de trace $IPTABLES $*; local rep="$?"; #code erreur reponse if test "$rep" != "0" ; then echo -e " => Erreur return code $rep dans l'appel de => $IPTABLES $* => \a\a\a\a !!!!"; if test "$firsterriptables" == ""; then #si pas encore erreur firsterriptables=" \a\a\a\a => ERREUR $rep dans $IPTABLES $*"; fi; fi; } function MACROLOGSITUPEUX #macro sh pour simplifier ecriture de la regle iptables NATESITUPEUX { # parametre d'appel # $1 prefixe de log a utiliser : exemple LOG_OUTPUT_SPECIAL_?_ # -j LOG --log-level info --log-prefix $1 # $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ....autre parametre a passer : exemple -t nat -A NATESITUPEUX -p tcp -s $2 --dport $1 # (sans controle de limite) # mets en log (en volume limite ) et ensuite celon le cas # ajoute un compteur simple un drop ou un reject .... if test "${17}" != ''; then #trop de parametres # message erreur echo -e " TROP_DE_PARAMETRES_MACROLOGSITUPEUX \"${17}\" \a\a\a\a "; # essayer de faire planter au lancement CALLIPTABLES TROP_DE_PARAMETRES_MACROLOGSITUPEUX $* else if test "$IFLOG" != ''; then # LOG si iflog est on #si iflog est on alors on met en log en limitant par $LIM CALLIPTABLES $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15} ${16} $LIM -j LOG --log-level info --log-prefix $1 ; fi; #determiner au vus du prefixe de log, action a mener (apres le log eventuel) dans # la regle juste suivante local action=''; #simple compteur if test "${1/DROP}" != "$1"; then #le paremtre contiends DROP action='-j DROP'; fi; if test "${1/HLIM}" != "$1"; then # le paremtre contiends HLIM action='-j DROP'; # on est hors limite on drop !!!!!! fi; if test "${1/REJE}" != "$1"; then # le paremtre contiends REJE action=' -j REJECT --reject-with icmp-admin-prohibite'; fi; if test "${1/ACCEPT}" != "$1"; then # le paremtre contiends ACCEPT action=' -j ACCEPT'; fi; if test "${1/RETURN}" != "$1"; then # le paremtre contiends RETURN action=' -j RETURN'; fi; CALLIPTABLES $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} $action -m comment --comment "compt_$1" ; # regle sythematique tremine par action prevue fi; # on utilise une macro plutot que une sous chaine # pour etre sur que le compteur suit toujour la regle de log # si le log sature il reste le compteur juste apres quand on liste la regle } function MACRONATESITUPEUXRANGEPORT #macro sh pour simplifier ecriture de la regle iptables NATESITUPEUX { # parametre d'appel : # $1 range du port demande destination sous la forme 8180:8180 # $2 machine de destination : host , host:range-range #tous trafic vers ce range port est DNAT vers l'ip specifie # en gardant ou pas le meme numero de port # utilisation type : MACRONATESITUPEUXRANGEPORT 8180:8180 $rtzeroun; # utilisation type : MACRONATESITUPEUXRANGEPORT 9180:9180 $alavarion:80-80; echo " Redirection tcp/udp MACRONATESITUPEUXRANGEPORT $1 $2 $3"; # si on se connecte sur le port $1 (avec une adresse destination dedie TBDF), # on envois au sous routeur correspondant $2 CALLIPTABLES -t nat -A NATESITUPEUX -p tcp --dport $1 -j DNAT --to-destination $2; CALLIPTABLES -t nat -A NATESITUPEUX -p udp --dport $1 -j DNAT --to-destination $2; # cette macro ne specifis pas de host source # elle sert a faire une regle nomme anglobante # qui elle sera appelee pour une ip source specifique TBDF } # ---- programme principal ---- # ---- lui meme compose de plusieurs sections ----- #======================================================================================================== #--------------------------------------------- # EN PREMIERE LECTURE ! #--------------------------------------------- # on est ici dans la partie definitions reseaux # toutes l'architecture fixe du reseaux adresse ip compris est parametre ici !!!!!!! # # ICI ON RENTRE TOUTES LES CARACTERISTIQUES DES CARTES ET SOUS RESEAUX # et on refabrique les fichiers : route host ..... #---------------------------------------------------------------------------- # cette partie est le parametrage des reseaux : # par intermediaire de variables shell !!!! # # ce tronc commun est a adapter a votre conf reseaux sous resaux # toute les ip sont determinees ici et on met a jours avec les fichier route host ... # # --- definition des cartes internet et adresses divers : # "specifique" a cette station # voir plan general dans: http://imcp.ba.free.fr/cours/connect.html # des resaux et sous resaux # ( ma configuration n'est qu'un exemple que vous pouvez adapter # l'interet du logiciel libre et de faire ce que l'on veut ) # ---- 1 ere carte connecte au hub internet interne, qui permet de distribuer # internet aux pc locaux ( type cyber cafe wifi ... ) #definition de la 1ere carte eth physique qui accede reseau local zero (back bonne) carteinterfzero="eth0"; #nom du periferique ethernet qui supporte les reseaus locaux (res zero) : #carteinterfzero="eth1"; # KOKKKKKKK temporaire pour test inversion des carte racineauto="192.168" # prefixe commun reseaux racine ( sans les deux 00.00 finaux) racinezero="${racineauto}.0"; # prefixe commun reseaux dorsal zero ( sans le .00 final) maskinterfzero="255.255.255.0"; # masque de reseau zero correspondant (ip et classe) reszero="${racinezero}.00"; # ad du reseau zero !!! interfzero="${racinezero}.254"; # ad ip a attribuer a cette carte par ifconfig # ---- # ratache au meme reseau zero, j'ai dans mon cas, # ajoute plusieurs sous reseaux avec leur routeur dedies(connecte au hub): #definition des autres sous reseaux rataches au reseau zero (!= racinezero) # resun="192.168.11.00"; maskresun="255.255.255.0"; #add et mask sous reseau un # resdeux="192.168.12.00"; maskresdeux="255.255.255.0"; #add et mask sous reseau deux # restrois="192.168.13.00";maskrestrois="255.255.255.0"; #add et mask sous reseau trois resun="${racineauto}.11.00"; maskresun="255.255.255.0"; #add et mask sous reseau un resdeux="${racineauto}.12.00"; maskresdeux="255.255.255.0"; #add et mask sous reseau deux if test "$BOXALSA" != ''; then #deplacer le 12 en 22 resdeux="${racineauto}.22.00"; maskresdeux="255.255.255.0"; #add et mask sous reseau deux # ALSATIS BOX fi; restrois="${racineauto}.13.00";maskrestrois="255.255.255.0"; #add et mask sous reseau trois #les routeurs correspondant (adresse > 127 a cause du dhcp) rtzeroun="${racinezero}.131"; # adresse dans zero du sous routeur du resun rtzerodeux="${racinezero}.132"; # adresse dans zero du sous routeur du resdeux rtzerotrois="${racinezero}.133"; # adresse dans zero du sous routeur du restrois # (par convcentions les dhcp que j'utilise je n'attribut pas adresse dynamique >127b !) # remarque chaque routeur a une autre carte ethernet du cote de sont sous reseau # de la forme 192.168.XX.254 (gateway par defaut du sous reseaux) # avec XX de la forme 11 ou 12 ou 13 .....(mask 255.255.255.0) # reseau wifi : gerre un sous reseau a part #reswifiun="192.168.1.00"; maskreswifiun="255.255.255.00"; reswifiun="${racineauto}.1.00"; maskreswifiun="255.255.255.00"; rtwifiun="${racinezero}.140"; # adresse dans zero du sous routeur wifiun (adresse > 127) #globalement on obtient un reseau autonome de sous reseaux d'une classe differente, #par addition des precedants : # resautonome="192.168.00.00"; maskresautonome="255.255.0.0"; resautonome="${racineauto}.00.00"; maskresautonome="255.255.0.0"; #remarque le reseau dorsal zero ( racinezero ) peut ne pas faire partie de autonome !!! # ---- 2 eme carte connecte a adsl # (en principe, dans un routeur, il y a au moins deux carte reseaux ...) #definition de la carte eth physique qui accede au interfaces des modem adsl export carteinterfadsl="eth1"; #dans un systeme mono carte ? mettre "eth0:1" # RQ : une carte ethernet peut avoir plusieur adresse IP associees # on peut donc mettre au point un routeur monocarte # ( tous sur le meme brins ethernet ) # c'est plus risque en terme de securite, mais c'est possible. # de meme sur une carte ethernet on peut changer son adresse mac ... #export carteinterfadsl="eth0"; # KOKKKKKKK temporaire pour test inversion # RQ: l'ordre de detection des carter ethernet sous Toutou linux # peut dependre de l'ordre de chargement des modules # et une carte peut etre au demarrage eth1 ou eth0 # pour eviter cette loteri, donner des priorites de chargement # des modules drivers noyau pour les cartes ethernet differentes # export carteinterfadsl pour fichier de configuratio pppoe-conf #etant sur une autre carte on peut choisr le reseaux comme on veut (pas focement dasn autonome) racineadsl="192.168.254"; # prefixe commun reseaux adsl ( sans le .00 final) if test "$BOXALSA" != ''; then racineadsl="192.168.12"; # prefixe commun reseaux adsl ( sans le .00 final) ALSATIS BOX fi; resadsl="${racineadsl}.0"; # ad du reseau adsl !!! maskinterfadsl="255.255.255.0"; # masque de reseau zero correspondant (ip et classe) interfadsl="${racineadsl}.1"; #ad a atribuer a la carte pour ifconfig if test "$BOXALSA" != ''; then interfadsl="${racineadsl}.100"; #ad a atribuer a la carte pour ifconfig ALSATIS BOX fi; # ---- le modem adsl lui meme (connecte sur le brin de interfadsl) alvarion="${racineadsl}.251"; # ad du modem alvarion qui est adsl 1 : pppoe radio # --- autres modems ...... # ---- divers pour eviter l'usage du dns ( pas forcement encore joignable) #adresse serveur asso virtuel : pour rerouting de port virtual="82.234.76.241"; #culte.hd.free.fr salle ramonville : pour mis en miroir proxy (voir regles iptables) #virtualweb="176.31.97.25"; #www.culte.org web culte (ancienne adresse) virtualweb="37.187.18.189"; #www.culte.org web culte #mise a lheure , avant redemarrage ou update bind ntpserv="145.238.203.10"; # ntp.obspm.fr CEA Paris ; # mise a jour de horloge fichiers UNIX #no dns ntpserv2="134.59.1.5"; # ntp.unice.fr # ---- adresse fixe reservee de cette box sur internet #l'adresse de ce serveur : si fixe !!! (negotition ppp sur adresse fixe) myipwhi="92.245.145.246"; #add negocie ppp ; mais toujour la meme : wimax ###ADIP # les autres adresse define par les demon pppd #seront definies plus tard par les connections #======================================================================================================== echo " PROGRAMME GESTION ADSL RESEAUX ETHERNET ROUTAGE IPTABLES $0 $1 services annexes : mise a l'heure , status modem , suveillance connexion "; # il est appele automatiquement au demmarrage et a l'arret # ou manuellement, dans une xterm # ce programme a deux modes de fonctionnement: # appel avec un parametre (automatique) (avec boucle ou sans boucle), # ou mode interactif (manuel : attente operateur ). # une tempo avant arret, permet de transformer l'automatique en manuel # ---- # ce programme utilise entre autre : # ---------------- # pour mettre en route arreter les ADSL (1 par defaut) ConfFile='/etc/ppp/myconfpppoe.conf'; #fichier de configuration de connection $CONFIG specifique ConfFile='' #sinon rien (par defaut /etc/ppp/pppoe.conf) #fichier thisuser='login@fai' # nom de la forme : login chez@ fai (password dans /etc/chap) perifetUser="$carteinterfadsl $thisuser" ; #definir ici la carte ethernet ET le nom user a utiliser SIMULTANEMENT (sinon rien) PerifetUser=''; #si pas definis voir dans $CONFIG fichier de config courant l' User et la carte par defaut # ConfFile et PerifUser son utilise en parametres , si-apres, # et permettent d'avoir des configuration, des fai et pppoe multiples .... # on peut aussi laisser ces parametres vides # les scripts de demarrage, d'arret ... de la distribution ou assistant : ADSLSTART="/usr/sbin/pppoe-start $PerifetUser $ConfFile" #fichier pppoe roaring penguin commande toutou linux 0, 2 ou 3 arguments ADSLSSTATUS="/usr/sbin/pppoe-status $ConfFile" #fichier pppoe roaring penguin commande toutou linux 0 ou 1 argument ADSLSSTOP="/usr/sbin/pppoe-stop $ConfFile" #fichier pppoe roaring penguin commande toutou linux 0 ou 1 argument #modif IMCP pour paremetre supplementaire : numerodeppp # ADSLSTOP permet d'arrete le dernier ppp lance par ADSLSTART (pour un fichier CONFIG donne) # les autres liaisons pppx son immunisees !! # ADSLSTART au demarrage verifis qu'il n'est pas deja actif (sur une CONFIG donne) # ( qui programment les demon ppp ppppoe (avec la config /etc/ppp/pppoe.conf)) # ( la variable d'environement DEBUG a un effet sur les script (voir coamande C maguscule)) # Le programme 'start' lance a son tour le programme 'connect' en batch(si pas debug) # attend la mise en route (ou un timeout ) pour rendre la main # Pour un nom de fichier de config donne il n'y a qu'un seul programme start actif # voir variable PIDFILE (/var/run/ ....) # le programme 'connect' lance, surveille (et relance eventuellement (si la varible RETRY_ON_FAILURE != "no")) # le programme 'pppd' qui a son tour [re]etablis 'pppoe' .... # le script 'connect' a etait modifie pour rendre la main immediatement apres le lancement de pppd # si RETRY_ON_FAILURE n'est pas actif (voir fichier CONFIG) # dans ce cas un meme pg Resetiptables peut lancer plusieures pppx # ---------------- # il utilise aussi les programmes et fichiers standards linux # ifconfig, route, $IPTABLES (qu'il peut mettre a jours) .... # ntpdate, $HWCLOCK, (mise a l'heure machine par reseau) # il lance aussi la fabrique une synthese http # /root/animation/alvarionani.sh : pour mettre a jour les parametres web de l'antenne # il utilise dans les fonctions de surveillance de la connexion internet # le programme de redemarrage onduleur : # /etc/rc.d/TestBatterie : pour demander arret des pc et de l'onduleur # ----- # Gestion du hotspot wifi : # la connection a partir du wifi sur le port 80 qq soit la destination # est a priory interdite par la raz des iptables, elle est redirige sur le port local 8887 # ou un process dedie qui informe utilisateur, et lui donne la marche a suivre pour se connecter # et modifier les iptables ... # ----- #chaque fois que ce programme fait une raz des iptables il possitionne des message avertissement : inforazwifi="/root/Web-Server/lastconf.txt"; #fichier info pour portail wifi (derniere raz iptables) (ecriture) lastconffile fileportwificontrols="/root/Web-Server/portailwifi/lisportwifcontrol.txt"; #fichier pour portail wifi donnant la liste des ports a retablir (ecriture) infoconf="/root/Web-Server/lastnatfilter.txt"; #fichier info configuratio nat filter (derniere raz iptables) (ecriture) # il utilise un fichier de trace de type log en continu infologwifi="/root/Web-Server/portailwifi/logwifi.txt"; #fichie pour y ecrire dedans la date de raz startedlogfile="/var/log/startedadsl.txt"; #fichier liste des demarrage # ---- #la variables IFLOG definis le comportement des enregistrement en LOG de iptables IFLOG='Mettre en LOG simple'; #faire les log en general (extension par mots clef) #IFLOG=''; #Desafecte KOKKKKKKKKKKKKKKKKKKKK #comportement par defaut; modiable par commande Z L F # ---- AFAI="0"; #compteur d'anomalie consecutive du fai : mis a zero part faveur ! STARTED=""; # date de demarrage/arret adsl pour info PARA="$1"; # la commande a executer en argument d'appel programme : parametre UN ou vide # TouTou Linux peut lancer cette tache programme dans une xterm ; # pour arret de X dans /usr/local/Ambiance/logout_shutdown, avec le parametre D ; # dans le programme /usr/local/Ambiance/0b_login, avec le parametre R ... ; # en mode simple ou boucle COM=""; #raz de la derniere commande executee precedament : sert a determiner la nouvelle la plus probable #pour aider operateur dans sont choix #ici on rentre dans la boucle active du programme ou daemon while test "1" == "1"; do # boucle principale du mode manuel et automatique ========================= firsterriptables="" # raz : code erreur iptables #on va calculer (plus loin) DEFA qui sera la commande operateur a utiliser par defaut #au cas ou il rentre une ligne de commande vide ! # en general DEFA sera # la commande C (de connection ) si ADSL actuel est arrete # la commande D (de deconnection) si ADSL actuel est actif # dans d'autre cas DEFA sera surplantee par OVERDEFAULT : OVERDEFAULT=""; #raz de overide default : variable intermediaire pour definir DEFA #si la commande executee PRECEDAMENT COM etait ... if test "$COM" == "s" || test "$COM" == "S" || # status test "$COM" == "r" || test "$COM" == "R" || # redemarrage test "$COM" == "v" || test "$COM" == "V" ; then # surveillance verification liaison en continus OVERDEFAULT="$COM"; #alors en cas de defaut reponse on reconduit la meme commande dans overide #donc on sugere a operateur de refair le meme commande fi; #la prochaine commande a executer sera contenue dans com # ( le parmetre appel du programme tiend lieu de 1ere commande implicite automatique # ensuite a chaque boucle para est determine par le programme ou l'operateur ) COM="$PARA"; #reponse operateur simule : argument commande du programme (si toujour en automatique) # COM contiend maintenant la commande SUIVANTE a execute ( ou vide ) (PARA sera remis a zero ou recalcule) if test "$COM" == ""; then #no parametre : alors on est en mode interactif => avec interrogation operateur #puisque la commande a faire est inconuue => on interrogera l'operateur !!! # pour instant : on calcule la commande par defaut a propposer a operateur : #defa sera la commande executer par defaut si l'operateur entre une ligne vide DEFA="c"; # choix par default ( si commande tappee par operateur reste vide ) : demande de Connexion # sauf si overidedefault precedant est possitionne !!! #pour instant : on afficher et tester LA connection adsl standard pour gerrer le flip flop DEFA C D # si l'adsl est trouve on propse laors d de deconect echo " === adsl ===== status \"$ADSLSSTATUS\" :"; $ADSLSSTATUS; #appel de ce prtogramme sous Linux TouTou donne code retour operationnel if test "$?" == "0"; then # si status est : deja connecte DEFA="d"; # alors choix par default ( si commande tappee reste vide ) : demande de Deconnection fi; # on viens de calculer DEFA qui est donc c ou d # qui va etre la prochaine commande par defaut; sauf si OVERDEFAULT est possitionne ; # OVERDEFAULT a etait calcule avec la commmande COM PRECEDANTE !!!! if test "$OVERDEFAULT" != ""; then #si overidedefault est possitionne il est prioritaire DEFA="$OVERDEFAULT"; #copier overide dans default ( s r v ) fi; #afficher le menu propose a operateur # ( avec l'option par defaut calculee : si il ne tappe rien ) echo "Action : Q : arret immediat, S ou T : Afficher les status (consulter compteurs ...), ( A completer par : /root/Web-Server/stat/statiptables ) C : Connecter l'adsl ppp courant & reprogrammer le systeme reseaux & S, D : Deconnecter l'adsl ppp courant[ou N] & reprogrammer le systeme reseaux & S, R : Reconnecter l'adsl ppp courant & reprogrammer le systeme reseaux & S, H Z L F (ni V ni S ni T) : Ne pas toucher a l'adsl & reprogrammer le systeme reseaux & S, Z L F -> iptables LOG status : \"$IFLOG\" R ou T : mettre a l'heure le syteme, (ni V ni S) : mettre a jour animation graphique antenne, Bind sera relancer ou demmare en cas de connection adsl ou de mise a l'heure V ou R : Verifier surveiller la liaison et si defaut Reconnecter adls (R) : voir Arreter-Redemarer onduleur ( En cas de tres long transferts : FTP ... ; on peut desactiver V ou R pour eviter la coupure par un defaut de reponse du ping ! ) ( Controle derive date :"; #echo -n " ";rdate -p ntpserv ; echo -n " ";rdate -p ntpserv2 ; echo -n " ";rdate -p localhost; echo " ) "; # la commande H permet si on a demarrer ou arrete des adsl par une autre moyen # ou logiciel (ou si plusieurs adsl ...) # d'adapter le reseaux a la nouvelle configuration courante echo -n " Votre choix (defaut : \"$DEFA\") :"; read COM; #attendre la reponse operateur if test "$COM" == "" ;then # si reponse est ligne vide COM="$DEFA"; # alors reponse = choix par default (ou overide) fi; #afficher a ecran operateur RC et le choix fait efectivement echo " $COM "; sleep 1; #pour laisser afficher le "choix" retenu a ecran #DEFA n'est pa defini en dehors de ce if ! fi; # fin de si interrogation operateur en mode manuel #---------------------------------------------------------------------------- # ici on connais la commande a executer : le choix de operateur ou calcule par programme en automatique #---------------------------------------------------------------------------- FCOM="`expr substr "$COM" 1 1`"; #le premier caractere de la commande RCOM="`expr substr "$COM" 2 100`"; #le reste relancerbind=''; # flag de relance de bind :ne pas relancer bind FAIT=""; #raz du resume historique des actions que le progamme a essaye de faire sur le systeme if test "$COM" == "q" || test "$COM" == "Q"; then break; fi; #le choix est : sortie boucle demandee : arret programme #---------------------------------------------------------------------------- # la reprogrammation du systeme reseaux depend # de la configuration detecte dans les ifconfig qui precede (DEFA)... # ou de la commande choisie .... PROG=""; #flag de raz de reprogrammer : le reseaux, ces fichier, le controle des acces ..... #si la commande a effectu modifis la programmation reseaux ou internet : if test "$COM" != "s" && test "$COM" != "S" && # n'est pas une commande de status test "$COM" != "v" && test "$COM" != "V" && # ni n'est pas une commande de surveillance internet test "$COM" != "t" && test "$COM" != "T" ; then # ni n'est pas une commande de mise a l'heure PROG="$COM"; #alors il va falloir reprogrammer les ip tables , les routes , etc ... (tous le reseaux ip) fi; # la variable PROG servira a reprogrammer le routeur parefeux apres avoir gere si apres les adsl : #Gestion 1er ADSL par les commande standar de la distribution (lie au pid) #---------------------------------------------------------------------------- # stop : deconnection et relance if test "$FCOM" == "d" || test "$FCOM" == "D" || test "$FCOM" == "r"|| test "$FCOM" == "R"; then #choix Deconnection[n] ou Relance[n] echo " -- Deconnection adsl \"$ADSLSSTOP\" : " ; err=''; $ADSLSSTOP $RCOM; #voir parametrage os debut programme err="$?"; if test "$err" != '0'; then err=" Erreur $err"; echo -e " Arret de adsl $RCOM $err \a\a\a\a"; else err=''; fi; STARTED="ADSL $RCOM STOPE LE `date -u` $err"; #heure arret #parametre supplementaire pour dessigner ppp X fi; #---------------------------------------------------------------------------- # start : connection et relance if test "$COM" == "c" || test "$COM" == "C" || test "$FCOM" == "r"|| test "$FCOM" == "R"; then #choix Relance[n] ou Connection echo " -- RQ en cas de probleme de connexion si apres, tapper la commande \" pppoe -A -I $carteinterfadsl \" pour savoir si les concentrateurs repondent (apres avoir verifier etat de connexion du wimax \" http://alpha/barrewimax.gif \" ) . la commande \"C\" est identique a \"c\"; mais en mode DEBUG !"; # changer adresse mac la carte pour faire plaisir a certain fai (optionnel) ( unset AdMacHeter; #pour garder la meme adresse mac . /etc/ppp/MyrefclientAlsa #fichier inclusion du fai courant ( fonction de RCOM dans le cas multi fai multi pppoe) # dans ce fichier on choisi un user et eventuellement # des parmetrage SPECIFQUES supllementaires NAME IP .... # necessaire a ce fai ou a cette liaison pppdX.... # certain fai (c'est pas le cas alsatis) on besoin de trouver comme adresse mac celle de leur box initiale # ( vus quelle n'y est plus, ca peut posser probleme ) # dans ce cas la, dans le fichier include de ce fai, il suffit de definir # la variable AdMacHeter avec adresse mac de la box a cloner : # AdMacHeter="XX:YY:ZZ:XX:YY:ZZ"; if test "$AdMacHeter" != ''; then #si ce fai a besoin d'un clone mac precis ! echo " -- Changer adresse mac de la carte pour faire plaisir au FAI : \"$AdMacHeter\""; $IFCONFIG $carteinterfadsl hw eth $AdMacHeter ; rep="$?"; if test "$rep" != '0'; then echo -e " -- Changement mac erreur $rep \a\a\a\a"; fi; #cela modifi les cookis identifications envoyes par les concentrateurs : pppoe -A -T 5 -I $carteinterfadsl fi; ) echo " -- Connection adsl \"$ADSLSTART\": " ; unset DEBUG; #effacer variable de environnement KOKKKKK #modfifier la variable DEBUG en fonction de com=="C" if test "$COM" == "C"; then #le C maguscule ne peut etre mis que en manuel echo " Commande \"$COM\" : En mode DEBUG : ( le fichier de trace est dans /tmp/pppoe-debug- ) mais ATTENTION, alors, on peut ne pas sortie du script !!! en cas echec tester les concentrateurs : pppoe -A -T 5 -I $carteinterfadsl"; export DEBUG=1; fi; $ADSLSTART; #voir parametrage os debut programme err="$?"; if test "$err" != '0'; then err="Erreur $err"; echo -e " Demarraget de adsl $err \a\a\a\a"; else err=''; fi; unset DEBUG; #effacer variable de environnement KOKKKKK STARTED="ADSL DEMARRE LE `date -u` $err"; #heure demarrage FAIT="$FAIT DEMARRAGE_ADSL $err : "; #implementation historique de ectte commande relancerbind='C'; #relancer bind pour motif Connection echo $STARTED >>$startedlogfile; # historique des redemarrage fi; #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- # a partir d'ici on a une serie d'action de la forme # si QQ CHOSE re programmer ce qq chose fin si # mais toujour afficher etat de ce qq chose apres (status) .... #---------------------------------------------------------------------------- if test "$PROG" != ""; then # reprogrammer la configuration resaux FAIT="$FAIT REPROGRAMMATION_SYSTEME_RESEAUX"; #mise a jour resume des actions echo " === chargement des modules reseaux :"; # inspirer tres directement des scripts TouTou Linux #charge dans le kernel les modules necessaire si pas dejat fait #etablir la liste des modules utiles : REQUIRED_MODULES="ip_tables ip_conntrack ipt_state iptable_filter ip_conntrack_irc ip_conntrack_ftp"; REQUIRED_MODULES="$REQUIRED_MODULES ipt_REJECT"; REQUIRED_MODULES="$REQUIRED_MODULES ipt_LOG ipt_limit"; #not util ??? KOKK REQUIRED_MODULES="$REQUIRED_MODULES iptable_nat ip_nat_irc ip_nat_ftp"; REQUIRED_MODULES="$REQUIRED_MODULES ipt_MASQUERADE"; REQUIRED_MODULES="$REQUIRED_MODULES iptable_mangle"; REQUIRED_MODULES="$REQUIRED_MODULES ipt_mark ipt_MARK"; #ipt_raw ?? REQUIRED_MODULES="$REQUIRED_MODULES ipt_TTL"; #not util ??? KOKKK #a ameliorer et a adapter a votre machine !!! # les modules *ftp servbent a faire aparaitre RELATED les connections data ftp # les modules *irc ... #not util ??? KOKK for MODULE in $REQUIRED_MODULES; do #charger les modules utiles calcules #BK v3.94 some of the module names may be old names, but are an alias to #the actual module name. for example ip_conntrack_ftp is now an alias to #nf_conntrack_ftp. modinfo can report the alias, but only after the module #is fetched from the zdrv file. The following modprobe -l only lists actual #module names not aliases. Fix: comment out the if... #if (( `modprobe -l | grep -c "$MODULE"` )); then echo " -- load module $MODULE :"; # modprobe $MODULE > /dev/null; 2>&1; modprobe $MODULE ; done # de toutes maniere si le module est deja charge : ca ne gene pas ! else # si commande status echo " === Afficher les modules presents : "; lsmod; #afficher etat actuel des modules charges fi; #---------------------------------------------------------------------------- # * ici on reprogramme eventuellement conntrack if test "$PROG" != ""; then # reprogrammer echo " === conntrack programmation : "; #general parametre : # $SYSCTL -w net.netfilter.nf_conntrack_tcp_timeout_established=43200; # timeout : un 1/2 jour au lieu de 5 # doit rester supperieur a # net.ipv4.tcp_keepalive_time ( 7200 default) # remis en service # voir $SYSCTL -a | grep conntrack # $SYSCTL -w net.netfilter.nf_conntrack_udp_timeout_stream=180; # $SYSCTL -w net.netfilter.nf_conntrack_udp_timeout=120; $SYSCTL -w net.netfilter.nf_conntrack_max=16376; #nombre de connections ouvertes simultanement # ( 128 Mo : 8192 entrées ) ( 256 Mo :16376 entrées ) (8 * la taille de la fonction de hachage) fi; # fin du cas : reprogrammer echo " === Etat conntrack : "; $SYSCTL -a | grep conntrack; # all : general et ipv4 echo " === Connections conntrack : faire un cat /proc/net/nf_conntrack ; "; # cat /proc/net/nf_conntrack ; #---------------------------------------------------------------------------- #--------------------------------------------- # TOUTES LES ADRESSE FIXE IP SONT CONNUES ! #--------------------------------------------- # les autres adresses ip publiques attribuees par les liason ppp dynamique # seront detectes automatiquement par ce programme ... # qui va donc alors en fonction retailler les iptables dynamiquement # on vas donc reprogrammer tous le syteme linux reseaux : #---------------------------------------------------------------------------- # * on reecrire tous les fichiers linux de configuration reseaux # /etc/hosts networks conf .... if test "$PROG" != ""; then # si reprogrammer a faire #mettre a jour le fichier (avec les adresse necessaires / pour fonctionner sans DNS) df="/etc/hosts"; #fichier echo " === Set files $df"; DAT="`date -u`"; echo " # fichier $df ecrit par $0 $DAT 127.0.0.1 localhost puppypc . $interfadsl interfadsl #ip de la carte eth connecte a adsl $alvarion alvarion #ip du modem ladsl dans le resaux de interfadsl $interfzero interfzero alpha #ip de la carte eth connecte au reseau zero 192.168.0.254 mulet # mulet culte : peut etre identique au precedant $rtzeroun rtzeroun imcp #ip adresse dans reseau zero du routeur vers le reseau un $rtzerodeux rtzerodeux #ip adresse dans reseau zero du routeur vers le reseau deux $rtzerotrois rtzerotrois #ip adresse dans reseau zero du routeur vers le reseau trois $rtwifiun rtwifiun #ip adresse dans reseau zero du routeur vers le reseau wifiun # ip a verifier de temps a autre : $ntpserv ntpserv #ip adresse externe : serveur ntp port 123 (mise a l'heure ntpdate ; avant bind start ou reload) $ntpserv2 ntpserv2 #ip adresse externe : serveur ntp port 123 (mise a l'heure ntpdate ; avant bind start ou reload) $virtual virtual #ip adresse externe : salle (dnat iptables) $virtualweb virtualweb #ip adresse externe : web (dnat iptables) # ici on peut avoir des pb si le dns n'a pas encore demarre # d'ou le cache adresse ip (a verifier de temps a autre) ! # 2 1 2 . 2 7 . 6 3 . 1 0 5 imcp.ba.free.fr #pb de dns " >$df; if test "$myipwhi" != ""; then # si adresse fixe connue l'ajouter echo "$myipwhi myipwhi # adresse pppoe fixe " >>$df; fi; #mettre a jour le fichier : df="/etc/networks"; #fichier echo " === Set files $df"; DAT="`date -u`"; echo " # fichier $df ecrit par $0 $DAT #les reseaux locaux : loopback 127.0.0.0 resadsl $resadsl #reseaux qui est connecte a modem adsl (mask : $maskinterfadsl) reszero $reszero #reseau intranet dorsal : reseau zero (mask : $maskinterfzero) #sous reseaux du dorsal zero : resun $resun # (mask : $maskresun) resdeux $resdeux # (mask : $maskresdeux) restrois $restrois # (mask : $maskrestrois) reswifiun $reswifiun # (mask : $maskreswifiun) resautonome $resautonome #global constitue du zero et de ses sous reseaux (mask : $maskresautonome) # (adsl peut ne pas y etre !) " >$df; #mettre a jour le fichier : df="/etc/host.conf"; #fichier echo " === Set files $df"; DAT="`date -u`"; echo " # fichier $df ecrit par $0 $DAT order hosts, bind multi on " >$df; #mettre a jour le fichier : df="/etc/resolv.conf"; #fichier echo " === Set files $df"; DAT="`date -u`"; echo " # fichier $df ecrit par $0 $DAT ####search domainadefinir sub2.domainadefinir hotspot.domainadefinir # les noms de domaines si-dessus peuvent ralantir les recherche en erreur des client locaux ! ## on les a donc temporairement ellimines ! #### nameserver 127.0.0.1 # cette machine a bind9 en dns cache #nameserver 208.67.222.2 #machine mondiale # RQ pour mettre temporairement en servcices les dns proposes par le FAI # modiflier se fichier commme suit : # cp /etc/ppp/resolv.conf $df " >$df; if test "$BOXALSA" != ''; then echo " # fichier $df ecrit par $0 $DAT nameserver 37.1.254.3 #alsatis nameserver 37.1.254.4 #alsatis " >$df; fi; fi; # fin du cas : reprogrammer echo " === Afficher les files : "; cat /etc/hosts /etc/networks /etc/host.conf /etc/resolv.conf; #fichierb afficher etat actuel dans tous les cas #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- # * on remet en place pour les carte interface reseaux connues , les routes par defaut : if test "$PROG" != ""; then # reprogrammer echo " === Programmer et mettre en route les interfaces eth : Ifconfig ..."; $IFCONFIG lo localhost up; #pourqoui pas !!! $IFCONFIG $carteinterfzero interfzero netmask $maskinterfzero up; $IFCONFIG $carteinterfadsl interfadsl netmask $maskinterfadsl up; #les ifconfig ppp son mise en place par les demon ppp (avant ou apres) !!!! fi; # fin du cas : reprogrammer echo " === Afficher les Ifconfig : "; $IFCONFIG; #afficher etat actuel #---------------------------------------------------------------------------- if test "$PROG" != ""; then # reprogrammer les routes meme si deja fait echo " === Mise en place des routes :"; $ROUTE add -net 127.0.0.0 netmask 255.0.0.0 lo; #route locale $ROUTE add -net $reszero netmask $maskinterfzero $carteinterfzero; # reseaux general zero federal $ROUTE add -net $resun netmask $maskresun gw rtzeroun ; #sous reseaux un par routeur dedie zero $ROUTE add -net $resdeux netmask $maskresdeux gw rtzerodeux ; #sous reseaux deux par routeur dedie zero $ROUTE add -net $restrois netmask $maskrestrois gw rtzerotrois ; #sous reseaux trois par routeur dedie zero $ROUTE add -net $reswifiun netmask $maskreswifiun gw rtwifiun ; #sous reseaux wifiun par routeur dedie zero $ROUTE add -net $resadsl netmask $maskinterfadsl $carteinterfadsl; #sous reseaux adsl if test "$BOXALSA" != ''; then $ROUTE add -net 0 netmask 0 gw 192.168.12.1; #routeur box alsatis : mac 00:0E:08:22:42:E1 fi; #au passage noter que adresse 192.168.123.45 qui n'est pas definis dans les routes precedantes # il serait expedie par defaut a adsl ! # pour eviter ca (vus que cette machiene est elle meme son routeur par defaut) $ROUTE add -net $resautonome netmask $maskresautonome reject; # reject autre route locale # RQ : les routes ppp son mise en place par les demon ppp (avant ou apres) !!!! # voir appel par C D R des outils standar de la distribution # on ne s'en occupe pas directement ! # cependant, si apres, on affiche leur etats ... fi; # fin du cas : reprogrammer echo " === Afficher les routes : "; $ROUTE -n; #afficher etat actuel : tous periferique dans tous les cas #---------------------------------------------------------------------------- # * ici on reprogramme eventuellement les chaines iptables # Les iptables servent a prendre des decissions ou a agir sur les packet reseaux qui transite # Les iptables contiennent plusieurs tables separes : raw mangle nat filter # # Chaque regle de chaque tables sont regrouper a l'interieur de chaines standar : # # * PREROUTING : pour les paquets qui Entre par les cartes ethernet # Le paquet subit 1er routing et est dirige : # vers INPUT chaine si il est destine a la machine locale # ou vers FORWARD chaine ( si le routage est on ) # # * les paquets generes par la machine locale # passe dans la chaine specifique OUTPUT # si ils sont a destination locale ils sont envoyes a interface LO # (et devrais revenir a PREROUTING , INPUT bridge ... ) # sinon ils vont en sortie # # * tous les paquets sortant issue de OUTPUT non local et de FORWARD # passe dans la chaine POSTROUTING # # a l'interieur d'une chaine donne, l'ordre d'application des tables est toujour : # raw, mangle, nat, filter, (si la table correspondante est presente) # la commande ACCEPT n'est pas definitive : # elle permet seulement de sauter a la fin d'une regles (apres la police) # pour aller vers le controle de la chaine suivante # -------- # RQ : les iptables se situent environ au niveau 3 du protcole : IP ( route ) # similairement il existe au niveau 2 : Mac, les ebtaples ( bridge ) # qui ne sont pas pour le moment directement utilisees ici ! # http://$myipwhi/cgi-bin/ebtables.gif # # --------- # Dans ce programme # Sont mis en place un certain nombre de redirections # en fonction du port TCP ou UDP demandee # # Mais au prealable on dessire determiner # la liste des adresse IP oficielle de cette box if test "$PROG" != ""; then # si configuration a reprogrammer # apres avoir demmarrer ou arrete les adsl # on doit recuperrer les adresse ip externe internet utilisees par pppoe ppp # pour joindre cette box (adresse fixe ou aloue dynamiquement) echo " === Calcul des adresses a Dnater:"; # A priory tous les interfaces ppp permettent de rentrer dans la station # de maniere equivalentes egalitaire !!! listpppatester="ppp0 ppp1 ppp2 ppp3 ppp4 ppp5 ppp6 ppp7 ppp8 ppp9 ppp10 ppp1 ppp12 ppp13 ppp14"; #ppp a explorer (a priory tous) #PPP periferique adsl #on Dnate sur les adresses de destination entrante ; independament de la source . # # on Dnate sytematiquement les adresse "dite" fixe # ( meme si elle n'est pas encopre attache a un ppp actif, # ce qui permet machines du reseaux local, # d'utiliser ces adresse de destination inconditionellement !!! ) addanaterfixe=""; #liste add non negocie ou fixe toujour presente if test "$BOXALSA" == ''; then addanaterfixe="$addanaterfixe $myipwhi "; #add non negocie ou fixe, toujour presente : #suivie d'un blanc de separation #sous forme numerique !!! fi; #On dnate de plus les adresse pppoe courantes supplementaires fournie par les liaisons ppp: addsuplementaire=""; #adresse suplementaires : ici est vide for ppp in $listpppatester; do #boucle d'interrogation des perif ppp #extraire adresse officielle attribue a ppp (champ inet addr: )(si ON !!!) adext="`$IFCONFIG $ppp |grep \"inet addr\" | sed -e \"s/.*inet addr://\" | sed -e \"s/ .*//\" `" ; #IFCONFIG #rq ; verifier que adresse ip externe legale attribue apparaitre dans le ifconfig PPP #comme adresse proximale locale (a gauche) ! # l'autre la distale ' P-t-P:' (de la forme 10.16.xx) ne conncerne que : le FAI ?, # et n'a aucune utilitee locale ! name="${ppp}_proximal"; #tableau creer par composition prefix suffix export "`echo -n ${name}=${adext};`"; # composite echo " valeur de ${name} est \"`eval echo -n \\$${name}`\""; #use for contr in $addanaterfixe $addsuplementaire; do #explorer liste adresse deja identifie if test "$contr" == "$adext"; then #test si deja connue, dans fixe , sous forme numerique adext=""; #deja vue : annuler ; ce n'est pas une adresse supplementaire break; # boucle interne : fin comparaison fi; done; addsuplementaire="$addsuplementaire $adext"; #ajouter l add nouvelle et inconnue (ou rien) done ; #fin de recherche sur les perif ppp # on affiche une synthese des adresses ip supplementaires echo " Adresses Box fixe a Dnater \"$addanaterfixe\" "; echo " Adresses a Dnater Dynamique supplementaires ppp+ : \"$addsuplementaire\" "; # typiquement si on a lancer AVANT, ailleur, par exemple un vieux modem rtc # on doit reactiver cette partie du programme (commande h) # maintenant que l'on connais toutes les adresse ip, reste a fair cohabiter tous cela #en utilisant les iptable : # le deuxieme gros morceaux de la programmation arrive # mise au point syntaxie : chaine table regles # c'est un peut la pannique ! # chaine : suite logique de truc de meme type dans un Ordre donne (sequentiel vertical) # # -table : rgroupement de truc par convenance (classificationn horizontale par type) # les tables sont designe par option -t nom_de_table # les nom_de_tables sont : raw, mangle, nat ,filter # et son dessignee dans la commande par -t # # la chaine est dessignee par option -P nom_de_chaine # les nom_de_chaine standard sont : # PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING # utilisateur peut creer des chaine nommes supplementaire # Mais toujours a interieur d'une table donnee ! # # les chaines sont donc organisees en un tableau bidimentionnel # Nom_de_tables , Nom_de_chaines # mais toutes les casses du tableau ne sont pas possibles : # par exemple (filter, PREROUTING) n'existe pas # # une chaine est constitue d'une suite de regles [optionelles] # elle se termine par la regle obligatoire police (option -P) # qui en dernier recours desside de ce que l'on doit faire du packet # ci les regles precedante de la chaine n'on rien desside # # une chaine de regles peut contenir comme regles un # appel a une chaine nomee untilisateur (appel de sous programme). # si cette chaine la ne prends pas de decission elle peut rendre la main # a tous moment par l'action RETURN, la chaine appelante qui continus alors # sur la regles suivant (retour de sous programme) # RQ : la police implicite d'une chaine nomme utilisateur est RETURN # # Lo |-------------------<-------------------------| # | | # -------------- | --------- ---------- | # ->-| R M dN |---?------->--| M F |-------?---->--| M sN |--->- # -------------- | --------- | ---------- # Prerouting | Forward | Postrouting # | | # ---- ---- # | M | | F | # ---- ---- # Input | F | |dN | Output # ---- ---- # | | M | # | ---- # | | R | # -->- ---- # | # -->--| # # la table R raw est aux entrees du syteme : Prerouting output # (elle sert principalement a tracer ou pas le trafic coontrack) # La table Mangle est presente partout # la table Nat Destination est au entrees : Prerouting output # la table Nat source est a la sortie : Postrouting # la table filter est presente aux chaines historiques de routage : Input Forward Output # # RQ : dans ce programme DROP REJECT ne sont utilises que dans les chaines # filter ( INPUT FORWARD OUTPUT) !!!! # -F vider ; -X supprimer les chaine nome de utilisateur; -P police ; -A regle ajouter # CONFIGURTION DE PARAMETRAGE DES IP TABLES : # GESTION DES LOG # La variables IFLOG est initialisee par defaut en dehors de la boucle de commande # on peut la changer glaoblement par les commande specifique suivante : if test "$COM" == "Z" || test "$COM" == "z" ; then IFLOG=''; fi; if test "$COM" == "L" || test "$COM" == "l" ; then IFLOG='l LOG'; fi; if test "$COM" == "F" || test "$COM" == "f" ; then IFLOG='f full'; fi; # quand les log sont utilise chaque regle de log est individuellement limite # du fait que tous les message ne sont pas en log # chaque regle de log est imediatement suivis d'une autre regle ( Macro ) # qui reprends les meme critere de filtre avec un compteur simple (ou un drop ou un reject ...) LIM='-m limit --limit 2/min --limit-burst 10'; #option de la commande LOG pour limiter les records dans les log # /second, /minute, /hour et /day. # --limit-burst reserve initiale & max (default 5 : une raffale de 5) # --limit 3/h default 3/H # ( toutes les 20 minutes sans correespondance incrementer rserve ) # on fait suivre les regles LOG # par une autre identique sans LOG pour gerrer le compteur # et ajouter drop ou reject ou rien # port # 22 ssh // normalement pas sur forward 2122 2222 2322 # 23 2123 2223 2323 telnet 10000 10001 10002 son # 25 smtp # 37 date # 53 dns # 514 syslog # 953 rndc 127.0.0.0 # 80 8080 8180 8280 8380 http 8888 8887 8886 9999 portail #vpn 53, 80, 110, 123, 443, 1194, 8080, 9201 LIM_TEL='-m limit --limit 4/min --limit-burst 10' ; #en input LISTTEL='23 10000 10001 10002'; # port telnet a limiter LIM_SSH='-m limit --limit 1/min --limit-burst 4' ; #en input LIM_SMTP='-m limit --limit 2/min --limit-burst 10'; #en input 25 pour drop LIM_DNS='-m limit --limit 10/sec --limit-burst 200'; #en input 53 pour drop LIM_HTTP='-m limit --limit 10/sec --limit-burst 100'; #limite http LISTHTTP='80 #8080 8180 8280 8380 8888 8887 8886 9999'; #port http a limiter LIMGENERAL='-m limit --limit 2/min --limit-burst 20'; #limite au connexion standard input (vers interdiction) ##### LIMFORWARD='-m limit --limit 6/sec --limit-burst 100'; #limite au connexion standard forward # dans filtre les limites sont donnees dans l'ordre des critaires # des plus specifiques vers les plus generaux # on a aparament des pb avec sip envoye semble il par le FAI sur pppX (special FAI) # ipsipppp* #sip pour ppp0 ppp1 ppp2 ... [ - reject] #LIstipsipppp=" -83.136.161.72 -83.136.162.72 -83.136.163.72 -83.136.164.72 -83.136.165.72 -83.136.166.72 -83.136.167.72 -83.136.168.72 -83.136.169.72 " LIstipsipppp=" 83.136.161.72 83.136.162.72 83.136.163.72 83.136.164.72 83.136.165.72 83.136.166.72 83.136.167.72 83.136.168.72 83.136.169.72 " # port 8060 -> 5060 ud sip # IP SPECIALES A SURVEILLER LISTIPSPECIAL="37.1.254.3 37.1.254.4 #60.210.10.28 196.200.44.41 "; # LOG TEMPORAIRE (special FAI) (- ) #liste des ip speciales a loger en entre et en sortie # certaines ip sont a surveiller # on les traces LOG tous protocoles # sur toutes les entres et sorties de INPUT FORWARD OUTPUT # soit a 4 endrois differents # LOG_SPECIAL_XXXXXX # IP SOURCE NE POUVANT FAIRE QUE DES DEMANDES DE CONNECTION DNS LISTDNSONLY="37.1.254.3 37.1.254.4 "; # DNS TEMPORAIRE (special FAI) (- REJ) #LISTE DES NE POUVANT ACCEDER QUE EN CONNECTION AU SERVICE DNS LIM_SPONLY_DNS='-m limit --limit 2/sec --limit-burst 40'; #en input 53 pour drop # et on interdi les autres demande de connection # voir aussi (plus loin) : # listipspam # listportsource # listportinputall # listportinputprohibed (si pas DMZ lo) # ADRESSE MAC DU ROUTEUR WIFI MacBullet='00:15:6D:AE:C7:A6'; #routeur dedie entre du reseau wifi # voir aussi (plus loin) : # listportwificontrol (pour isoler les wifi non connecte ) # NATESITUPEUX la chaine de redirection generale des adresse box legale statconnected='RELATED,ESTABLISHED'; # `$SYSCTL -a | grep net.ipv4.ip_local_port_range` ########################################################################################### # FILTRAGE ########################################################################################### echo " === Supression et reecriture des regles table filter : "; # SECT CALLIPTABLES -t filter -F; CALLIPTABLES -t filter -X; # -F vider ; -X supprimer ; -P police # cette tables comme son nom indique est fait pour filtrer, elle n'a que 3 chaines standars CALLIPTABLES -t filter -P INPUT DROP ; # choix par defaut * !!!!!!!!!!!!!!! doit rester a zero ou ne pas evoluer ! CALLIPTABLES -t filter -P FORWARD DROP; # chois par defaut * !!!!!!!!!!!!!!! doit rester a zero ou ne pas evoluer ! CALLIPTABLES -t filter -P OUTPUT ACCEPT; # par defaut identique a entre # que des LOG dans la chaine OUTPUT pas de reject ou drop ou accept ###################### # Entre la raz des regles de filtrage # et la programmation effective des regles qui les constitus, # il reste une possibilitee attaque theorique de courte duree ! # C'est pour cela que les tables filter INPUT et FORWARD # sont en police DROP des leur creation ! # Chaqune de ces deux police est precede par une regle drop redondante # si ces police sont non nulle c'est quelle se sont incremmente # durant la reprogrammation ! # Car Cette programmation des iptables peut se refaire a la volle # (commande H) durant le fonctionnement du reseau # de maniere asynchrone et 'presque' transparente pour utilisateur deja connecte (sauf wifi) # ce qui permet ajouter un autre adsl sans deconnecte les clients precedants # * pendant cette phase transitoire on peut perdre qq paquet (decteter par police) # sinon on devrais admettre la possibilee d'une attaque tres courtes # ces choix !!!!! sont valables sur input et forward de manieres independantes ! ################################# #crere un prefilter pour controle protocole echo " Creation d'une chaine nommee intermediaire FILTERPROTO :"; # SECT # utilisable dans FILTEREPPPIN (SANS ACCEPT) CALLIPTABLES -t filter -N FILTERPROTO; #liste des protocoles autorises CALLIPTABLES -t filter -A FILTERPROTO -p 17 -j RETURN -m comment --comment "compt_PROTO_UDP_VAL" ; CALLIPTABLES -t filter -A FILTERPROTO -p 6 -j RETURN -m comment --comment "compt_PROTO_TCP_VAL" ; CALLIPTABLES -t filter -A FILTERPROTO -p 1 -j RETURN -m comment --comment "compt_PROTO_ICMP_VAL" ; #on ne peut pas mettre une liste de protocole : , , , , sous list #LOG inconnu proto et DROP MACROLOGSITUPEUX LOG_PROTO_DROP_?_ -t filter -A FILTERPROTO ; # LOG # SECT # # ################################## ############################################################################### # DEBUT FILTEREPPPIN (prefiltre elliminatoire) (INPUT et FORWARD) # ce situ apres apres NAT destination : # la destination peut avoir etait change en DNAT (prerouting) # et on ne la teste pas dans cette chaine # # la source peut etre : eth+ , ppp+ , ou LO # dans le cas LO il peut y avoir # un Snat precedant (postrouting) ; # hors LO la source est inchange ! # il existe une symetrie de fait entre les chaines de filtrage NPUT et FORWARD # on la concentre dans FILTEREPPPIN echo " Creation d'une chaine nommee intermediaire FILTEREPPPIN :"; # utilisable dans input et forward (SANS ACCEPT) SECT CALLIPTABLES -t filter -N FILTEREPPPIN; #creation -N chaine nommee, utilisable plusieurs fois DROP LOG REJECT only # la commande -A agoute une regle apres les autres #controler les protocoles de PPP CALLIPTABLES -t filter -A FILTEREPPPIN -i ppp+ -j FILTERPROTO -m comment --comment "compt_PROTO_PPP_?" ; CALLIPTABLES -t filter -A FILTEREPPPIN -i ppp+ -m comment --comment "compt_PROTO_PPP_VAL" ; #controler les protocoles de ETH CALLIPTABLES -t filter -A FILTEREPPPIN -i eth+ -j FILTERPROTO -m comment --comment "compt_PROTO_ETH_?" ; CALLIPTABLES -t filter -A FILTEREPPPIN -i eth+ -m comment --comment "compt_PROTO_ETH_VAL" ; #loopback n'est pas controle ############ echo " Tracer sans bloquer les entrees de certains ip speciales externes : $LISTIPSPECIAL "; # SECT suivis log special (tous perif meme LO) for ipspec in $LISTIPSPECIAL; do # LOG if test "`expr substr "$ipspec" 1 1`" != '#'; then #if no start by comment flag if test "`expr substr "$ipspec" 1 1`" == '-'; then # no effect ipspec="`expr substr "$ipspec" 2 100`"; # elliminer le - fi; MACROLOGSITUPEUX LOG_entre_SPECIAL_ -t filter -A FILTEREPPPIN -s $ipspec ; #independant du periferique fi; done; ############ echo " Tracer Full sans bloquer les entrees ppp+ directement a destination de 127 192 : revers nat ou ?"; # SECT ??? TEMPO # Normalement on ne teset pas la destination car elle peut avoir etait change dans prerout ou revers # ici on s'interesse au perifi marque input ppp+ ( ce qui devrais etre eliminer eth+ et LO ) # la destination vers interne doit etre dnate ( sinon ele est native (ackeur externe ?) erreur ?) # on ne fait que tracer pour infoirmer on ne la bloque pas ! # la source pourrais ele aussi avoir etait change # par un revers Dnat (mais on a pas acces a cette info dans filter) if test "${IFLOG/full}" != "$IFLOG" =; then # contiend le mot full # retour de nat CALLIPTABLES -t filter -A FILTEREPPPIN -i ppp+ -d $resautonome/$maskresautonome $LIM -j LOG --log-level info --log-prefix LOG_PPP_Vers_Local_entre_?_; #si dnat fi; CALLIPTABLES -t filter -A FILTEREPPPIN -i ppp+ -d $resautonome/$maskresautonome -m comment --comment "compt_LOG_full_PPP_Vers_Local_entre_?_" ; if test "${IFLOG/full}" != "$IFLOG" =; then # contiend le mot full # retour de nat # LOG CALLIPTABLES -t filter -A FILTEREPPPIN -i ppp+ -d 127.00.00.00/255.00.00.00 $LIM -j LOG --log-level info --log-prefix LOG_PPP_Vers_Local_entre_?_; #si dnat fi; CALLIPTABLES -t filter -A FILTEREPPPIN -i ppp+ -d 127.00.00.00/255.00.00.00 -m comment --comment "compt_LOG_full_PPP_Vers_Local_entre_?_" ; #les sorties masque sont de retour (par prerout) et apparaissent si dessus voir marquage DNAT # le pb c'est qu 'on ne sait pas si c'est pas une attaque ???? voir marquage DNAT et contrack ############ ################################# #crere un prefilter pour les envois du bullet echo " Creation d'une chaine nommee intermediaire FILTERBULLET :"; # SECT # utilisable dans FILTEREPPPIN (input et forward) (SANS ACCEPT) CALLIPTABLES -t filter -N FILTERBULLET; # MACROLOGSITUPEUX LOG_BULLET_DROP_PROTCOL_?_ -t filter -A FILTERBULLET ! -p 1,6,17 ; # LOG # SECT # #on ne peut pas mettre une liste de protocole #faire une sous liste CALLIPTABLES -t filter -A FILTERBULLET -s $rtwifiun -j RETURN ; CALLIPTABLES -t filter -A FILTERBULLET -s $reswifiun/$maskreswifiun -j RETURN ; MACROLOGSITUPEUX LOG_BULLET_IP_SPACK_DROP_ -t filter -A FILTERBULLET; # LOG et DROP ? # SECT # # MACROLOGSITUPEUX LOG_BULLET_IP_ROUTE_EXTERNE_ -t filter -A FILTERBULLET; # LOG san drop ? # SECT # #le choix precedant est pour savoir : si on autorise le wifi a ROUTERr des ip qq (sans drop) # SECT # #ou pas (et eviter des ackeur wifi) # quoi qu'il en soit si il y a du source 127 il sera rejette plus loin si apres dans LOG_DROP_SPACK_INTERNE_ # ################################## #appeler la regle FILTERBULLET a chaque envois du bullet sur eth # SECT CALLIPTABLES -t filter -A FILTEREPPPIN -i eth+ -m mac --mac-source $MacBullet -j FILTERBULLET -m comment --comment "compt_ENVOIS_BULLET" ; # pour verifies que de bullet ne remonte que des ip sources autorisees 192.168.0.140 192.168.1.xxx # cependant un autre periferique de la dmz pourrais imiter le bullet !!! # a faire aussi sur tous les routeurs de la dmz 0.131 11.XX 0.132 12.XX 0.133 13.XX KOKKKKKK ############ echo "LOG de tous ce qui viends de interface adsl qui n'est pas Alvarion !!!!" ; # SECT #( voir filtre pour tous adsl en sous chaine : # retur si alvarion # retur si autre adsl # LOG police ) MACROLOGSITUPEUX LOG_PPP_non_encapsule_??_ -t filter -A FILTEREPPPIN -i $carteinterfadsl -s ! $alvarion ; #pas de drop reject pour le moment KOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK # pour la mise au point on doit pouvoir rempoorairement utilser TFTP sur 127 .... # tous les periferique adsl sont branches sur la meme carte etrnet au travers d'un hub #controler avec adresse mac si plusieurs adsl !!!!!!!!!!!!!!!! ############ #ici on rejecte les ip Source qui possent un probleme de connection specifique a un instant t : # on considere les ip source exacte (non revers Dnate) (; cependant on testera en outpout les memem ip) listipspam=''; #pourrais etre initialement lue dans environement ou des includes files dynamiques... # ajout local a la liste : #listipspam="$listipspam #87.106.149.152 #74.208.99.60 "; #listipspam="$listipspam #201.69.228.25 #216.238.20.66 "; #listipspam="$listipspam #80.82.64.68 #185.12.3.102 #181.136.93.129 #176.103.109.129 #80.82.70.198 #46.4.132.212 "; #atta443 webgroup son KOKKKKK #listipspam="$listipspam 168.70.37.125 104.27.176.216 70.199.105.6 2.220.107.41 "; #attaque de bind #listipspam="$listipspam 194.146.217.101 " #attaque de bind #listipspam="$listipspam 112.118.13.28 " #attaque de bind #listipspam="$listipspam 185.71.67.1" #attaque de bind ? pas encore en service ! # LE # devant ip la reautorise et la retire de fait de la liste interdiction listipspam='#85.25.74.18 #37.1.254.3 #37.1.254.4 60.210.10.28 '; #KOPKKKKKKKKKKKKKKKKKKKKKKKKKKKK INTERDIRE ? !!! listipspam="$listipspam $LIstipsipppp"; #ajout des entre specifiques sip #normalement si non connecte alors on fait drop (si caracter juste avant ip est - alors reject) # ###### NORMALEMENT LISTE VIDE ou # !!!!!!!!! echo " Log dans la chaine FILTEREPPP de certaines ip source de spam ou attaque ... et drop [ou -reject] si pas connected : $listipspam "; # # SECT INTERDIT si pas connection # RQ : listipspam va etre exploite a nouveau dans output pour mettre en LOG les memes mais en sorties * !!!! # le falg # en debut ip sert a la reautoriser for ips in $listipspam ; do # INTERDIT SI PAS CONNECTE if test "`expr substr "$ips" 1 1`" != '#'; then #if no start by comment flag action='-j DROP'; if test "`expr substr "$ips" 1 1`" == '-'; then # drop => reject ips="`expr substr "$ips" 2 100`"; # elliminer le - action='-j REJECT --reject-with icmp-admin-prohibited'; fi; MACROLOGSITUPEUX LOG_entre_DE_IP_SPAM_?_ -t filter -A FILTEREPPPIN -s $ips; #avec compteur global # si non connecte ( action : drop ou -reject ) CALLIPTABLES -t filter -A FILTEREPPPIN -s $ips -m state --state ! $statconnected $action -m comment --comment "compt_SPAM_ENTRE_NON_CONNECT" ; #else conecte (continuer) (compteur) CALLIPTABLES -t filter -A FILTEREPPPIN -s $ips -m comment --comment "compt_SPAM_ENTRE_CONNECT" ; #compteur $statconnected (si la demande viends d'ici *) fi; done; ############ # Quand la chaine FILTEREPPP est exploitee ( dans input et forward ) # les adresses sources ne sont pas encore snate ou maqueride # on peut donc les utiliser librement comme critaire de filtre # a ce stade on a fait aucun controle sur les port sources des demandeur (sauf wifi fait peralablement dans Bullet) # en fait on n'en tiends compte que dans conntrack # un utilisateur distant peut donc utiliser son port 80 pour se connectesur cette machine # et nous faire croire que c'est nous qui avont demande la connection # ( en fait se probleme est traite par conntrack en etat related ) # pour instant on se debarrase de qq port que l'on utilisera jammais nous meme # tel que 113 (authenification)se qui fait que si on demande se service par "inadevertance" # ou si le sous reseaux ou le wifi le demmande on ( on auras jammais de reponse ) # et le compteur de cette rgles vas alors bouger !!!! # on interdit que des reponse vers c'est Sport transite dans cette machine #( dans input et forward ) suite a une "demande externe" # de part ailleur on peut interdier ces meme ports en consultatio dport dans inpout !! ############ # Log et Reject dans la chaine FILTEREPPPIN (inpout & forward) de certains ports sources distants ... :"; # INTERDIT KOKKK TEMPORAIRE hors conntrack listportsource=''; listportsource="$listportsource #4444 #5555 #113 #443 -43175"; # attaque masquee INTERDIT TEMPORAIRE KOKKKKKKKKKKKKKKKKKKKKKKKKKk ## NORMALEMENT VIDE ###################################### echo " Log et Drop[-Reject] si non connecte) dans la chaine FILTEREPPPIN (inpout & forward) de certains ports sources bizzare distants non connecte ... : $listportsource"; # SECT # INTERDIT hors Connection # la destination peut avoir etait change ! (on teste etat connecte ou pas) # PQ listportsource est reprise dans output * for nsport in $listportsource; do # PORT SOURCE INTERDIT SI PAS CONNECTE FILTEREPPPIN (input forward) if test "`expr substr "$nsport" 1 1`" != '#'; then #if no start by comment flag # action='-j DROP'; if test "`expr substr "$nsport" 1 1`" == '-'; then # drop => reject nsport="`expr substr "$nsport" 2 100`"; # elliminer le - action='-j REJECT --reject-with icmp-admin-prohibited'; fi; MACROLOGSITUPEUX LOG_entre_DE_PORT_?_ -t filter -A FILTEREPPPIN -p udp --sport $nsport; #global compteur CALLIPTABLES -t filter -A FILTEREPPPIN -p udp --sport $nsport -m state --state ! $statconnected $action -m comment --comment "compt_PORT_SOURCE_BIZZARE_ENTREE_NON_CONNECT"; #else CALLIPTABLES -t filter -A FILTEREPPPIN -p udp --sport $nsport -m comment --comment "compt_PORT_SOURCE_BIZZARE_ENTREE_CONNECT" ; # compteur $statconnected * MACROLOGSITUPEUX LOG_entre_DE_PORT_?_ -t filter -A FILTEREPPPIN -p tcp --sport $nsport; #global compteur CALLIPTABLES -t filter -A FILTEREPPPIN -p tcp --sport $nsport -m state --state ! $statconnected $action -m comment --comment "compt_PORT_SOURCE_BIZZARE_ENTREE_NON_CONNECT"; #else CALLIPTABLES -t filter -A FILTEREPPPIN -p tcp --sport $nsport -m comment --comment "compt_PORT_SOURCE_BIZZARE_ENTREE_CONNECT" ; # compteur $statconnected * fi; done #la commande S permet de suivre les compteurs de ces ports a problemes ! #par contre le nat des port destination n'est pas encore fait # c'est port sources son interdit (dans input et forward ) # pour instant dans cette station on ne filtre presque rien (ou presque)!!!!! # les tables filtres arrive toujours apres nat !!! # de plus le snat du postrouting n'est pas encore fait ############ echo " LOG & DROP dans la chaine FILTEREPPP des ip sources PPP+ pretendue locale ... :"; # SECT utilisable dans input et forward #INTERDIT # virer les ackeurs qui se definissent comme des sources locales ???? # la source pourrais ele aussi avoir etait change par un revers Dnat !!!! : # on test que les -i ppp+ , et les eth++ MACROLOGSITUPEUX LOG_DROP_SPACK_EXTERN_ -t filter -A FILTEREPPPIN -i ppp+ -s $resautonome/$maskresautonome #PPP periferique adsl MACROLOGSITUPEUX LOG_DROP_SPACK_EXTERN_ -t filter -A FILTEREPPPIN -i ppp+ -s $resadsl/$maskinterfadsl; #PPP periferique adsl MACROLOGSITUPEUX LOG_DROP_SPACK_EXTERN_ -t filter -A FILTEREPPPIN -i ppp+ -s 127.00.00.00/255.00.00.00 ; # en provenance directe de dmz ou adsl MACROLOGSITUPEUX LOG_DROP_SPACK_INTERNE_ -t filter -A FILTEREPPPIN -i eth+ -s 127.00.00.00/255.00.00.00 ; # cette chaine est la que pour etre sur que extranet ne se fait pas passer pour un local #son appel sert aussi de compteur dans la commande S # ( on utilise drop plutot que reject, car on a pas vraiment adresse de retour ! ) # elle s'applique a tous les pppx en cours ou a venir ou eth+ autre machine # et on en trouve !!! # la sourcee pourrais etre un revers de dnat (on dnate vers exterieur ppp+ ou on fait un redierct LO) # si on recois sur ppp* un message qui n'est pas pour adresse ip de ppp* # on essaye le ROUTE normalement ! cette liste ne s'en occpue pas (forward) ... # FIN FILTEREPPPIN (chaine prefiltre utilise dans INPUT et FORWARD ) ######################################################################## echo " Chaine INPUT filtre : "; # SECT # on s'occupe ici de la chaine INPUT initialement vide # la commande -A agoute une regle apres les autres echo " Commencer par la regle FILTEREPPPIN"; # SECT CALLIPTABLES -t filter -A INPUT -j FILTEREPPPIN -m comment --comment "compt_INPUT" ; #controle adresse source # place en premier regle, l'appel sythematique de cette regle nomee sert aussi de compteur totalisateur # RQ : la regle FILTEREPPPIN n'a pas d'accept ! ############ # interdire dans input certains ports destination : $listportinputall "; listportinputall="-161 -631 -2082 -2083 -1645 -1646 -1812 -1813 "; #liste des ports destination a interdire pour TOUS dans INPUT : INTERDIT # 631 IPP printer # 161 protocole de gestion reseau # 2082 2083 cpanel radius? sec # 1646 1813 radius? accounting # 1645 1812 radius? identificatioon # peut etre mis sous la forme range port:port range echo " Interdire totalement dans input certains port de destination ( connecte ou pas )(-): $listportinputall "; # SECT for portw in $listportinputall; do if test "`expr substr "$portw" 1 1`" != '#'; then #if no start by comment flag # INTERDIT ALL ca='DROP'; #action if test "`expr substr "$portw" 1 1`" == '-'; then # drop => reject portw="`expr substr "$portw" 2 100`"; # elliminer le - ca='REJE'; fi; MACROLOGSITUPEUX LOG_INPUT_VERS_PORT_ALL_${ca}_ -t filter -A INPUT -p udp --dport $portw; MACROLOGSITUPEUX LOG_INPUT_VERS_PORT_ALL_${ca}_ -t filter -A INPUT -p tcp --dport $portw; fi; done ############ echo " Laisser passer certains sources Lo et DMZ (sans sous reseaux)"; # SECT # dangeureux; mais pour le PDM des pg de ack INTERNE !!! CALLIPTABLES -t filter -A INPUT -i lo -j ACCEPT -m comment --comment "compt_INPUT_LO_"; # looopback !!! C'EST UN MINIMUM # SECT #elle laisse passer les locaux et trusted (ppp -s 127 ou -s 192 deja viree dans filterppp !!!) #CALLIPTABLES -t filter -A INPUT -s 127.0.0.0/255.0.0.0 -j ACCEPT -m comment --comment "compt_INPUT_LO_DMZ_?_"; #local !!! nomalement deja dans lo CALLIPTABLES -t filter -A INPUT -i $carteinterfzero -s $reszero/$maskinterfzero -j ACCEPT -m comment --comment "compt_INPUT_ETH_DMZ_"; # DMZ dorsal avec routeurs et bullet !!! # les sous reseaux NON !!!! ?????????? #CALLIPTABLES -t filter -A INPUT -s $resun/$maskresun -j ACCEPT; #CALLIPTABLES -t filter -A INPUT -s $resdeux/$maskresdeux -j ACCEPT; #CALLIPTABLES -t filter -A INPUT -s $restrois/$maskrestrois -j ACCEPT; #CALLIPTABLES -t filter -A INPUT -s $resadsl/$maskinterfadsl -j ACCEPT; #alvarion res #whifi-net not trusted # LES LOCAUX & DMZ NE SONT PAS LIMITE EN DEBIT CONNECT INPUT ############ echo " Exception Autoriser certaines ip sources externes en ssh 22 "; # SECT #provisoire si en provenance d'une ip connue SSH possible KOKKKK #independant du periferique ??? MACROLOGSITUPEUX LOG_D_CONNECT_SSH_DE_VIRTUAL_ -t filter -A INPUT -p udp --dport 22 -s $virtual ; CALLIPTABLES -t filter -A INPUT -p udp --dport 22 -s $virtual $LIM_SSH -j ACCEPT -m comment --comment "compt_CONNECT_SSH_DE_VIRTUAL_VAL" ; MACROLOGSITUPEUX LOG_D_CONNECT_SSH_DE_VIRTUAL_ -t filter -A INPUT -p tcp --dport 22 -s $virtual ; CALLIPTABLES -t filter -A INPUT -p tcp --dport 22 -s $virtual $LIM_SSH -j ACCEPT -m comment --comment "compt_CONNECT_SSH_DE_VIRTUAL_VAL" ; ############ # Sinon Pour tous les AUTRES interdires les ports de destination local dans INPUT"; # INTERDIT listportinputprohibed="-631 -22 -113 -443 -514 -5060 -5061"; #liste des ports destination a interdire par defaut dans input INTERDIT # 631 IPP printer (deja fait) # 22 SSH de par ailleurs proteger par clef # 113 authentification # 443 https # 514 syslog pour bullet # 5060 sip # peut etre mis sous la forme range port:port range echo " Sinon Pour tous les AUTRES interdire dans INPUT les ports de destination local : $listportinputprohibed"; # SECT # INTERDIT #pour les autres elle interdit ( connecte ou pas ) : for portw in $listportinputprohibed; do if test "`expr substr "$portw" 1 1`" != '#'; then #if no start by comment flag # INTERDIT LISTE EXTENSION ca='DROP'; #action if test "`expr substr "$portw" 1 1`" == '-'; then # drop => reject portw="`expr substr "$portw" 2 100`"; # elliminer le - ca='REJE'; fi; MACROLOGSITUPEUX LOG_INPUT_VERS_PORT_IPI_${ca}_ -t filter -A INPUT -p udp --dport $portw ; MACROLOGSITUPEUX LOG_INPUT_VERS_PORT_IPI_${ca}_ -t filter -A INPUT -p tcp --dport $portw ; fi; done # 22 : ssh si ouvert ailleur, securise par certificat et clef delivre # par pki CA BLIb (c'est a dire le CA de la box libre elle meme) ############ echo " Droper certainnes demandes icmp"; # SECT MACROLOGSITUPEUX LOG_INPUT_ICMP_Redir_DROP_ -t filter -A INPUT -p icmp --icmp-type 5 ; MACROLOGSITUPEUX LOG_INPUT_ICMP_Dec_Rout_DROP_ -t filter -A INPUT -p icmp --icmp-type 9 ; MACROLOGSITUPEUX LOG_INPUT_ICMP_Dec_Rout_DROP_ -t filter -A INPUT -p icmp --icmp-type 10 ; echo " Autoriser les autres demandes icmp : compteur simple , sans log "; # SECT CALLIPTABLES -t filter -A INPUT -p icmp -j ACCEPT -m comment --comment "_INPUT_ICMP_NO_LIMIT_?"; # & compteur : a limiter KOKKK ???? ############ # ici placer contrack automate related,establised autoriser # si deja etablis passe !!!! echo " Autoriser les block correspondant a l'etat \"$statconnected\" : compteur simple , sans log "; # SECT # SI CONNECTION DEJA FAITE : ALORS ACCEPTER # SECT CALLIPTABLES -t filter -A INPUT -p all -m state --state $statconnected -j ACCEPT -m comment --comment "_CONNECT_NO_LIMIT_?"; # A PARTIR D'ICI ON EST DONC EN MODE NON CONNECTE # SECT ############ ############ echo " #LIMITE AUX DEMANDES DE CONNECTION A FAIRE ! (hors locaux et DMZ deja autorises)"; # SECT KOKKKKKKKKKKKKKK CALLIPTABLES -t filter -A INPUT -p all -m comment --comment "compt_DEM_CONNECT_DE_NON_PRIVILEGIE" ; #simple compteur ###### echo " ## on s'occupe dabord des ip : speciale , ackeur , etc"; # SECT echo " SPECIAL IP DNS ONLY : DNS connections LIMITEES ET AUTRE connections INTERDITES "; # SECT #faire une liste dns only = $LISTIPSPECIAL KOKKKKKKKKKKKKKKKKKK for ip in $LISTDNSONLY ; do #special ip if test "`expr substr "$ip" 1 1`" != '#'; then #if no start by comment flag # ca='DROP'; #action if test "`expr substr "$ip" 1 1`" == '-'; then # drop => reject ip="`expr substr "$ip" 2 100`"; # elliminer le - ca='REJE'; fi; #demande vers dns input CALLIPTABLES -t filter -A INPUT -p udp -s $ip --dport 53 $LIM_SPONLY_DNS -j ACCEPT; #LOG si hors limite MACROLOGSITUPEUX LOG_INPUT_SPONLY_DNS_HLIM_ -t filter -A INPUT -p udp -s $ip --dport 53 ; #HLIM => DROP #demande vers dns input CALLIPTABLES -t filter -A INPUT -p tcp -s $ip --dport 53 $LIM_SPONLY_DNS -j ACCEPT; #LOG si hors limit MACROLOGSITUPEUX LOG_INPUT_SPONLY_DNS_HLIM_ -t filter -A INPUT -p tcp -s $ip --dport 53 ; #HLIM => DROP # drop/reject all autre connexion type special input MACROLOGSITUPEUX LOG_INPUT_SPONLY_DNS_${ca}_ -t filter -A INPUT -p udp -s $ip ; #cette IP s'arret la en udp MACROLOGSITUPEUX LOG_INPUT_SPONLY_DNS_${ca}_ -t filter -A INPUT -p tcp -s $ip ; #cette IP s'arret la en tcp # (limite au nombre de demandes de connection) fi; done ######## echo " ## on ne s'occupe plus des ip sources mais simplement des services ports demandee :"; # SECT ###### on s'occupe maintenant des autres ip sources ###### (les ips speciale et ackeur on etait traite avant pour ne pas diminuer le credit des autres) ######## echo " LIMITE SPECIFIQUE DES CONNECTIONS TELNET :"; # SECT for pp in $LISTTEL ; do #telnet liste des ports if test "`expr substr "$pp" 1 1`" != '#'; then #if no start by comment flag # CALLIPTABLES -t filter -A INPUT -p udp --dport $pp $LIM_TEL -j ACCEPT -m comment --comment "compt_INPUT_CONNECT_TEL_VAL" ; MACROLOGSITUPEUX LOG_INPUT_TEL_HLIM_ -t filter -A INPUT -p udp --dport $pp ; #HLIM => DROP CALLIPTABLES -t filter -A INPUT -p tcp --dport $pp $LIM_TEL -j ACCEPT -m comment --comment "compt_INPUT_CONNECT_TEL_VAL" ; MACROLOGSITUPEUX LOG_INPUT_TEL_HLIM_ -t filter -A INPUT -p tcp --dport $pp ; #HLIM => DROP # (limite au nombre de demandes de connection) de par ailleurs hiawatha limite le debit par ip fi; done echo " LIMITE SPECIFIQUE DES CONNECTIONS SMTP :"; # SECT CALLIPTABLES -t filter -A INPUT -p udp --dport 25 $LIM_SMTP -j ACCEPT -m comment --comment "compt_INPUT_CONNECT_SMTP_VAL" ; MACROLOGSITUPEUX LOG_INPUT_SMTP_HLIM_ -t filter -A INPUT -p udp --dport 25 ; CALLIPTABLES -t filter -A INPUT -p tcp --dport 25 $LIM_SMTP -j ACCEPT -m comment --comment "compt_INPUT_CONNECT_SMTP_VAL" ; MACROLOGSITUPEUX LOG_INPUT_SMTP_HLIM_ -t filter -A INPUT -p tcp --dport 25 ; echo " LIMITE SPECIFIQUE DES CONNECTIONS DNS :"; # SECT CALLIPTABLES -t filter -A INPUT -p udp --dport 53 $LIM_DNS -j ACCEPT -m comment --comment "compt_INPUT_CONNECT_DNS_VAL" ; MACROLOGSITUPEUX LOG_INPUT_DNS_HLIM_ -t filter -A INPUT -p udp --dport 53 ; CALLIPTABLES -t filter -A INPUT -p tcp --dport 53 $LIM_DNS -j ACCEPT -m comment --comment "compt_INPUT_CONNECT_DNS_VAL" ; MACROLOGSITUPEUX LOG_INPUT_DNS_HLIM_ -t filter -A INPUT -p tcp --dport 53 ; echo " LIMITE SPECIFIQUE DES CONNECTIONS HTTP ( $LISTHTTP ) :"; # SECT for pp in $LISTHTTP ; do #http liste des ports if test "`expr substr "$pp" 1 1`" != '#'; then #if no start by comment flag # CALLIPTABLES -t filter -A INPUT -p udp --dport $pp $LIM_HTTP -j ACCEPT -m comment --comment "compt_INPUT_CONNECT_HTTP_VAL" ; MACROLOGSITUPEUX LOG_INPUT_HTTP_HLIM_ -t filter -A INPUT -p udp --dport $pp ; CALLIPTABLES -t filter -A INPUT -p tcp --dport $pp $LIM_HTTP -j ACCEPT -m comment --comment "compt_INPUT_CONNECT_HTTP_VAL" ; MACROLOGSITUPEUX LOG_INPUT_HTTP_HLIM_ -t filter -A INPUT -p tcp --dport $pp ; # (nombre de connections) de par ailleurs hiawatha limite le debit fi; done echo " LIMITE SPECIFIQUE DES AUTRES CONNECTIONS ( INPUT ) :"; # SECT #LIMITE DE CONNECTION GENERALE POUR TOUS LES AUTRES CAS # SECT # (sert a etendree la liste precedante plutot qu'a interdire directement ) # les cas prevus on etait mis en specifique pour ne pas diminuer le credit global des autres # LIMGENERA est donc tres faible (histoire de voir) # (c'est pas dit que derrier local accepte l'ouverture du port LISTEN ) #demande de connectio du cas general if test "${IFLOG/full}" != "$IFLOG" ; then # contiend le mot CALLIPTABLES -t filter -A INPUT -p all $LIM -j LOG --log-level info --log-prefix LOG_INPUT_AUTRE_DEM_CONNECT_ ; fi CALLIPTABLES -t filter -A INPUT -p all -m comment --comment "compt_LOG_full_INPUT_AUTRE_DEM_CONNECT"; #accorde CALLIPTABLES -t filter -A INPUT -p all $LIMGENERAL -j ACCEPT -m comment --comment "compt_PRESQUE_RIEN_VAL"; #quasi interdit !!!!! #hors limite drop MACROLOGSITUPEUX LOG_INPUT_GEN_HLIM_ -t filter -A INPUT -p all ; # DROP compteur de refus surcharge general input # port # 2122 2222 2322 ssh # 2123 2223 2323 # 22 ssh // normalement pas sur forward # 25 smtp # 37 date # 53 dns # 514 syslog # 953 rndc 127.0.0.0 # 8888 8887 8886 portai # 80 8080 8180 8280 8380 # 10000 10001 10002 son ## la police par defaut de INPUT est !!!!! qui devrais etre sythematiquement vide !!!! # RQ : on etait dans la chaines INPUT ( pas dans FORWARD ) (chaqun se debrouille !) ###################### echo " Chaine FORWARD filtre : "; # SECT echo " Commencer par la regle FILTEREPPPIN"; # SECT CALLIPTABLES -t filter -A FORWARD -j FILTEREPPPIN -m comment --comment "compt_FORWARD" ; #controle adresse source # place en premier regle, l'appel sythematique de cette regle sert aussi de compteur totalisateur ############ #### on traite ensuite les -?- pour observation (sans bloquer !!!) echo " Tracer les sorties forward de entree ppp+ de message a destination externes (peut etre un DNAT ou un Routage) "; # SECT# suivis log # pour tracer tous les pakets in pppp qui transitent temporaire KOKKKKK KOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK MACROLOGSITUPEUX LOG_FORWARD_IPPP_EXTERN_?_ -t filter -A FORWARD -i ppp+ -d ! $resautonome/$maskresautonome ; # simple compteur (ne pas bloquer) migrerer ? vers DROP si pas routage #ici on vois passer les coummunaication directement routees ou # celle qui reviennent apres nate entre utilisateur externe (natesitupeux virtualweb ....) ############ # pour tracer tous les pakets qui transitent wifi (pour observation) temporaire KOKKKKK #### MACROLOGSITUPEUX LOG_FORWARD_WIFI_DEST_ -t filter -A FORWARD -d $reswifiun/$maskreswifiun ; # simple compteur (ne pas bloquer) ############ echo " Tracer les sorties forward vers certains ip speciales destination externes : $LISTIPSPECIAL "; # SECT # suivis log special for ipspec in $LISTIPSPECIAL; do if test "`expr substr "$ipspec" 1 1`" != '#'; then #if no start by comment flag if test "`expr substr "$ipspec" 1 1`" == '-'; then # no effect ipspec="`expr substr "$ipspec" 2 100`"; # elliminer le - fi; MACROLOGSITUPEUX LOG_FOR_sortie_SPECIAL_ -t filter -A FORWARD -d $ipspec ; # simple compteur (ne pas bloquer) fi; done; ############ echo " Autoriser les block correspondant a l'etat \"$statconnected\" : compteur simple , sans log "; # SECT #SI CONNECTION DEJA ETABLIS : OK OK # SECT CALLIPTABLES -t filter -A FORWARD -p all -m state --state $statconnected -j ACCEPT -m comment --comment "compt_FORWARD_DEJA_CONNECT" ; #LIMITE AUX DEMANDES DE CONNECTION ! sur forward ??? # SECT #inserrer eventuellement ici des limites specifiques echo " LIMITE SPECIFIQUE DES AUTRES CONNECTIONS ( FORWARD ) :"; # SECT #general if test "${IFLOG/full}" != "$IFLOG" ; then # contiend le mot CALLIPTABLES -t filter -A FORWARD -p all $LIM -j LOG --log-level info --log-prefix LOG_FORWARD_AUT_DEM_CONNECT_ ; fi CALLIPTABLES -t filter -A FORWARD -p all -m comment --comment "compt_LOG_full_FORWARD_AUTRE_DEM_CONNECT"; # accorde CALLIPTABLES -t filter -A FORWARD -p all $LIMFORWARD -j ACCEPT -m comment --comment "compt_FORWARD_AUTRE_DEM_CONNECT_VAL"; #hors limite MACROLOGSITUPEUX LOG_FORWARD_GEN_HLIM_ -t filter -A FORWARD -p all ; # DROP; #compteur de refus surcharg # la police Forward n'est jammais atteinte !!!! doit rester vide !!! ###################### echo " Chaine OUTPUT filtre : "; # que des log de suspect (au cas ou cela viendrai d'ici)(pas de drop reject accept) # pas de test de la source ! ( Lo peut etre inverse nate !) # la terminaison des prefixe de ces log est : _OUTPUT_?_ # ON NE BLOQUE PAS OUTPUT ; ON MET SIMPLEMENT EN LOG : # SECT (voir compteur entre) CALLIPTABLES -t filter -A OUTPUT -m comment --comment "compt_OUTPUT_et_police"; #compteur d'entree !!!!!!!!!!!!!!! MACROLOGSITUPEUX LOG_OUTPUT_INVALID_?_ -t filter -A OUTPUT -p all -m state --state INVALID ; # WCP perdu ? on trouve de invalis port 8887 8886 # le prefixe de ces log est : _OUTPUT_?_ ############ echo " Tracer les OUTPUT a destination de certainnes ip speciales externes : $LISTIPSPECIAL "; # SECT # suivis log special for ipspec in $LISTIPSPECIAL; do if test "`expr substr "$ipspec" 1 1`" != '#'; then #if no start by comment flag if test "`expr substr "$ipspec" 1 1`" == '-'; then # no effect ipspec="`expr substr "$ipspec" 2 100`"; # elliminer le - fi; #tracer tous protocoles (meme icmp) les envois vers ces ip !!!!!! MACROLOGSITUPEUX LOG_OUTPUT_SPECIAL_?_ -t filter -A OUTPUT -d $ipspec; #pas de drop fi; done; ############ echo " Tracer les OUTPUT a destination de certainnes ip spam externes : $listipspam "; # SECT # INTERDIT => LOG suivis log # reprendres ici les interdiction spam de filtreppip (input) pour les tracer en log output for ipack in $listipspam; do # INTERDIT => LOG if test "`expr substr "$ipack" 1 1`" != '#'; then #if no start by comment flag # LOG if test "`expr substr "$ipack" 1 1`" == '-'; then # reject or drop ? no effect ipack="`expr substr "$ipack" 2 100`"; # elliminer le - fi; #tracer tous protocoles (meme icmp) les envois vers ces ip !!!!!! MACROLOGSITUPEUX LOG_OUTPUT_VERS_IP_SPAM_?_ -t filter -A OUTPUT -d $ipack; #pas de drop fi; done; ############ #reprendre ici les port sources externes interdits echo " Tracer les OUTPUT a destination de certains ports speciaux externes : $listportsource"; # SECT # INTERDIT => LOG suivis log special for nsport in $listportsource; do # INTERDIT => LOG if test "`expr substr "$nsport" 1 1`" != '#'; then #if no start by comment flag # LOG if test "`expr substr "$nsport" 1 1`" == '-'; then # no effect nsport="`expr substr "$nsport" 2 100`"; # elliminer le - fi; MACROLOGSITUPEUX LOG_OUTPUT_VERS_PORT_?_ -t filter -A OUTPUT -p udp --dport $nsport ; MACROLOGSITUPEUX LOG_OUTPUT_VERS_PORT_?_ -t filter -A OUTPUT -p tcp --dport $nsport ; fi; done; ############ #reperndre ici listportinputall: les ports locaux interdit (il manquerrrr all) AJOUT KOKKKK echo " Tracer les OUTPUT ayant certains ports source speciaux (interdie en INPUT destination port) : $listportinputall"; # SECT # INTERDIT => LOG suivis log special for nsport in $listportinputprohibed ; do # INTERDIT => LOG if test "`expr substr "$nsport" 1 1`" != '#'; then #if no start by comment flag # LOG if test "`expr substr "$nsport" 1 1`" == '-'; then # no effect nsport="`expr substr "$nsport" 2 100`"; # elliminer le - fi; MACROLOGSITUPEUX LOG_OUTPUT_DE_PORT_?_ -t filter -A OUTPUT -p udp --sport $nsport ; MACROLOGSITUPEUX LOG_OUTPUT_DE_PORT_?_ -t filter -A OUTPUT -p tcp --sport $nsport ; fi; done; ############ #reperndre ici listportinputprohibed : les ports locaux interdit echo " Tracer les OUTPUT ayant certains ports source speciaux (interdie en INPUT destination port) : $listportinputprohibed"; # SECT # INTERDIT => LOG suivis log special for nsport in $listportinputprohibed ; do # INTERDIT => LOG if test "`expr substr "$nsport" 1 1`" != '#'; then #if no start by comment flag # LOG if test "`expr substr "$nsport" 1 1`" == '-'; then # no effect nsport="`expr substr "$nsport" 2 100`"; # elliminer le - fi; MACROLOGSITUPEUX LOG_OUTPUT_DE_PORT_?_ -t filter -A OUTPUT -p udp --sport $nsport ; MACROLOGSITUPEUX LOG_OUTPUT_DE_PORT_?_ -t filter -A OUTPUT -p tcp --sport $nsport ; fi; done; ############ echo " Tracer full les OUTPUT icmp ! "; # SECT ????? TEMPO KOKKKKK if test "${IFLOG/full}" != "$IFLOG" ; then # contiend le mot full CALLIPTABLES -t filter -A OUTPUT -o ppp+ -p icmp $LIM -j LOG --log-level info --log-prefix LOG_OUTPUT_ICMP_PPP_; fi; CALLIPTABLES -t filter -A OUTPUT -o ppp+ -p icmp -m comment --comment "compt_LOG_full_OUTPUT_ICMP_PPP"; ############ # police par defaut OUTPUT accept egale a entree # ce qui sort par output passe dans postroutin et peut eventuellement # revenir en provenance de lo dans prerouting ... ###################### ###################### echo " FICHIER DE CONFIGURATION ECRIT LE `date -u +\"%d/%m/%Y %H:%M:%S\"` TU Liste des periferique ppp+ surveilles et gerres : \"$listpppatester\" IFLOG \"$IFLOG\" pour validere le mode enregitrement en LOG 'extension par mots clef' (entendu full : Ppp entres vers intranet) (entendu full : Input demandes connections) (entendu full : Forward demandes connection) (entendu full : Output icmp ppp) (entendu full : Wcp wifi) L'enrgistrement de chaque regle de log ( avec un prefixe de log de la forme LOG_....... ) ce fait par utilisation de la macro LOGSITUPEUX de composition de regles : Afin de ne pas saturer les log, chaque regle enregistrement de log a un limIte enregistrement : Limite de enregistrement en log par regles : \"$LIM\" Comme toutes les regles qui suivent un critaire donne, ne sont pas forcement en log, ( a cause de cette limite de log ), on fait suivre chaque regle de log par une regle eayant le meme critaire mais unconditionell ( sans la limite precedante) Cette regle sytematique , (qui suit la regel de log,) est soit : - un DROP ( si le prefixe de LOG contiends le mot DROP ou HLIM ) - un REJECT ( si le prefixe de LOG contiends le mot REJE ) .... - un sipmle compteur ( sinon ) ! CERTAINE REGLES DE FILTRAGE SONT ASSOCIE A UNE AUTORISATION LIMITE DETAILLEE PLUS LOIN EN FONCTION DE LEUR PREFIXE DE LOG. RESUME FILTRE LOG ************* la chaine FILTEREPPPIN s'applique a INPUT et FORWARD (2) LISTIPSPECIAL : \"$LISTIPSPECIAL\" Toutes Transmission de ces ip sont a enrgistrer en LOG dans toutes directions et ne sont pas interceptee a ce moment la ... ! LOG_entre_SPECIAL_ (2) LOG_FOR_sortie_SPECIAL_ LOG_OUTPUT_SPECIAL_?_ LISTDNSONLY : \"$LISTDNSONLY\" toutes demande de connectionb de la part de ces ip sont limite sur le port 53 LIM_SPONLY_DNS : \"$LIM_SPONLY_DNS\" (en INPUT) LOG_INPUT_SPONLY_DNS_HLIM_ (si la limite precedante est franchie [Log] Drop) autre port interdit LOG_INPUT_SPONLY_DNS_DROP_ ( [Log] Drop[-Reject] ) PPP+ ---> $racineauto (2) LOG_PPP_Vers_Loc_entre_?_ (info : ?) PPP+ ---> 127 (2) LOG_PPP_Vers_Loc_entre_?_ (info : ?) Bullet ---> (2) LOG_BULLET_IP_SPACK_ ( voir sous chaine FILTERBULLET ) ADSL -i $carteinterfadsl -s ! $alvarion ----> (2) LOG_PPP_non_encapsule_?_ (info) listipspam : \"$listipspam\" LOG & Drop[-Reject] en source ip INPUT FORWARD ; LOG simple en destination ip OUTPUT * LOG_entre_DE_IP_SPAM_?_ (2) LOG_OUTPUT_VERS_IP_SPAM_?_ (log simple en mode connecte) listportsource : \"$listportsource\" LOG_entre_DE_PORT_?_ en source port INPUT FORWARD ; LOG simple en destination port OUTPUT * compt_PORT_SOURCE_BIZZARE_ENTREE_CONNECT (en mode connecte) ou Drop[-Reject] & compt_PORT_SOURCE_BIZZARE_ENTREE_NON_CONNECT (en mode non connecte) LOG_OUTPUT_VERS_PORT_?_ PPP+ ${racineauto} -----> LOG_DROP_SPACK_EXTERN_ (2) PPP+ ${racineadsl} -----> LOG_DROP_SPACK_EXTERN_ (2) PPP+ 127 -----> LOG_DROP_SPACK_EXTERN_ (2) ETH+ 127 -----> LOG_DROP_SPACK_EXTERN_ (2) ************* listportinputall= : \"$listportinputall\" (all) (-) LOG & Drop[-Reject] en destination port INPUT LOG_INPUT_VERS_PORT_ALL_DROP_ ou LOG_INPUT_VERS_PORT_ALL_REJE_ (-) ; pours tous listportinputprohibed= : \"$listportinputprohibed\" (ip non dmz) (-) LOG & Drop[-Reject] en destination port INPUT ; LOG en source de port OUTPUT * LOG_INPUT_VERS_PORT_IPI_DROP_ LOG_OUTPUT_DE_PORT_?_ ou LOG_INPUT_VERS_PORT_IPI_REJE_ (-) ; pour echaper a cette interdiction l'ip doit etre de la dmz !!! ************* MacBullet : $MacBullet chaine FILTERBULLET LOG & DROP des source ip INPUT FORWARD LOG_BULLET_IP_SPACK_ (2) ; si adresse source hors du sous reseaux wifi * independament du perif utlise .................................. * en '_entrer_' le filtres est sur input et forward (dans FILTEREPPPIN) # une adresse ip (ou un port) dans une liste precede par un # est ignore ! les LOG sont limites et toujours suivis d'un compteur (non limite)! ensuite : Les paquets (LOG) _SPACK sont DROPE ; Les paquets (LOG) _REJECT sont REJECTE icmp ; les paquets log autre continus leur chemin (info) ************* Dans filtre INPUT on autorise les transferts sur connections deja etablies ! ET on limite le debit des demandes de connection (non DMZ) celon des critaires specifiques (du plus specifique au plus general ) : LIM_SPONLY_DNS : \"$LIM_SPONLY_DNS\" (en INPUT) toutes demande de connections de la part de ces ip LISTDNSONLY : \"$LISTDNSONLY\", sont limite au port dns : LOG_INPUT_SPONLY_DNS_HLIM_ (si la limite precedante est franchie [Log] Drop) et interdite sur tous les autres ports : LOG_INPUT_SPONLY_DNS_DROP_ ( [Log] Drop[-Reje] ) LIM_TEL=\"$LIM_TEL\" ( pour demande connection telnet ) sur les ports LISTTEL : \"$LISTTEL\" LOG_INPUT_TEL_HLIM_ LIM_DNS=\"$LIM_DNS\" ( pour demande connection dns ) LOG_INPUT_DNS_HLIM_ LIM_SMTP=\"$LIM_SMTP\" ( pour demande connection smtp ) LOG_INPUT_SMTP_HLIM_ LIM_HTTP=\"$LIM_HTTP\" ( pour demande connection http ) sur les ports LISTHTTP : \"$LISTHTTP\" LOG_INPUT_HTTP_HLIM_ LIMGENERAL= \"$LIMGENERAL\" ( limite de connexion par defaut : tres faible ) LOG_INPUT_GEN_HLIM_ Dans Filtre FORWARD on autorise les transferts sur connections deja etablies ET on limite le debit des demandes de connections celon des critaires specifiques (du plus specifique au plus general ) : LIMFORWARD=\"$LIMFORWARD\" ( limite de connexion par defaut ) LOG_FORWARD_GEN_HLIM_ Les chaines de filtrage sont les dernieres, apres NAT ou MANGLE ! # LES PORTS LOCAUX EVOLUENT sur cette machine (d'apres sysct ) DANS INTERVALLE : `$SYSCTL -a | grep net.ipv4.ip_local_port_range` " | tee $infoconf ; # -a pour >> ########################################################################################### # NAT ########################################################################################### echo " === Supression et reecriture des regles table nat :"; CALLIPTABLES -t nat -F; CALLIPTABLES -t nat -X; #ne pas filtre ici !!! # NAT PREROUTING (dnat) CALLIPTABLES -t nat -P PREROUTING ACCEPT; #police defaut CALLIPTABLES -t nat -A PREROUTING ; #compteur entree # NAT OUTPUT (dnat) CALLIPTABLES -t nat -P OUTPUT ACCEPT; #par defaut CALLIPTABLES -t nat -A OUTPUT ; #compteur entree # NAT POSTROUTING (snat et masq) CALLIPTABLES -t nat -P POSTROUTING ACCEPT; #par defaut CALLIPTABLES -t nat -A POSTROUTING ; #compteur entree ###################################### # Creer une sous chaine NATWIFI # SECT echo " Creation d'une chaine nommee intermediaire NATWIFI :"; # utilisable dans prerouting (SANS ACCEPT) CALLIPTABLES -t nat -N NATWIFI; # cette chaine sera appele en condition -s $reswifiun/$maskreswifi # elle n'a que deux reponse possible REDIRECT ou RETURN # les ports intedit a la consultation son replcaer par un redirect # sur une page info ou un port qui ne reponds pas #ON GERRE ICI LA LISTE DES PORTS WIFI : NON UTLISABLES HORS CONNECTION listportwificontrol ######################################################################### #ICI sera inseree les regles d autorisation RETURN du port sepcifie # et du clients specifique ip wifi connecte dessirants sortie # par le programmme portail wifi sur la memem liste listportwificontrol # en sortie # # RQ ces return evite les redirect; mais ne leve pas les controles normaux ######################################################################### # tracer les sorties des wifi non connectes, a destination ip non intranet # ( y compris 255.255.255.255) tous protcoles !!!! if test "${IFLOG/full}" != "$IFLOG"; then # contiend le mot full MACROLOGSITUPEUX LOG_PREROUT_WIFI_SOURCE_WCP_ -t nat -A NATWIFI -d ! $resautonome/$maskresautonome ; #full # simple compteur fi; #une fois la connection wifi valide par le portail, les ports valides dans la liste du client (par portail.bin) #ne sont plus traces WCP #mais tous les autres reste est en Log WCPE ! # attaques port sortant destinatiaire "fragille" : my @portas=("21","22","23","25","80","113","135","445","1025","5000","6660","6661","6662","6663","6665","6666","6667","6668","6669","7000","8080","8018"); # 110 ProMail trojan # 113 auth Kazimas # 123 ??? vpn # 135 rpc # 443 htpps # 445 netbois microsoft # 1025>= window allocation # 1194 ??? vpn # 5000 Plug and Play per to per # 666X chat # 7000 afs fileserver # 8080 http bis ???? vpn # 9201 ??? vpn #vpn 53, 80, 110, 123, 443, 1194, 8080, 9201 # WIFI_PREROUTING_SOURCE_WCPE_ sert a etendre la liste qui suit, des ports a controler avant la connection en wifi : # port de destination sortants listportwificontrol="-20 -21 -22 -23 -25 #37 =53 80 -110 -113 -123 -443 -445 -1194 -12350 -1723 -5119 -5222 -5223 -5228 8080 -9201 -40001:40046 "; # liste des ports a isoller si wifi hotspot # - envoyer vers port ferme # envoyer vers port 8887 # = envoyer vers meme port localement # a mettre en correspondance avec script portail.bin qui mettre en service client wifi ############################################################################################ # ATTENTION cette liste de ports ne doit pas etre en concurance avec ceux de natesitupeut # (qui sont sur 4 chiffres) 2122 (ne pas bloquer 8888 8886 9999) !!!!!! ?????? ############################################################################################ #listportwificontrol=""; #hiniber hinibition KOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK # 20 FTP-D # 21 FTP # 22 SSH # 23 TELNET # 25 SMTP (ne pas rediriger EHLO ni bloquer) # 37 TIME (ne pas bloquer) # 53 DNS (rediriger localment) # 80 HTTP # 110 POP3 # 113 IDENTIFICATION # 123 NTP (ne pas bloquer) quand il marche mais aussi vpn ! # 443 HTTPS SSL # 12350 SKYPE voip ???? # 1723 PPTP VPN # 5119 Unreal Media Server # 5222 jaber # 5223 appel jaber # 5228 googel play telechargement echo " Isoller tous les utilisateurs wifi des ports (tcp et udp) $listportwificontrol et rediriger temporairement leurs requettes wifi de sortie vers ces port sur 8887 ( la page legale de bienvenue ) :"; # SECT # (et en jetttant les requettes entree externes sur ces meme ports 9999 ) : "; restaureport=''; # pour informer le pg portail wifi de la liste des ports a retablir for portw in $listportwificontrol; do # reponse du port 8887: presentation reseau wifi if test "`expr substr "$portw" 1 1`" != '#'; then #if no start by comment flag # # REDIRIGER LOCALEMENT CES PORTS EN DESTINATION EN SORTIE WIFI rdirectport='8887'; # vers page html if test "`expr substr "$portw" 1 1`" == '-'; then # rediriger ces ports vers rien portw="`expr substr "$portw" 2 100`"; # elliminer le - rdirectport='9999'; #pas de reponse fi if test "`expr substr "$portw" 1 1`" == '='; then # rediriger ces ports localement portw="`expr substr "$portw" 2 100`"; # elliminer le = rdirectport="$portw"; #lme meme port mais localment fi restaureport="$restaureport $portw "; #pour infomer portaile wifi CALLIPTABLES -t nat -A NATWIFI -p tcp --dport $portw -j REDIRECT --to-port $rdirectport; CALLIPTABLES -t nat -A NATWIFI -p udp --dport $portw -j REDIRECT --to-port $rdirectport; fi; done #informer le pg portail wifi de la liste des ports a retablir echo "# # Ce fichier include a etait ecrit par $0 le `date -u` # listportwificontrolrestaure=\"$restaureport\"; # # il donne la liste des ports a retablir " > $fileportwificontrols; #tracer les sorties des wifi vers ports inconnus (pour etendre la liste) # SECT for ad in $addanaterfixe $addsuplementaire; do #boucler sur toutes les adresse box pour les retirer des log CALLIPTABLES -t nat -A NATWIFI -d $ad -j RETURN -m comment --comment "_BOX_NOT_WCPE"; #sauf adresse box (tous protocoles) done; MACROLOGSITUPEUX LOG_PREROUT_WIFI_SOURCE_WCPE_ -t nat -A NATWIFI -d ! $resautonome/$maskresautonome ; # simple compteur # il reste ici ports en sorties ni interdit et ni autorise (non deja traite) # sert a entendre la liste de controle #RETURN implicite # par defaut les utilisateurs invite par le hotspot wifi et non connecte sont redirige sur le port 8887 # un script bash, independant de hiawatha, reponds sur le port 8887 (et 8886) # et envois alors a utilisateur inconnue, un message de bienvenue et # lui demande d'accepter les conditions utilisation du reseau # il s'inscrit par le bais du port 8886 ... # le script poratilwiwf programme les iptables, de maniere a pouvoir l'autoriser a seurfer : # il ne peut pas ne pas voir le message reglementaire !!!! # le serveur http hiawatha a qq problemes # entre autre la variables HTTP_HOST n'est pas fidele a url, a l'entete HTTP # si on l'apelle avec une url de la forme # http://machine:port/.... # la variable HTTP_HOST au lieu de contenir la string complete "machine:port" # ne contiends que "machine" ; le numero de port est supprime ??? # si quel q'un peut m'expliquer pourquoi et comment y remedier !!!! # j'ai besoin de recuperer la forme d'appel exacte de url ! # au prochain bug reseaux la remise en route pppoe fait un raz de toutes les autorisations wifi # fin Creer une sous chaine NATWIFI ###################################### ###################################### # creation de sous chaines NATESITUPEUX echo " Creation d'une chaine nommee intermediaire NATESITUPEUX :"; # SECT # RQ : cette chaine nome ne touche pas au port destination 80 !!!!!!!! # pour simplifier le travail on, crer une chaine de regles Nommee intermediaire # creation chaine commune de nat : sans adresse source, Traitement de la Destination DNAT uniquement # la regle commune suivante, ne s'occupe pas de la source (sauf en cas de self boucle) # ( CALLIPTABLES et MACRONATESITUPEUXRANGEPORT sont des fonctions sh dediees en debut du script ) CALLIPTABLES -t nat -N NATESITUPEUX; #creation chaine nommee, utilisable plusieurs fois # en Destination nat DNAT sur PREROUTING et OUTPUT # on utilise les ports de destination 8180 8280 2123 ... # comme des adresses segondaires vers # d'AUTRES machines DNAT : internes rtzeroun rtzerodeux (192. ) ou externes ... # cette chaine n'utilse pas les adresse locale DNAT destination 127.*.*.* (ni le redirect local) # ne pas DNATER vers ($addanaterfixe $addsuplementaire) if test '3' == '3' ; then #KOKKKKKKKKKKKKKKKKKKKKKKKKKK hinibition REDIRECT echo " Renvois DNAT vers des sites internes : "; # (intranet 192) #MACROLOGSITUPEUX LOG_7777_VUS_ -t nat -A NATESITUPEUX -p tcp --dport 7777 ; #KOKKKKKKKKKKK #MACROLOGSITUPEUX LOG_7777_VUS_ -t nat -A NATESITUPEUX -p udp --dport 7777 ; #KOKKKKKKKKKKK #MACRONATESITUPEUXRANGEPORT 7777:7777 192.168.1.35:80-80 # "fonctionne" en self et adroide #vers http interne reseau zero vers routeurs des sous reseaux # MACRONATESITUPEUXRANGEPORT 8180:8180 $rtzeroun; #c'est deja cette machine ??? MACRONATESITUPEUXRANGEPORT 8280:8280 $rtzerodeux; #KOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK MACRONATESITUPEUXRANGEPORT 8380:8380 $rtzerotrois; #KOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK #vers ssh interne reseau zero vers routeurs des sous reseaux MACRONATESITUPEUXRANGEPORT 2122:2122 $rtzeroun; #c'est deja cette machine ??? MACRONATESITUPEUXRANGEPORT 2222:2222 $rtzerodeux; MACRONATESITUPEUXRANGEPORT 2322:2322 $rtzerotrois; #vers telnet interne reseau zero vers routeurs des sous reseaux MACRONATESITUPEUXRANGEPORT 2123:2123 $rtzeroun; #c'est deja cette machine ??? MACRONATESITUPEUXRANGEPORT 2223:2223 $rtzerodeux; MACRONATESITUPEUXRANGEPORT 2323:2323 $rtzerotrois; #evidament le routeur beta (rtzeroun) doit ouvrir son port 2123 sur telnet #dns de la station # si on ecrit 53:53 $rtzeroun; #si on ecrire 0053:0053 sh comprends en octal : 43 ! #supprime, car le dns est remonte dans ce pc #c'est deja cette machin # le port web dedie au modem alvarion n'est plus utilise depuis exterieur KOKKKKKK #echo " # Jonction avec modem Alvarion : "; #http reseau adsl radio wimax : controle du modem radio wimax a distance #MACRONATESITUPEUXRANGEPORT 8980:8980 $alvarion:80-80 # sur port 80 utiliser URL /HomePocketPC.asp; ( avec / et /homePC.html le control login plante ) echo " Renvois DNAT vers des sites externes : "; #(en aucun cas vers cette box) #renvois vers site virtual Externes : pour test et ... # Par ce biais il est possible de redirige une communication # vers un autre lieux ou un mobile (sans laisser de trace qq dans les log http locaux) # puisque le reroutage de la connexion est fait directement au niveau TCP/UDP # il ne reste plus alors qu'a consulter les compteurs associe (commande S de ce script) # bien sur on peut limiter cette fonctionnalitee a des hotes choisis; # pour cela on doit utilise la chaine de "filtre" ... # Par ce biais et/ou les redirections http il est possibles de referencer des site amis # sans pour autant louer un domaine DNS (a l'exterieur de son propre DNS) : # quoi qu'il en soit l'unicitee de la racine DNS n'est apparament plus que un v[i]eux pieux ! # pourquoi il y aurai qu'une seule racine ??? # du reste en IPV6 la negocaition de decouverte des routeur et d'auto configuration # ne prevois pas l'envois de ip d'un DNS !!! #vers un weeb virtual MACRONATESITUPEUXRANGEPORT 9080:9080 $virtualweb:80-80 ; #site web # vers les sous routeurs du site weeb Externe (meme schemat que cette Box) salle a ramonville: MACRONATESITUPEUXRANGEPORT 9180:9180 $virtual:8180-8180 ; MACRONATESITUPEUXRANGEPORT 9280:9280 $virtual:8280-8280 ; MACRONATESITUPEUXRANGEPORT 9380:9380 $virtual:8380-8380 ; #nuages de ports independants du site dans des sous reseaux fi; # fin Creer une sous chaine ###################################### #la table nat s'applique : # # aux entrees PREROUTING et OUTPUT(apres mangle) # avant tous routage et permet de changer NATER la DESTINATION des connexion (reponse comprises) # DNAT et REDIRECT # NAT PREROUTING # SECT ###################### #ce qui arrive par lo est deja eventuellement dnate dans output ! et n'a donc pas besoin de etre a nouveau; # etde plus ne devrais pas passer dans PREROUTING !!! CALLIPTABLES -t nat -A PREROUTING -i lo -j ACCEPT -m comment --comment "_DOIT_ETRE_VIDE_??????" ; # SECT # deja DNATE dans OUTPUT ## normalement vide !!! si pas de boucle ??? KOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKk #on peut donc faie le meme traitemant nat en prerouting et output echo " Application de la chaine nommee NATWIFI, aux entre wifi invite, en debut de PREROUTING et OUTPUT: "; # SECT #CALLIPTABLES -t nat -A PREROUTING -i eth+ -m mac --mac-source $MacBullet -s $reswifiun/$maskreswifiun -j NATWIFI; # eth : ni lo ni ppp #CALLIPTABLES -t nat -A PREROUTING -m conntrack ! --ctstate DNAT -s $reswifiun/$maskreswifiun -j NATWIFI; # eth : ni lo ni ppp # a tous ce qui viends du wifi invite ( sauf le bullet lui memem ) ! #le nat des adersse ip wifi est fait independament du periferique (adresse ip source, est controle ailleur) CALLIPTABLES -t nat -A PREROUTING -s $reswifiun/$maskreswifiun -j NATWIFI; CALLIPTABLES -t nat -A OUTPUT -s $reswifiun/$maskreswifiun -j NATWIFI; # acking control !!! #on peut rajouter ici d'autres sous resaux invites !!!!!! ( a autoriser par un portail dedie ) # le controle de la legalite des adresse source venant du wifi et autre est fait dans filterbullet echo " Application de la chaine nommee NATESITUPEUX, aux adresses de la box selectes, ( OUTPUT ET PREROUTING ) : "; # SECT # ici on combine la regle nommee avec toutes les adressee officielles de la box determinees precedament # ( sur chaqunes des adresses de destination de la box, # calcules a partir de la configuration courante precedante) # on applique la regle communne de DNAT (sur une liste adresses de destination preetablies ou constatees) for ad in $addanaterfixe $addsuplementaire; do #boucler sur toutes les adresse box echo " $ad est a intercepter eventuellement en PREROUTING avec DNAT si tu peux !"; CALLIPTABLES -t nat -A PREROUTING -d $ad -j NATESITUPEUX; #controle adresse destination echo " $ad est a intercepter eventuellement en OUTPUT avec DNAT si tu peux !"; CALLIPTABLES -t nat -A OUTPUT -d $ad -j NATESITUPEUX; #controle adresse destination # si qq joint se routeur en utilisant une adresse inconnue de la liste ci dessus # (defaut FAI ou autre liaison etablie APRES ou autre IP) # la regle precedante n'est pas applique et on route .. done; # NAT POSTROUTING # SECT echo " Chaine de POSTROUTING :"; # SECT #SNAT OU MASQUERADE #la table nat s'applique aussi # aux sorties apres routage POSTROUTING # et permet le MASQUERADE et le SNAT de adresse Source en retour # attention la destination peut avoir etait change dans prerouting et input !! # et la source dans input ###################################### # Creation d'une chaine nommee intermediaire MASQSITUPEUX # SECT # # masque l'adreese de retour avec celle du periferique # et evite de la faire si c'est deja la meme ! : CALLIPTABLES -t nat -N MASQSITUPEU; #creation chaine nommee, utilisable plusieurs fois # cas sortie par PPP+ # MASQ que si adresse source ne correspond pas a celle du PPP selectionne # SECT for ppp in $listpppatester; do #boucle des perif ppp actif cname="${ppp}_proximal"; #tableau creer par composition prefix suffix dans l'analyse prealable des perif ppp prooxi="`eval echo -n \\$${cname}`"; #echo " valeur de ${cname} est \"$prooxi\""; #use if test "$prooxi" != ''; then #perif ppp en service CALLIPTABLES -t nat -A MASQSITUPEU -s ! $prooxi -o $ppp -j MASQUERADE -m comment --comment "compt_SORTIE_PAR_PERIFERIQUE_PPPX_MASQ_NECESSAIRE" ; #PPP periferique adsl # si deja la meme c'est pas la peine de le refaire (peut etre pas utile ? ) CALLIPTABLES -t nat -A MASQSITUPEU -s $prooxi -o $ppp -j ACCEPT -m comment --comment "compt_SORTIE_PAR_PERIFERIQUE_PPPX_MASQ_NON_NECESSAIRE"; fi; done; #si on ne connais pas le PPP ??? CALLIPTABLES -t nat -A MASQSITUPEU -o ppp+ -j MASQUERADE -m comment --comment "compt_SORTIE_PAR_PERIFERIQUE_PPP_INCONNU_!!!!" ; #PPP periferique adsl # cas sortie par eth $carteinterfzero MASQ que si adresse source ne correspond pas a celle du perif # SECT #MACROLOGSITUPEUX LOG_SORTIE_PAR_PERIFERIQUE_INTERNE_SN_?_ -t nat -A MASQSITUPEU -s ! $interfzero -o $carteinterfzero; #LOG TEMPO KOKKKKKKKKKKK MACROLOGSITUPEUX LOG_SOR_P_PERI_INTERNE_SN_?_ -t nat -A MASQSITUPEU -s ! $interfzero -o $carteinterfzero; #LOG TEMPO KOKKKKKKKKKKK CALLIPTABLES -t nat -A MASQSITUPEU -d $interfzero -o $carteinterfzero -j ACCEPT -m comment --comment "compt_SORTIE_PAR_PERIFERIQUE_INTERNE_SELF_SNAT_NON_NECESSAIRE"; # periferique interne CALLIPTABLES -t nat -A MASQSITUPEU -s $interfzero -o $carteinterfzero -j ACCEPT -m comment --comment "compt_SORTIE_PAR_PERIFERIQUE_INTERNE_SNAT_NON_NECESSAIRE"; # periferique interne CALLIPTABLES -t nat -A MASQSITUPEU -s ! $interfzero -o $carteinterfzero -j SNAT --to-source $interfzero -m comment --comment "compt_SORTIE_PAR_PERIFERIQUE_INTERNE_SNAT"; # de periferique interne #dans tous les autres cas ???? ni pppp+ ni carteinterfzero accept MACROLOGSITUPEUX LOG_MASQSITUPEU_ACCEPT_ -t nat -A MASQSITUPEU -m comment --comment "compt_SORTIE_PAR_AUTRE_PERIFERIQUE_NO_SNAT" ; #fin creation de sous chaines MASQSITUPEUX # SECT ###################################### # on vas etablir le postrouting en fonction du periferique de sortie utlise : lo eth ppp+ echo " Destinations machine locale : OK "; # SECT CALLIPTABLES -t nat -A POSTROUTING -o lo -j ACCEPT -m comment --comment "compt_SORTIE_VERS_LO"; # SECT #existen local est azussi un routeur echo " Traitement particulier a destination des periferiques necessiteux internes, incapables de routeur : "; # SECT # alvarion n'a pas de notion de routeur par defaut (comme tous les modems) : # si on veut une reponse on doit masquerider sythematiquement la source # pour avoir une reponse # le modem envois donc la reponse a $interfadsl specifie dans le SNAT CALLIPTABLES -t nat -A POSTROUTING -d $alvarion -s $interfadsl -j ACCEPT -m comment --comment "compt_SORTIE_VERS_ALVARION_SNAT_NON_NECESSAIRE"; CALLIPTABLES -t nat -A POSTROUTING -d $alvarion -j SNAT --to-source $interfadsl -m comment --comment "compt_SORTIE_VERS_ALVARION_SNAT_NECESSAIRE"; #cet idiot ne route pas #fin de la liste des necessiteux internes #les autres destinataires internes normaux se debrouillent par eux meme dans un resau autonome !!! echo " Provenance intranet vers internet ppp+ => MASQSITUPEU "; # SECT CALLIPTABLES -t nat -A POSTROUTING -s $resautonome/$maskresautonome -o ppp+ -j MASQSITUPEU -m comment --comment "compt_intranet_vers_internet_PPP_MSTP"; # SECT CALLIPTABLES -t nat -A POSTROUTING -s 127.00.00.00/255.00.00.00 -o ppp+ -j MASQSITUPEU -m comment --comment "compt_local_vers_internet_PPP_MSTP"; # SECT #les 127 devrais prendrent le nom du perif de sortie KOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK echo " Provenance box vers internet ppp+ => MASQSITUPEU "; # SECT # si periferique ppp+ out differant for ad in $addanaterfixe $addsuplementaire; do #boucler sur toutes les adresse box (intranet) CALLIPTABLES -t nat -A POSTROUTING -s $ad -o ppp+ -j MASQSITUPEU -m comment --comment "compt_BOX_vers_internet_PPP_MSTP"; #adresse local box done; echo " Le message est dans etat DNATE (perouting ou input) => MASQSITUPEU "; # SECT CALLIPTABLES -t nat -A POSTROUTING -m conntrack --ctstate DNAT -j MASQSITUPEU -m comment --comment "compt_DNAT_MSTP"; # SECT # RQ # logiquement MASQUERIDE et SNAT ne sont pas equivalents # d'apres la doc si ppp tombe le MASQUERIDE du ppp est perdu # par contre si ppp tombe et repart (rapidement de maniere interne demon ppp) # la regle SNAT est normalement toujour valide si adresse ip est maintenu !!!! echo " Destinations ni externe ni interne POSTROUTING_NON_SNATE ???? voir police "; # SECT MACROLOGSITUPEUX LOG_POSTROUTING_ROUTAGE_??_ -t nat -A POSTROUTING -m comment --comment "ROUTAGE_SIMPLE_?"; #KOKKKKKKKKKKKKKKKKKKKKKKKKKk # fin chaine accept echo " RESUME LOG NAT # PREROUTING # Listportwificontrol (pour isoler les wifi non connecte ) \"$listportwificontrol\" NATWIFI la chaine de redirection des port interdit au wifi non declares # Les adresses box legales \"$addanaterfixe $addsuplementaire\" NATESITUPEUX la chaine de redirection generale DNAT des adresses box legales # POSTROUTING : # SI VERS MODEM ALVARION : SNATER # SI DE INTRANET VERS PPP+ : ESSAYER DE MASQUERIDER # SI DE BOX AD VERS PPP+ : ESSAYER DE MASQUERIDER # SI MESSAGE DEJA EN DNAT : ESSAYER DE MASQUERIDER # SINON ROUTER SIMPLEMENT ! " | tee -a $infoconf ; # -a pour >> ###################################################### ###################################################### if test '2' == '3'; then #if test "$BOXALSA" != ''; then #if test '2' == '3'; then echo " === Supression et reecriture des regles table filter : "; CALLIPTABLES -t filter -F; CALLIPTABLES -t filter -X; # -F vider ; -X supprimer ; -P police # cette tables comme son nom indique est fait pour filtrer, elle n'a que 3 chaines standars CALLIPTABLES -t filter -P INPUT ACCEPT; #par defaut !!!!!!!!!!!!!!! CALLIPTABLES -t filter -P FORWARD ACCEPT; #par defaut !!!!!!!!!!!!!!! CALLIPTABLES -t filter -P OUTPUT ACCEPT; #par defaut !!!!!!!!!!!!!!! echo " === Supression et reecriture des regles table nat :"; CALLIPTABLES -t nat -F; CALLIPTABLES -t nat -X; #ne pas filtre ici !!! CALLIPTABLES -t nat -P PREROUTING ACCEPT; #par defaut !!!!!!!!!!!!!!! fi; ###################################################### ###################################################### echo " === Supression et reecriture des regles table mangle :"; CALLIPTABLES -t mangle -F; CALLIPTABLES -t mangle -X; #ne pas filtre ici !!! CALLIPTABLES -t mangle -P PREROUTING ACCEPT; #CALLIPTABLES -t mangle -A PREROUTING ; #compteur entree CALLIPTABLES -t mangle -P INPUT ACCEPT; #CALLIPTABLES -t mangle -A INPUT ; #compteur entree CALLIPTABLES -t mangle -P FORWARD ACCEPT; #CALLIPTABLES -t mangle -A FORWARD ; #compteur entree CALLIPTABLES -t mangle -P OUTPUT ACCEPT; #CALLIPTABLES -t mangle -A OUTPUT ; #compteur entree CALLIPTABLES -t mangle -P POSTROUTING ACCEPT; #CALLIPTABLES -t mangle -A POSTROUTING ; #compteur entree if test "$BOXALSA" == ''; then CALLIPTABLES -t mangle -A POSTROUTING -o ppp+ -j TOS --set-tos 16; #PPP periferique adsl #Minimize-Delay:16; output radio; diminu latence ??? #provisoire pour wimax seulement KOKKKKK # CALLIPTABLES -t mangle -A POSTROUTING -o ppp+ -j TTL --ttl-set 64; #PPP periferique adsl fi; echo " === Supression et reecriture des regles table raw :"; #on "n'utilise" pas la machine a etat et on ne trace pas CALLIPTABLES -t raw -F; CALLIPTABLES -t raw -X; #ne pas filtre ici !!! track notrack CALLIPTABLES -t raw -P PREROUTING ACCEPT; #CALLIPTABLES -t raw -A PREROUTING ; #compteur entree CALLIPTABLES -t raw -P OUTPUT ACCEPT; #CALLIPTABLES -t raw -A OUTPUT ; #compteur entree # tel qui il est ce programme ne filtre pas vraiment (c'est un routeur avant tous) # et applique les SNAT(en sortie) independament des DNAT(en entree) : # le routage sortant est presque independant des ip entrantes # et les ip entrantes officielles ne sont pas differenties entre elles , pour le moment ... echo " === Mise a jour du fichier de derniere configuration reseaux et log wifi :"; echo " Le syteme reseaux a etait reconfigure le `date -u +\"%d/%m/%Y %H:%M:%S\"` UTC# les url vers les sources script pppoe utilises dans ce programme sont disponnibles, # inci qu'un script pour controler les password des challeng chap md5 : #Retour a la page d'appel du web source # |