Les fichiers sources
Site dynamique original : Reload page

( Reponse du 25/04/2024 20:11:14 UTC, par serveur :
    SERVER NAME : "www.trousperdu.org"
    SERVER_PORT : "80"
 Suite a la requete :
    HTTP_HOST : "trousperdu.org"
    REQUEST_URI : "/cgi-bin/viewsource.bin?/etc/rc.d/ResetIptables"
 Adresse du demandeur : "18.224.37.68" ) :


LE SOURCE DU FICHIER "/mnt/hda1/etc/rc.d/ResetIptables"
 ( du 27/05/2016 15:24:22 UTC ) :
-rwxr-xr-x 1 root root 161392 May 27 2016 /mnt/hda1/etc/rc.d/ResetIptables
#!/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 registrations precedantes sont invalidees :

" >$inforazwifi; #info a destination des utilisateurs wifi deconnectes echo "* le `date -u +\"%d/%m/%Y %H:%M:%S\"` UTC raz registration !" >>$infologwifi; fi; # fin du cas : reprogrammer #ici on est dans le cas status S qui permet d'acceder aux compteurs des iptables echo " === Afficher les regles des iptables raw : "; CALLIPTABLES -t raw -L -v -n; #afficher etat actuel table echo " === Afficher les regles des iptables mangle : "; CALLIPTABLES -t mangle -L -v -n; #afficher etat actuel table echo " === Afficher les regles des iptables nat : "; CALLIPTABLES -t nat -L -v -n; #afficher etat actuel table echo " === Afficher les regles des iptables filter : "; CALLIPTABLES -t filter -L -v -n; #afficher etat actuel table echo " === Derniere Reconfiguration iptables faite : "; cat $inforazwifi; #pour rapel #---------------------------------------------------------------------------- # * ici on reprogramme eventuellement proc if test "$PROG" != ""; then # reprogrammer echo " === Autorisation de routage mise a 1 :"; echo "1" > /proc/sys/net/ipv4/ip_forward; fi; # fin du cas : reprogrammer echo " === Etat de l'Autorisation de routage : "; cat /proc/sys/net/ipv4/ip_forward; #---------------------------------------------------------------------------- if test "$PROG" != ""; then # reprogrammer echo " CONFIGURATION RESEAUX FAITE !!! ??? "; fi; # fin du cas : reprogrammer #---------------------------------------------------------------------------- # * ici on reprogramme eventuellement heure if test "$COM" == "r" || test "$COM" == "R" || #chois reset (pas c ou d) test "$COM" == "t" || test "$COM" == "T"; then #choix heure FAIT="$FAIT MISE_A_L'HEURE"; echo " === GESTION DES HORLOGUES Recherche de l'heure sur le reseau : "; Decallage="3 minutes ago"; # a adpater a votre config : # derniere horloge et temps de redemarrge tempo onduleur RtcArrier=""; #si mise a jour faite : sera non vide et decallee echo " Appel du serveur de date par ntpdate $ntpserv : "; ntpdate $ntpserv; # mise ajour de horloge fichiers UNIX #no dns; only fichier hosts if test "$?" == "0"; then echo " Horlogue syteme unix a etait mise a jour par ntpdate $ntpserv ... "; #on note ici la valeur universelle moins X minutes RtcArrier="`date -u --date \"$Decallage\" +\"%F %T\"`" else echo -e " Erreur dans la mise a jour de Horlogue syteme unix $ntpserv !!!\a\a\a"; #reessayer avec une autre serveur echo " Appel du serveur de date bis par ntpdate $ntpserv2 : "; ntpdate $ntpserv2; if test "$?" == "0"; then echo " Horlogue syteme unix a etait mise a jour par ntpdate $ntpserv2 bis ... "; #on note ici la valeur universelle moins X minutes RtcArrier="`date -u --date \"$Decallage\" +\"%F %T\"`" else echo -e " Erreur dans la mise a jour de Horlogue syteme unix $ntpserv2 bis !!! !!!\a\a\a"; # ??? fi; fi; # Des effets de bord notables sont a prevoir si il y a un ecart negatif # les logiciels n'aime pas les retour en arriere de horloge syteme # ( en particulier le serveur X qui se gele un certain temps) # ( par contre avancer ne posse pas trop de probleme ) # donc ici j'ai pris la decission de retarder horloge bios hardware sauvegarde de # Decallage par rapport a l'horloge syteme cale sur ntpd ! # Decallage est choissi en fonction : # de la constate d'arret/redemarrage de onduleur , de la dure attente post bios ... # # En fait il y deux horloges : # une horloge logiciele systeme , qui est gere par le noyau # et qui est cadencee par les interruption sytemes # et qui sert a dater les fichier ... # cette horloge est ce que l'on peut apeller l'horloge UNIX # c'est celle la qui est mis a jour par ntpdate !!! # c'est en fait la seule que connais UNIX # on peut la consulter par la commande : echo " Horlogue syteme unix pour les fichiers : "; date -u; # UNIX # mais quand UNIX demmarre il ne connais pas l'heure # il se vois en gros au 1/1/1970 !!! # il y a qq decennie au demarrage on lui indique l'heure manuellement # heureusement les cartes meres actuelle comporte une petite horloge CMOS # apelle RTC (Real Time Clock a tord) est reglable par le menue du BIOS # on peut la consulter par la commande : #pour les syteme sans RTC ce qui suit sera ignorer par les commandes : echo " Etat actuel de Horlogue Bios CMOS RTC ( Sauvegardee par batterie ): "; $HWCLOCK --show --utc ; #etat horlogue sauvegarde batterie bios if test "$?" == "0"; then #ok echo " qui doit etre de perference en retard .... :"; else echo " Apparament votre systheme n'a pas horlogue sauvegarde batterie Bios !"; fi; # Au demarrage donc le syteme unix actuel lis l'horloge hardware RTC CMOS # et la recopie dans sont horloge logicielle unix # a partir de la il ignore supperbement horloge RTC CMOS # Ensuite toutes les remise a l'heure porte principalement # sur horloge syteme UNIX # car de toutes facon l'horloge RTC est une option # ( il y a pas de RTC sur Raspbery pie par exemple ) # Donc, comme il serait dangereux que ntpdate # soit oblige de faire, un retour arriere de l'horloge syteme unix ! # Pour eviter se probleme j'ai regle horloge RTC bios # avec au moins X minutes de retard # et je m'arrange pour quelle continus a retarder ! # Ce qui fait que au demarrage du routeur, NTPD le propulse # sythematiquement horloge syteme unix vers l'avant ! # et ne touche pas la RTC # pour etre sur cependant que la RTC retarde : if test "$RtcArrier" != ""; then # si mise a jour horlogue UNIX faite alors faire celle du rtc bios echo " On renvois dans le passe UNIX ($Decallage) \" $RtcArrier \" l'Horlogue Bios CMOS RTC (pour etre sur quelle retarde au prochain demarrage ): "; $HWCLOCK --utc --set --date="$RtcArrier"; #reset horlogue sauvegarde batterie bios if test "$?" == "0"; then #ok echo " Les deux horlogues on un decallage constant ($Decallage) : CMOS RTC `$HWCLOCK --show --utc` UNIX `date -u +\"%c\"` Au prochain demmarage le kernel reinitialisera sont horlogue avec la RTC CMOS sauvegardee, ensuite ... avec l'heure reseau, il fera alors un petit bon en AVANT (Les retours arrieres peuvent genner certains logiciels )!"; else echo " Erreur : Pas de mise a jour de horlogue RTC CMOS ?? !!"; fi; fi; #fin cas du RTC # se sythem e de retard calibre des deux horlogues # fait chez moi : ! # Que apres un demarrage reussi : # le gestionnaire window ( qui a deja demarre) # crois detecter (lhors de la mise a jour date reseaux) # une innactivite de ecra souris de X minutes ( simulee par le retard qualibre) # eteinds donc ecran et verouille la cession X ! # En realite il y a une Troisieme "horloge" dans le micro, pilote par # du quartz de la carte mere, c'est cette horlogue que l'OS peut utilise # pour gerer les tempos dans les drivers et les differentes taches # elle s'incremente toute seule et part de zero a la mise sous tension # cette horloge n'est pas reglable et n'est pas forcement "reguliere" # ( sa cadence peut varier dans les vieux micro ou portable avec la mise en sommeil ) # Horloge UNIX ne sert pas vraiment a OS # mais plutot aux systeme de fichier # et au programme user tel que MAKE CRON X11 MAIL # et pour dater a titre indicatif les log .... # Ces horloges sont parfois en competition linguistique # dans les documentation , et peuvent y provoquer # des embouteillages syntaxique. # Attention donc en consultant les doc !!! # Compte tenus de la bonne qualitee des quartz actuel # et que cette box est un routeur ; (connecte a internet # et au serveurs NTP ) , j'ai choisi de mettre a jour horloge UNIX # UNE SEULE FOIS automatiquement apres le demarrage (et n'utilise pas le demon ntpd). # C'est un choix personnel, que vous etes LIBRE adopter ou pas ! # Pouvant a distance arreter la station la mise a l'heure n'est pas un pb # ( au contraire si l'ecart n'est pas d'environ X minutes # cela prouve une intervention non dessiree ) # Bien sur cette methode de gestions des horlogues est specifiques a ma box # vous pouvez la modifier ou en faire une autre ... # on est dans des logiciels LIBRES ou OPEN !!!! relancerbind='T'; # mise a l heure faite : relancer bind fi; # fin du cas : remise a l'heure soft #----------------------------------------------------------------------- if test "$relancerbind" != ''; then echo " === DEMARRAGE OU RELANCE DE BIND : "; /opt/bind9/etc/initbind9 reload; #fichier reload ou demarrage FAIT="$FAIT BIND RELOAD OU START"; fi; #---------------------------------------------------------------------------- # * ici on reprogramme eventuellement animation graphique de antenne #on mets a jour la gif annimation antenne presque dans tous les cas if test "$COM" != "v" && test "$COM" != "V" && test "$COM" != "s" && test "$COM" != "S" ; then #les fichier texte et annimation gif des parametres antennes est faite sur demande http #directement dans le script cgi (il n'y a pas de demon serveur) #cependant on la mets a jour ici au demarrage a arret ... FAIT="$FAIT GIF_ANTENNE"; echo " === MISE A JOUR DU GIF ANIMATION ANTENNE : "; /root/animation/alvarionani.sh; #fichier shell animation appele aussi par script HTTP cgi fi; #---------------------------------------------------------------------------- # * conclusion des actions du programme #on affiche ici pour operateur les modif effectuet par le programme (hors status) echo -e "=== Modifications lancees par le programme : \"$FAIT\" $firsterriptables "; # echo " #=== RECHERCHE DES CONCENTRATEURS PPPOE DISPONIBLES : pppoe -A -I $carteinterfadsl ... #"; # pppoe -A -I $carteinterfadsl; # not timeout if ok # reppadi="$?"; # if test "$reppadi" != "0"; then # echo -e " pppoe erreur return code $reppadi !\a\a\a\a"; # fi; # Voir V commande de verification on line #---------------------------------------------------------------------------- echo "=== La derniere configuration iptables est accesible par : cat $infoconf ; ==="; #---------------------------------------------------------------------------- # ici les actions du programme sont finis # on cherche maintenant a la prochaine commande a lancer # doit on attendre aperateur ... etc etc # doit on attendre operateur ou reboucler automatiquement # cela depends de la commande en cours : if test "$COM" == "r" || test "$COM" == "R" || # si mode relance et surveillance : boucle test "$COM" == "v" || test "$COM" == "V" ; then # si en mode surveillance liaison : boucle # ici on est en commande automatique et dans une boucle interne de surveillance liaison # la variable PARA prametre appel simule valide # le mode automatique de surveillance (sans operateur) PARA="$COM"; # passer en mode automatique la prochaine commande : boucle sans operateur # : on repete la commande r ou v (on est en mode demon) #boucler ici sur le controle temporise de la qualitee de la liaison internet (tanque pas defaut!) while test "$PARA" != ""; do # tant que la commande automatique de surveillance internet #temporisation interruptible : un signal ctrl+c permet de sortir du sleep suivant trap "PARA=\"\";break;" SIGINT; #sur interruption : # passer en manuel : par reset de PARA et break echo " $STARTED"; #afficher les info dernier redemarrage adsl ! startmesure; #noter ifconfig depart (reset de debitok ! ) echo "sleep INTERRUPTIBLE(CTL+C) debit et controle reseaux internet (defaut $AFAI) ... "; sleep 120; #reglage de la tempo attente KOKKKKK stopmesure; #noter ifconfig arrivee #controler la laison internet par controle du temps moyen du ping # ( medianping imcp.ba.free.fr 4 1000 ; test "$mediantime" != ""; ) || # ( medianping culte.hd.free.fr 4 1000 ; test "$mediantime" != ""; ) || # break; #sortie de boucle de controle si aucun ping ok # # vus que les destinataires son sous forme de nom # # on teste aussi le dns # si il y a un defaut on est deja sortie de la boucle !!! # AFAI="0"; #reset du compteur : un control ok (puisque pas ou plus de defaut ) ! # medianping ntpserv 1 1000; # if test "$mediantime" != ""; then AFAI="0"; continue; fi; # OK reset default retour en someil attente medianping imcp.ba.free.fr 4 1000; if test "$mediantime" != ""; then AFAI="0"; continue; fi; # OK reset default retour en someil attente medianping culte.hd.free.fr 4 1000 ; if test "$mediantime" != ""; then AFAI="0"; continue; fi; # OK reset default retour en someil attente medianping 213.152.1.82 4 1000 ; # www.google.fr if test "$mediantime" != ""; then AFAI="0"; continue; fi; # OK reset default retour en someil attente # vus que les destinataires son sous forme de nom # on teste aussi le dns !!! # ici on a donc un defaut de reponse ou un ping long sur toutes les serveur externe teste # voir pas de dns ??? # ici a va donc controle que pppo n'est pas sature # ce qui expliquerai le fait que les ping passe difficilement calculdebit; #calculer effectif le debit par differnece entre start et stop if test "$debitok" != ""; then echo "$debitok"; # le debit effectif adsl constatee pandant la tempo est suffisant ! echo " $debitok " >>$startedlogfile; # warning KOKKKKK AFAI="0"; continue; # OK reset default retour en someil attente fi # pb de liaison confirme break; #sotrie de la boucle interne pour aller vers traitement defaut done; #on ne sort pas de cette boucle tanqu'il n y a pas de defaut # (ou un reset de para par un ctrl+C) !!! # ici on est sortie de la boucle interne de controle automatique de la laison ! # soit a la suite d'un defaut, soit par une interruption trap utilisateur ,on teste la cause : if test "$PARA" != ""; then # si sortie sur control liaison not good (toujour en automatique) # on va donc envoyer a operateur et dans les log un message de warning # et a priory en automatique arret et relancer imediatement adsl ! # au cas ou la liaison ou le fai se serait endormis !!!! COM="R"; PARA="$COM"; #faire un reset de adsl et prevoir relancer automatique #on force en mode R AFAI="$[1 + $AFAI]"; #augmenter compteur anomalie consecutive de ce FAI echo "LIAISON INTERNET DU FAI DEFFAILLANTE $AFAI"; #message oprateur (si il est la !) echo "LIAISON INTERNET DU FAI DEFFAILLANTE $AFAI" | logger -p warning; #on colle tous dans les log (tail -f /var/log/messages) defautmodulo="5"; #reglage KOKKKKK defauts consecutifs apres n tempo coupuretension=""; #non pas encore if test "$[$AFAI >= $defautmodulo]" == "1"; then # succesion de defaut apres tempo confirme if test "$[$AFAI % $defautmodulo]" == "0"; then # modulo defaut #on peute envisager une coupure ! ? if test "$[$AFAI >= 30]" == "1"; then #environ 2 heures KOKKK coupuretension="$AFAI"; #demander a tous les pc de la station de bien vouloir s'arreter ! ? KOKKKKKKKKKKK fi; pppoe -A -T 5 -I $carteinterfadsl; #test presence concentrateur adsl if test "$?" == "0"; then # ok un concetrateur reponds echo "Concentrateur detecte ; coupure courant demandee !" coupuretension="$AFAI"; #demander a tous les pc de la station de bien vouloir s'arreter ! ? KOKKKKKKKKKKK else #pas de present des concentrateurs adsl ou gros problemem KOKKKKKKKKKKK # voir si des taches de acking sont presente en webuser ???? !!!!! # if tester si le modem alavrion debite sans perte #KOKKKKKKKKKKKKKK # si c'est le cas le FAI est naze # c'est inutile de faire la coupure anticipee # attendre retour concentrateur # else # le modem a des probleme ? # envoyer octete par le modem #KOKKKKKKKKKKKKKK pppoe -A -T ............ # if modem est plante coupuretension="$AFAI"; #demander coupure pour reinitialiser modem KOKKKKKKKKKKKKKK PROVISOIRE # fi # fi # il fo eviter de couper et de relancer l'onduleur # pour instant cette partie programmen'est pas developpe # car la clef de redemarrage automatique de onduleur est sur OFF KOKKKKKKKKKKKKKK PROVISOIRE fi; fi; # fin modulo defaut fi; # fin succesion de defaut apres tempo confirme # Donc si il y a u trop de defaut consecutif , on "demande" alors arret # de tous les pc de la station de antenne etc etc en arretant onduleur 220V !!! if test "$coupuretension" != ""; then # coupure courant onduleur demandee # alors arret de tous les pc & onduleur (puis redemarrage si interrupteur demarrage possitionne) /etc/rc.d/TestBatterie ARRET_DEMANDEE_DEF_INTER; # la demande sera suivis d'effet ou pas cela depends des pc eux meme ! # l'arret de onduleur ne sera effectif que apres arret de tous les PC (test DTR) # et apres une tempo de veille electronique (regle par potentiometre) fi; #continuer tous de meme en automatique a faire des relance R de adsl ... else #reprisse en manuel suite a interruption operateur SIGINT du sleep # la variable PARA est tombee ! AFAI="0"; #reset sympa du compteur de defaut fai !! ??? #continuer en manuel et attendre la reponse operateur (PARA vide) fi; else #autre mode que la surveillance V ou R (non boucle) #par exemple : S consultation status , mise a l'heure T , .... if test "$PARA" != ""; then #if not interactive mode (lance en automatique parametre et non boucle) # le mode automatique (parametre d'appel non null) # peut etre boucle (demon r v) ou pas (appel unique ) # ici on est dans le deuxieme cas appel simple en mode non boucle # donc normalenet le programme s'arrete # apres avoir execute la commande passe en parametre appel ! # et on a normalement pas besoin de l operateur ! # cependant #lancer une tempo qui permet a l operateur de reprendre la main sur l'automatique # avant que la fenetre X ne diparaisse (debug) echo " EN ATTENTE INTERRUPTIBLE(CTL+C), AVANT ARRET MODE AUTOMATIQUE ... "; trap "PARA=\"\";" SIGINT; #passer en manuel par reset de PARA sleep 12; # laisser le temps de prendre la main avant la fin tache # TouTou Linux peut lancer cette tache dans une xterm ou # par le programme /usr/local/Ambiance/0b_login, avec le parametre R if test "$PARA" != ""; then #si toujour en automatique (pas d'interruption)(pas operateur ?) break ; #fin du programme automatique qui ne boucle pas (appel en simple commande) fi; #sinon para a etait annule: # on repart en controle manuel operateur et on utlise le menu pour debuger #en fait plusieurs programme de se type peuvent exister # un en mode demon R V (automatique boucle) # et un autre lance sous x par operateur pour suivre les status et compteurs (manuel) # ou lancer par un autre dispositif (automatique simple commnade)( script cgi ....) # les tempos et ctr+c ne sont que des transitions possibles pour retourner vers operateur fi; fi; #---------------------------------------------------------------------------- echo " ==== EN MODE : REBOUCLAGE ... "; done; #rebouclage principale ======================================= echo " FIN DE $0 $1 "; #
# 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
#


Adresse du demandeur : "18.224.37.68"

NC imcp.ba@trousperdu.org imcp.ba@free.fr IMCP Blandy Alain
Statistiques