#!/bin/sh -norc ############################################################################### # Script de configuration du firewall Netfilter # # Ce programme est distribué sous la licence GPL : # http://www.gnu.org/licenses/gpl.html # # L'auteur ne fournit aucune garentie quand à son fonctionnement, et ne peut # pas être tenu pour responsable quand à son utilisation ou à son bon # fonctionnement # # L'emplacement permanent de la documentation de ce programme est disponible # ici : http://olivieraj.free.fr/fr/linux/programme/netfilter_cfg/ # # Auteur: Olivier Allard-Jacquin # Version: $VERSION # Créé le: 2003/02/22 Dernière modification le : 2004/03/08 ############################################################################### VERSION="0.5.8alpha2" ############################################################################### # Historique du programme # # 2004/03/07 - Version 0.5.8 # - Ajout du support du client BitTorrent # - Ajout du paramètre "--lan-dhcp-server" afin autoriser les broadcasts DHCP du LAN (idée de # Christian Chanuel) # - L'option "-wan-xmule-server" est renommée en "--wan-xmule" # - Correction du "wan-gateway", et d'un possible port scaning de la part de # la passerelle # - TODO : Revoir complètement le support du port forwarding !!! # - REMARQUE : Ceci est une version publique mais non finalisée de la $VERSION. # Le programme marche, mais des fonctionnalités supplémentaires sont à # rajouter. # # 2004/03/03 - Version 0.5.7 # - Ajout du support du client GnomeMeeting # # 2004/02/29 - Version 0.5.6 # - Ajout de filtrages plus restrictifs pour l'ADSL degroupé, et corrections # pour le "wan-gateway" # - Ajout du support du client xMule # - Corrections sur le chargement des modules # - Ajout du paramètre "--silence" # - Correction du problèmes des adresses IP multiples sur une interface réseau # # 2003/11/02 - Version 0.5.5 # - Correction des règles anti-spoofing # - Ajout du "--wait-connexion" (Jak Highlander) # - Ameliorations de "DebugWrite" # - Ajout du support pour les serveurs Jabber, HTTP, et SSH # (Antoine Büsch et JP Sylvanie) # - Correction de la règle de LOG pour LOG_LOG_LEVEL (Christian Chanuel) # # 2003/07/17 - Version 0.5.4 # - Rajout de "-m state --state ! INVALID" aux règles internes # - Ajout des fonctions "LogDropWrite" et "LogDropWrite" # - Corrections majeurs pour le mode "wan-gateway" # - Utilisation de variables pour charger les modules # - Modifications du systeme de log (Creation de $LOG_TABLES) # - Ajout des protections anti-spoofing et anti-ping du kernel # # 2003/06/12 - Version 0.5.3 # - Déplacement de l'appel de la routine "ForceDropRules" # # 2003/06/11 - Version 0.5.2 # - Première version publique # # 2003/02/22 - Version 0.0.1 # - Première version privée, puis divers modifications successives # ############################################################################### PROGRAM_NAME=`echo $0 | sed 's/.*\///g'` # Définition des reseaux suivant la syntaxe NETWORK_DEFINITION # NETWORK_DEFINITION: Interface|Adresse IP|Masque|Broadcast|Adresse IP passerelle|[Options] # # "Adresse IP passerelle" : NE REMPLISSEZ PAS CE CHAMPS. Même si vous êtes dans un réseau local # et que vous utilisez une passerelle pour sortir de votre réseau, NE REMPLISSEZ PAS CE CHAMPS. # En effet, ce programme se chargera tout seul de trouver l'adresse IP de votre passerelle, donc # il ne prendra pas du tout en compte l'information que vous mettrez ici... # # [Options] : Différentes options concerant la connexion réseau. # - "routable/non_routable" indique si le réseau est routable ou pas vers le WAN. 2 valeurs # sont possibles: "routable" ou "non_routable" # # - "degroupe" indique si l'interface réseau est un modem ADSL sur zone dégroupé. Même en cas # d'utilisation d'un modem ADSL dégroupé, il N'est PAS nécéssaire de renseigner le champs # "Adresse IP routeur" # # - "dhcp_server" rajoute une rêgle autorisant la carte réseau local de répondre aux requêtes # DHCP. Ceci est nécessaire si la machine fait tourner un serveur DHCP sur cette interface # réseau. # # Chaque valeur du champ "Options" DOIT ETRE SEPAREE PAR DES ":". # Exemple :"non_routable:degroupe" # LAN[0]="eth1|192.168.0.1|255.255.255.0|192.168.0.255||routable" LAN[1]="eth0|||||non_routable:degroupe" LO="lo|127.0.0.1|255.0.0.0|127.255.255.255|" # Chemins des programmes importants IFCONFIG=/sbin/ifconfig IPTABLES=/usr/sbin/iptables MODPROBE=/sbin/modprobe ROUTE=/sbin/route # Affichage des messages de debug ("y" ou "n") DEBUG_DISPLAY=n # Affichage des règles d'iptables utilisées ("y" ou "n") IPTABLES_DEBUG_DISPLAY=n # Fichier de debug: Mettre "DEBUG_FILE=/dev/null" si aucun fichier de debug n'est désiré # Par defaut, le fichier de debug est crée dans "/tmp" et a pour nom le nom du script # et son PID #DEBUG_FILE=/tmp/$PROGRAM_NAME.$$ #DEBUG_FILE=/dev/null # On peut aussi placer le fichier de debug dans le répertoire /var/log. C'est un endroit # logique pour ce fichier, mais il faut penser à le supprimer de temps en temps, histoire # de libérer de l'espace disque. Ou de l'inclure dans le "log rotate" DEBUG_FILE=/var/log/$PROGRAM_NAME # Systeme de log: # Par défaut, toutes les trames qui ne satisfont pas au règles définies dans ce script # sont stockés ("loggés") dans le fichier de log par défaut, à savoir le /var/log/messages. # - On peut utiliser la technique du "--log-level" afin d'isoler ces informations dans un # fichier à part (solution peu pratique, car d'autres messages du kernel seront stockés en # même temps dans ce fichier). # - Sinon on peut utiliser la technique du ULOG (le LOG dans le User-space) qui permet de # stocker ces informations beaucoup plus finement, au prix de l'installation et de la # configuration du demon ulogd. # - Enfin on peut ne pas logger les paquets avant leur destruction # # LOG_TYPE: # - LOG_TYPE=LOG (utilisation du système de log traditionnel, via syslogd) # - LOG_TYPE=ULOG (utilisation du demon ULOG) # - LOG_TYPE=NO_LOG (auncun log n'est fait, les trames sont detruites sabs en garder de trace) LOG_TYPE=LOG # # LOG_PREFIX: Prefix du log par defaut des messages # On peut rajouter "\$T" et/ou "\$C" pour afficher respectivement # les noms des tables / chaines #LOG_PREFIX=DefaultDrop #LOG_PREFIX=DefaultDrop-\$T-\$C LOG_PREFIX=\$T-\$C # # # Remarques pour l'utilisation de ULOG: # - Votre kernel doit être assez récent (>= 2.4.18-pre8) # - Vous devez l'avoir compilé avec l'option "CONFIG_IP_NF_TARGET_ULOG=m" # - Le module "ipt_ULOG.o" doit être présent dans votre distribution # (/lib/modules//kernel/net/ipv4/netfilter/ipt_ULOG.o.gz par exemple) # - Le demon ulog (ulogd) doit s'executer sur votre machine # Pour touts information concernant ULOG: http://www.gnumonks.org/projects/ # # LOG_LOG_LEVEL: Definit le niveau de log à utiliser si LOG_TYPE=LOG. "man 8 syslogd" pour # plus d'informations LOG_LOG_LEVEL=info # # Definit quelles sont les tables dont il faut loger les cibles par defaut # Tous paquets passant toutes les règles se retrouve au final à passer par la # cible par defaut (ou "politique par défaut"), et peut-être logé # La valeur attendu pour LOG_TABLES est une suite de # [nom de table]:[nom de chaine] separées par des "|" : # filter:INPUT|filter:FORWARD|filter:OUTPUT, # nat:PREROUTING|nat:OUTPUT|nat:POSTROUTING # mangle:PREROUTING|mangle:INPUT|mangle:FORWARD|mangle:OUTPUT|mangle:POSTROUTING #LOG_TABLES="filter:INPUT | filter:FORWARD | filter:OUTPUT |\ # nat:PREROUTING | nat:OUTPUT | nat:POSTROUTING |\ # mangle:PREROUTING | mangle:INPUT | mangle:FORWARD | mangle:OUTPUT | mangle:POSTROUTING" LOG_TABLES="filter:INPUT | filter:FORWARD | filter:OUTPUT" # Liste des parametres # Chaque parametre est composé d'un certain nombre d'options, séparées par des "," # - Option 1: Le nom du parametre # - Option ?: zero, une, ou plusieurs option(s) attendue(s) # - Dernière option: La valeur par defaut, si aucun parametre n'est donne # Remarque: Si il n'y a que "Option 1", c'est que le paramètre n'attend aucune option WAITING_PARAMETERS[0]="--help" WAITING_PARAMETERS[1]="--drop-rules|on|off|on" WAITING_PARAMETERS[2]="--spoofing-filter|on|off|on" WAITING_PARAMETERS[3]="--nat|on|off|on" WAITING_PARAMETERS[5]="--wait-connexion|on|off|off" WAITING_PARAMETERS[6]="--wan-ping|on|off|off" WAITING_PARAMETERS[7]="--wan-to-server|on|off|off" WAITING_PARAMETERS[8]="--wan-ftp-server|on|off|off" WAITING_PARAMETERS[9]="--wan-ssh-server|on|off|off" WAITING_PARAMETERS[10]="--wan-http-server|on|off|off" WAITING_PARAMETERS[11]="--wan-jabber-server|on|off|off" WAITING_PARAMETERS[12]="--wan-xmule|on|off|on" WAITING_PARAMETERS[13]="--wan-gnomemeeting|on|off|off" WAITING_PARAMETERS[14]="--wan-bittorrent|on|off|on" WAITING_PARAMETERS[15]="--lan-dhcp-server|on|off|off" WAITING_PARAMETERS[16]="--silence|on|off|off" WAITING_PARAMETERS[17]="start" WAITING_PARAMETERS[18]="stop" WAITING_PARAMETERS[19]="restart" # Règles iptables supprimant purement et simplement certaines trames # C'est pratique, afin d'éviter la pollution du fichier de log (/var/log/messages par defaut) # Syntaxe: Chaîne|Interface|Adresse ou réseau source|Adresse ou réseau cible| \ # Type de port|Port source|Port cible # Remarque: Certains champs peuvent être vides # Par la suite, cette définition de syntaxe sera appellee "DROP_DEFINITION" DROP[0]="INPUT|eth0|||tcp||4660:4700"; # scans ed2k DROP[1]="INPUT|eth0|||udp||4660:4700"; # scans ed2k DROP[2]="INPUT|eth0|||tcp||6881:6999"; # scans bittorrent DROP[3]="INPUT|eth0|||udp||6881:6999"; # scans bittorrent DROP[4]="INPUT|eth0|||tcp||10738" DROP[5]="INPUT|eth0|||udp||10738" DROP[6]="INPUT|eth0|||tcp||139"; # scans frequents DROP[7]="INPUT|eth0|||udp||1026"; # scans frequents DROP[8]="INPUT|eth0|||udp||1027"; # scans frequents DROP[9]="INPUT|eth0|||udp||1900"; # scans frequents DROP[10]="INPUT||206.135.0.0/16||||"; # www.baytsp.com (analyseurs du trafic de P2P) # Paramètres pour le serveur Tactical Ops TO_PORT=7777 TO_WAN_BROADCAST=n TO_LAN_BROADCAST=y # Paramètres pour le serveur FTP #FTP_DATA_PORT=ftp-data FTP_CMD_PORT=ftp # Parametres pour le serveur HTTP # Si vous voulez fermer un de ces port, il suffit de commenter la ligne du port en question # Par exemple, si vous voulez fermer le port "https" (443), mettre un "#" devant la ligne "HTTPS_PORT=https" : "#HTTPS_PORT=https" HTTP_PORT=www HTTPS_PORT=https # Parametre pour le serveur SSH SSH_PORT=ssh # Parametres pour le serveur Jabber JABBER_C2S_PORT=5222 JABBER_S2S_PORT=5269 # Parametres pour GnomeMeeting (GM) # GnomeMeeting est une fabuleux logiciel de conférence audio, video et texte # Il permet de faire communiquer plusieurs utilisateurs à travers Internet # Consultez la documentation de GnomeMeeting pour plus d'informations sur # les besoins d'ouvertures de ports : http://www.gnomemeeting.org/index.php?rub=3&pos=0&faqpage=x266.html#AEN278 # - GM_TCP_LISTENING_PORT : Port principal de GnomeMeeting (protocol H.323) GM_TCP_LISTENING_PORT=1720 # - GM_RTP_PORT_RANGE : Ports pour connexion RTP # (2 ports audio, 2 video - RTP et RTCP) GM_RTP_PORT_RANGE=5000:5007 # - GM_TCP_PORT_RANGE : Port pour connexion H245, si on n'utilise pas le tunnel H.245 # Ceci est nécéssaire afin de dialoguer avec des utilisateurs utilisant # le programme "NetMeeting" sous Windows GM_TCP_PORT_RANGE=30000:30010 # - GM_GK_PORT_RANGE : Utile si on utilise une passerelle GateKeeper (inutile pour une # connexion directe à Internet, ie : sans passerelle) #GM_GK_PORT_RANGE=5010:5013 # Paramètres pour le client xMule # xMule est un logiciel de Peer-to-peer, utilisant sur les réseaux "eMule" XMULE_TCP_PORT=7000 XMULE_UDP_PORT=7001:7003 # Parametres pour BitTorrent (BT) # BitTorrent est un logiciel de peer-to-peer, à la manière de "xMule". # Contrairement à xMule, il utilise un plage de ports TCP "flottants" de 6881 à 6999 # On peut change la plage de port sur lesquels BT écoute en lancant le programme BT # avec les options "--minport" et "--maxport" #BT_PORT_RANGE=6881:6999 BT_PORT_RANGE=5300 # Vous pouvez aussi décidez d'heberger un "tracker" BitTorrent, auquel cas il # vous faudra ouvrir un port supplémentaire. Mais cela consommera plus de bande passante # en upload #BT_TRACKER_PORT=6969 # Liste des modules principaux à charger # Netfilter / iptables sont parfois (souvant ?) compilé en modules, il # faut donc charger les modules adéquats MODULES="ip_tables\ ip_conntrack\ ip_conntrack_ftp\ ip_conntrack_irc\ iptable_mangle" # Liste des modules spécifiques au NAT à charger # Ces modules seront UNIQUEMENT chargés si l'option "--nat" est à "on" MODULES_NAT="iptable_nat\ ip_nat_ftp\ ip_nat_irc" # Active une protection du kernel sur les adressses IP sources et destination # Si un paquet arrive sur une interface dont l'adresse IP se trouve sur une # autre interface, cette protection empèchera le kernel de faire transiter les # paquets d'une interface à l'autre KERNEL_SPOOFING_PROTECTION=y # Active une protection du kernel qui interdit toute les réponses aux ping. # Cette protection a lieu avec les interfaces réseaux externes ET internes, ce # N'est donc PAS systématiquement une bonne idée de l'utiliser... # Si on craint plus le ping sur l'interface réseau externe, il vaut mieux # utiliser le paramètre "--wan-ping off" KERNEL_PING_PROTECTION=n ############################################################################### # FIN DES PARAMETRES DE CONFIGURATION DU SCRIPT # # L'utilisateur est invité A NE PAS modifier la suite du programme ... # ############################################################################### # Liste des variables globales non declarees ci-dessus: # NETWORK_TYPE: Initialise par "MainProgramInit", assignee par "NetworkConfiguration" # WAN: Initialise par "MainProgramInit", assignee par "NetworkConfiguration" # PARAMETERS: Initialise et assignee par "ParametersAnalysis" ############################################################################### # Affiche un message d'aide # # Créé le: 2003/04/12 Dernière modification le : 2003/12/07 ############################################################################### DisplayHelp () { local ProgramName ProgramName=`echo $0 | sed "s/.*\///g"` echo -e "\n $ProgramName v$VERSION" echo -e "\nUsage: $ProgramName [--drop-rules ]" echo -e " [--nat ] [--spoofing-filter ] [--help]" echo -e " [--wait-connexion] [--wan-ping ]" echo -e " [--wan-to-server ] [--wan-ftp-server ]" echo -e " [--wan-ssh-server ] [--wan-http-server ]" echo -e " [--wan-jabber-server ]" echo -e " [--wan-xmule ] [--wan-gnomemeeting ]" echo -e " [--wan-bittorrent ]" echo -e " [--lan-dhcp-server ]" echo -e " [--silence ]" echo -e "\nOptions:" echo -e "--drop-rules Active/desactive le rejet automatique de certains paquets" echo -e " Defaut: `GetDefaultValue --drop-rules`" echo -e "--nat Active/desactive le fonctionnement en passerelle Internet" echo -e " Defaut: `GetDefaultValue --nat`" echo -e "--spoofing-filter Active/desactive les regles anti-spoofing" echo -e " Defaut: `GetDefaultValue --spoofing-filter`" echo -e "--wait-connexion Entre dans une boucle en attendant que la machine soit connectée" echo -e " Defaut: `GetDefaultValue --wait-connexion`" echo -e "--wan-ping Autorise ou nom la machine à repondre aux ping" echo -e " Defaut: `GetDefaultValue --wan-ping`" echo -e "--wan-to-server Active/desactive le serveur Tactical Op Internet" echo -e " Defaut: `GetDefaultValue --wan-to-server`" echo -e "--wan-ftp-server Active/desactive le serveur FTP Internet" echo -e " Defaut: `GetDefaultValue --wan-ftp-server`" echo -e "--wan-ssh-server Active/desactive le serveur SSH Internet" echo -e " Defaut: `GetDefaultValue --wan-ssh-server`" echo -e "--wan-http-server Active/desactive le serveur HTTP Internet" echo -e " Defaut: `GetDefaultValue --wan-http-server`" echo -e "--wan-jabber-server Active/desactive le serveur Jabber Internet" echo -e " Defaut: `GetDefaultValue --wan-jabber-server`" echo -e "--wan-xmule Autorise ou non les connexions rentrantes xMule" echo -e " Defaut: `GetDefaultValue --wan-xmule`" echo -e "--wan-gnomemeeting Autorise ou nom les connexions rentrentes GnomeMeeting" echo -e " Defaut: `GetDefaultValue --wan-gnomemeeting`" echo -e "--wan-bittorrent Autorise ou nom les connexions rentrentes BitTorrent" echo -e " Defaut: `GetDefaultValue --wan-bittorrent`" echo -e "--lan-dhcp-server Active/desactive le serveur DHCP du réseau local" echo -e " Defaut: `GetDefaultValue --lan-dhcp-server`" echo -e "--silence Affiche des messages à l'écran" echo -e " Defaut: `GetDefaultValue --silence`" echo -e "--help Affiche l'aide" echo -e "\nExemples:" echo -e " $ProgramName --nat on --wan-to-server on --wan-ftp-server off" echo -e "La machine est configuree pour faire du NAT et serveur Tactical Ops." echo -e "Le serveur FTP est arrete" echo -e "\n" } ############################################################################### # Initialisation des variables du programme principal # # Créé le: 2003/02/22 Dernière modification le : 2003/07/17 ############################################################################### MainProgramInit () { local I local Cpt # Initialise les variables globales NETWORK_TYPE="none" WAN="none|none|none|none|non_routable" # Analyse des parametres ParametersAnalysis $@ # Affichage des parametres par defaut: if [ "`GetParameter --silence`" == "on" ]; then # N'affiche rien DEBUG_DISPLAY="n" fi # Initialisation du fichier de debug: DebugWrite "" DebugWrite "+ Lancement de $0 version $VERSION (`date "+%Y-%m-%d (%A %d %B %Y) - %X"`)" if [ "$#" == "0" ]; then DebugWrite "+ Utilisation des parametres par defaut:" Cpt=0 for I in `echo ${PARAMETERS[@]}`; do DebugWrite " `echo $I | cut -d'|' -f1`: `echo $I | cut -d'|' -f2`" Cpt=$(( $Cpt + 1)) done DebugWrite " (Utilisez '--help' pour avoir de l'aide)" else # Affichage des parametres DebugWrite "+ Parametres utilisateur:" Cpt=0 for I in `echo ${PARAMETERS[@]}`; do DebugWrite " $Cpt: '`echo $I | cut -d'|' -f1`' <-> '`echo $I | cut -d'|' -f2`'" Cpt=$(( $Cpt + 1)) done fi } ############################################################################### # Ecrit (et eventuellement affiche ($DEBUG_DISPLAY)) un message ($1) dans le # fichier de debug ($DEBUG_FILE) # Si des paramètres spéciaux doivent être passés à la commande "echo", les # mettre en temps que $2, $3, etc... Exemple : DebugWrite "Hello world" -n # où "-n" indique à "echo" de ne pas générer de retour chariot # # Créé le: 2003/02/22 Dernière modification le : 2003/07/29 ############################################################################### DebugWrite () { local Message Message=$1 shift 1 if [ "$DEBUG_DISPLAY" == "y" ]; then # On afficher le message a l'ecran if [ -z "$Message" ]; then echo elif [ "$Message" == "." ]; then echo -e $@ $Message else echo -e $@ "#D# $Message" fi fi # Ecriture du message dans le fichier de debug if [ -z "$Message" ]; then echo >> $DEBUG_FILE elif [ "$Message" == "." ]; then echo -e $@ $Message >> $DEBUG_FILE else echo -e $@ "#D# $Message" >> $DEBUG_FILE fi } ############################################################################### # Affiche eventuellement ($IPTABLES_DEBUG_DISPLAY) un message de debug de règle # iptable # # Créé le: 2003/03/15 Dernière modification le : 2003/07/16 ############################################################################### IptablesDebugWrite () { if [ "$IPTABLES_DEBUG_DISPLAY" == "y" ]; then # On afficher le message a l'ecran echo "#DI# $1" fi # Ecriture du message dans le fichier de debug echo "#DI# $1" >> $DEBUG_FILE } ############################################################################### # Lance (et eventuellement affiche ($IPTABLES_DEBUG_DISPLAY) une règle iptable. # La règle est stocké dans le fichier de debug ($DEBUG_FILE) # # Créé le: 2003/03/15 Dernière modification le : 2003/07/16 ############################################################################### IptablesWrite () { # Execute la commande iptable $@ # Affiche eventuellement la table if [ "$IPTABLES_DEBUG_DISPLAY" == "y" ]; then # On afficher ta règle a l'ecran echo "#I# $@" fi # Ecriture de la règle dans le fichier de debug echo "#I# $@" >> $DEBUG_FILE } ############################################################################### # Affiche un message d'erreur, et arrete le programme # # Créé le: 2003/02/22 Dernière modification le : 2003/02/22 ############################################################################### ErrorWrite () { DebugWrite "##### ERREUR: $1" echo -e "\n\n##### ERREUR: $1\n" echo -e "##### Fichier de debug: $DEBUG_FILE\n" exit 1 } ############################################################################### # Ecrit une chaine iptables permettant: # - de logger le paquet avec prefix "LogDrop" # - de jeter ("dropper") le paquer # # Créé le: 2003/06/19 Derniere modification le : 2003/06/19 ############################################################################### LogDropWrite () { IptablesWrite $IPTABLES -N LogDrop IptablesWrite $IPTABLES -A LogDrop -j LOG --log-prefix LogDrop IptablesWrite $IPTABLES -A LogDrop -j DROP } ############################################################################### # Retourne la configuration reseau: # "lan none none": Pas de connexion a Internet. Seul les réseaux locaux existent # "wan-gateway eth1 none": Connexion a Internet par une passerelle accessible # via une carte reseau (ici "eth1") # "wan-modem ppp0 81.15.45.168": Connexion a Internet par un modem (ici "ppp0") # ou par une interface ethernet (exemple: ADSL), # avec une adresse IP externe (ici 81.15.45.168) # Les variables globales suivantes sont respectivement remplies: # $NETWORK_TYPE $WAN # # Créé le: 2003/02/22 Dernière modification le : 2004/02/17 ############################################################################### NetworkConfiguration () { local WanLan local WanInterface local WanIP local GatewayIP # Attend que la connexion soit établie if [ "`GetParameter --wait-connexion`" == "on" ]; then DebugWrite "+ En attente de la connexion " -n until $ROUTE -n | grep -q '^0\.0\.0\.0'; do DebugWrite "." -n sleep 1; done DebugWrite fi # Cherche si il y a une route par defaut WanInterface="`$ROUTE -n | grep '^0\.0\.0\.0'`" if [ -n "$WanInterface" ]; then # Oui, il y a une route par defaut # Donc une connexion à Internet # Recupère l'adresse IP de la passerelle, si nécéssaire GatewayIP=`echo $WanInterface | sed 's/^0\.0\.0\.0 *\([\.0-9]*\) .*/\1/g'` # Recherche du nom de l'interface WanInterface=`echo $WanInterface | sed 's/.* \([[:alnum:]]*\)$/\1/g'` if [ -z "$WanInterface" ]; then # Impossible de trouver la route par defaut (a prioris, c'est irrealisable ...) ErrorWrite "Erreur de $ROUTE: Aucun adaptateur reseau trouve pour la route par defaut" else DebugWrite "+ Connexion à Internet via: $WanInterface" case "`echo $WanInterface | sed 's/[0-9]$//g'`" in eth) # L'adaptateur Internet est une carte réseau # Mais est-ce : # - un réseau local connecté à une passerelle (NETWORK_TYPE=wan-gateway) ? # - un modem ADSL dégroupé (NETWORK_TYPE=wan-modem) ? # La difference est importante, car dans le 2nd cas, il faut restraindre les connexions des autres # adresses de la classe du FAI, afin de protéger la machine. WanLan=${LAN[`GetLanNumberFromInterface $WanInterface`]} WanIP=`$IFCONFIG $WanInterface | grep "inet addr" | \ sed "s/^[: a-z]*\([.0-9]*\).*/\1/g"` WanBcast=`$IFCONFIG $WanInterface | grep "Bcast" | \ sed "s/^[: a-z]*\([.0-9]*\).*/\1/g"` WanMask=`$IFCONFIG $WanInterface | grep "Mask" | \ sed "s/^[: a-z]*\([.0-9]*\).*/\1/g"` if [ -z "`IsUngrouped $WanLan`" ]; then DebugWrite " - Type d'adaptateur Internet: Carte réseau ($WanInterface/$WanIP)" NETWORK_TYPE=wan-gateway else DebugWrite " - Type d'adaptateur Internet: Modem ADSL dégroupé ($WanInterface/$WanIP)" NETWORK_TYPE=wan-modem fi DebugWrite " - Adresse IP passerelle: $GatewayIP" WAN="${WanInterface}|$WanIP|$WanMask|$WanBcast|$GatewayIP" ;; ppp) # L'adaptateur Internet est un modem (ADSL ou RTC) DebugWrite " - Type d'adaptateur Internet: Modem ADSL ou RTC" NETWORK_TYPE=wan-modem # Recuperation de l'adresse IP public WanIP=`$IFCONFIG | grep "P-t-P" | sed "s/^[: a-z]*\([.0-9]*\).*/\1/g"` if [ -z "$WanIP" ]; then # Impossible de trouver l'adresse IP Internet (a prioris, c'est irrealiste ...) ErrorWrite "Erreur de $IFCONFIG: Aucune adresse IP Internet" else # L'adresse IP Internet a ete trouvee DebugWrite " - Adresse IP Internet: $WanIP" WAN="${WanInterface}|$WanIP|none|none|non_routable" fi ;; esac fi else # La machine n'a pas de route par defaut. # Elle est connectee uniquement au reseau local DebugWrite "+ Pas de connexion a Internet" NETWORK_TYPE=lan fi # Retourne le resultat: # echo $NETWORK_TYPE `GetInterface $WAN` `GetIP $WAN` `GetMask $WAN` `GetNetwork $WAN` `GetBroadcast $WAN` `GetGateway $WAN` } ############################################################################### # Retourne le numero du reseau de la variable LAN, dont le nom de l'interface # reseau est le parametre $1 # Exemple: $1="eth1" # LAN[0]=eth0|..." # LAN[1]=eth0:0|..." # LAN[2]=eth1|..." # Resultat: "2" # # Créé le: 2003/07/17 Dernière modification le : 2003/07/17 ############################################################################### GetLanNumberFromInterface () { local LanIndex LanIndex=0 for I in `echo ${LAN[@]}`; do if [ "$1" == "`GetInterface $I`" ]; then echo $LanIndex break fi LanIndex=$(( $LanIndex + 1)) done } ############################################################################### # Recherche dans "/proc/net/dev" si l'interface du parametre $1 existe # Retourne $1 si l'interface existe, rien sinon # # Créé le: 2003/07/18 Dernière modification le : 2003/07/18 ############################################################################### IsAvailableInterface () { for I in `grep "^ *[a-zA-Z0-9]*:" /proc/net/dev | sed "s/^ *\([a-zA-Z0-9]*\).*/\1/g"`; do if [ "$1" == "$I" ]; then echo $1 break fi done } ############################################################################### # Retourne le nom de l'interface reseau contenu dans le parametre $@ # $@=[Utilisation de la syntaxe NETWORK_DEFINITION] # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||routable" # Resultat: eth0 # # Créé le: 2003/02/22 Dernière modification le : 2004/02/17 ############################################################################### GetInterface () { echo $@ | cut -d'|' -f1 } ############################################################################### # Retourne l'adresse IP contenue dans le parametre $@ # $@=[Utilisation de la syntaxe NETWORK_DEFINITION] # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||routable" # Resultat: 192.168.1.1 # # Créé le: 2003/02/22 Dernière modification le : 2004/02/17 ############################################################################### GetIP () { echo $@ | cut -d'|' -f2 } ############################################################################### # Retourne le masque de sous-reseau contenu dans le parametre $@ # $@=[Utilisation de la syntaxe NETWORK_DEFINITION] # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||routable" # Resultat: 255.255.255.0 # # Créé le: 2003/02/22 Dernière modification le : 2004/02/17 ############################################################################### GetMask () { echo $@ | cut -d'|' -f3 } ############################################################################### # Retourne le reseau contenu dans le parametre $@ # $@=[Utilisation de la syntaxe NETWORK_DEFINITION] # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||routable" # Resultat: 192.168.1.1/255.255.255.0 # # Créé le: 2003/02/22 Dernière modification le : 2004/02/17 ############################################################################### GetNetwork () { echo $@ | cut -d'|' -f2,3 | sed "s/|/\//g" } ############################################################################### # Retourne l'adresse de broadcast contenu dans le parametre $@ # $@=[Utilisation de la syntaxe NETWORK_DEFINITION] # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||routable" # Resultat: 192.168.1.255 # # Créé le: 2003/02/22 Dernière modification le : 2004/02/17 ############################################################################### GetBroadcast () { echo $@ | cut -d'|' -f4 } ############################################################################### # Retourne l'adresse de la passerelle contenu dans le parametre $@ # $@=[Utilisation de la syntaxe NETWORK_DEFINITION] # Exemple: $@="eth0|192.168.1.1|none|none|192.168.1.254|" # Resultat: 192.168.1.254 # # Créé le: 2003/06/19 Derniere modification le : 2004/02/17 ############################################################################### GetGateway () { echo $@ | cut -d'|' -f5 } ############################################################################### # Retourne les options de la connexion reseau # $@=[Utilisation de la syntaxe NETWORK_DEFINITION] # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||routable degroupe" # Resultat: "routable degroupe" (2 parametres ici) # # Créé le: 2003/06/19 Derniere modification le : 2004/03/07 ############################################################################### GetOptions () { echo $@ | cut -d'|' -f6 } ############################################################################### # Retourne "" si le reseau n'est pas routable (extrait cette infomation du # parametre "$@") # $@=[Utilisation de la syntaxe NETWORK_DEFINITION] # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||routable" # Resultat: routable # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||non_routable" # Resultat: # # Créé le: 2003/03/12 Dernière modification le : 2004/03/07 ############################################################################### IsRoutable () { GetOptions $@ | grep -v "non_routable" | sed "s/.*\(routable\).*/\1/g" } ############################################################################### # Retourne "" si la connexion ADSL reseau n'est pas degroupe (extrait cette # infomation du parametre "$@") # $@=[Utilisation de la syntaxe NETWORK_DEFINITION] # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||non_routable degroupe" # Resultat: degroupe # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||routable" # Resultat: # # Créé le: 2004/02/17 Dernière modification le : 2004/03/07 ############################################################################### IsUngrouped () { GetOptions $@ | grep "degroupe" } ############################################################################### # Retourne "" si la carte réseau ne fait pas fonctionner un serveur DHCP # (extrait cette infomation du parametre "$@") # $@=[Utilisation de la syntaxe NETWORK_DEFINITION] # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||non_routable degroupe" # Resultat: degroupe # Exemple: $@="eth0|192.168.1.1|255.255.255.0|192.168.1.255||routable" # Resultat: # # Créé le: 2004/03/07 Dernière modification le : 2004/03/07 ############################################################################### IsDhcpServer () { GetOptions $@ | grep "dhcp_server" } ############################################################################### # Retourne la chaîne "filter" contenu dans le parametre $1 # $1=[Utilisation de la syntaxe DROP_DEFINITION] # Exemple: $1="INPUT|ppp0|50.26.8.0/24|80.8.6.9|tcp|5690|4660:4700" # Resultat: INPUT # # Créé le: 2003/03/16 Dernière modification le : 2003/07/16 ############################################################################### GetDropChaine () { echo $1 | cut -d'|' -f1 } ############################################################################### # Retourne l'interface contenue dans le parametre $1 # $1=[Utilisation de la syntaxe DROP_DEFINITION] # Exemple: $1="INPUT|ppp0|50.26.8.0/24|80.8.6.9|tcp|5690|4660:4700" # Resultat: ppp0 # # Créé le: 2003/03/16 Dernière modification le : 2003/03/16 ############################################################################### GetDropInterface () { echo $1 | cut -d'|' -f2 } ############################################################################### # Retourne l'adresse ou le réseau SOURCE contenu dans le parametre $1 # $1=[Utilisation de la syntaxe DROP_DEFINITION] # Exemple: $1="INPUT|ppp0|50.26.8.0/24|80.8.6.9|tcp|5690|4660:4700" # Resultat: 50.26.8.0/24 # # Créé le: 2003/03/16 Dernière modification le : 2003/03/16 ############################################################################### GetDropSourceIP () { echo $1 | cut -d'|' -f3 } ############################################################################### # Retourne l'adresse ou le réseau CIBLE contenu dans le parametre $1 # $1=[Utilisation de la syntaxe DROP_DEFINITION] # Exemple: $1="INPUT|ppp0|50.26.8.0/24|80.8.6.9|tcp|5690|4660:4700" # Resultat: 80.8.6.9 # # Créé le: 2003/03/16 Dernière modification le : 2003/03/16 ############################################################################### GetDropTargetIP () { echo $1 | cut -d'|' -f4 } ############################################################################### # Retourne le type de protocol contenu dans le parametre $1 # $1=[Utilisation de la syntaxe DROP_DEFINITION] # Exemple: $1="INPUT|ppp0|50.26.8.0/24|80.8.6.9|tcp|5690|4660:4700" # Resultat: tcp # # Créé le: 2003/03/16 Dernière modification le : 2003/03/16 ############################################################################### GetDropProtocol () { echo $1 | cut -d'|' -f5 } ############################################################################### # Retourne le port SOURCE contenu dans le parametre $1 # $1=[Utilisation de la syntaxe DROP_DEFINITION] # Exemple: $1="INPUT|ppp0|50.26.8.0/24|80.8.6.9|tcp|5690|4660:4700" # Resultat: 5690 # # Créé le: 2003/03/16 Dernière modification le : 2003/03/16 ############################################################################### GetDropSourcePort () { echo $1 | cut -d'|' -f6 } ############################################################################### # Retourne le port CIBLE contenu dans le parametre $1 # $1=[Utilisation de la syntaxe DROP_DEFINITION] # Exemple: $1="INPUT|ppp0|50.26.8.0/24|80.8.6.9|tcp|5690|4660:4700" # Resultat: 4660:4700 # # Créé le: 2003/03/16 Dernière modification le : 2003/03/16 ############################################################################### GetDropTargetPort () { echo $1 | cut -d'|' -f7 } ############################################################################### # Pour $1 contenant un nom de table et un nom de chaine, sépares par un ":" # retourne le nom de la table # Exemple: $1="filter:OUTPUT" , retourne "filter" # # Créé le: 2003/07/08 Dernière modification le : 2003/07/08 ############################################################################### GetTable () { echo $1 | cut -d':' -f1 } ############################################################################### # Pour $1 contenant un nom de table et un nom de chaine, sépares par un ":" # retourne le nom de la chaine # Exemple: $1="filter:OUTPUT" , retourne "OUTPUT" # # Créé le: 2003/07/08 Dernière modification le : 2003/07/08 ############################################################################### GetChaine () { echo $1 | cut -d':' -f2 } ############################################################################### # Charge les differents modules dont on aura besoin # La liste des modules à charger se trouve dans $MODULES # # Créé le: 2003/02/22 Dernière modification le : 2003/12/12 ############################################################################### ModulesInit () { DebugWrite "+ Chargement des modules d'IpTables" IptablesDebugWrite "+ Chargement des modules d'IpTables" # Chargement des modules for I in $MODULES; do IptablesWrite $MODPROBE $I done } ############################################################################### # Initialise IpTables, en effacant toutes les tables predefinies, et en # interdisant tout echange reseau # # Créé le: 2003/02/22 Dernière modification le : 2003/07/08 ############################################################################### NetFilterInit () { DebugWrite "+ Initialisation d'Iptables" IptablesDebugWrite "+ Initialisation d'IpTables" IptablesDebugWrite " - Initialise la table Filter (par defaut, tout les echanges sont refuses)" IptablesWrite $IPTABLES -t filter -F IptablesWrite $IPTABLES -t filter -X IptablesWrite $IPTABLES -t filter -P INPUT DROP IptablesWrite $IPTABLES -t filter -P FORWARD DROP IptablesWrite $IPTABLES -t filter -P OUTPUT DROP IptablesDebugWrite " - Initialise la table NAT (par defaut, tout les echanges sont actives)" IptablesWrite $IPTABLES -t nat -F IptablesWrite $IPTABLES -t nat -X IptablesWrite $IPTABLES -t nat -P PREROUTING ACCEPT IptablesWrite $IPTABLES -t nat -P OUTPUT ACCEPT IptablesWrite $IPTABLES -t nat -P POSTROUTING ACCEPT IptablesDebugWrite " - Initialise la table MANGLE (par defaut, tout les echanges sont actives)" IptablesWrite $IPTABLES -t mangle -F IptablesWrite $IPTABLES -t mangle -X IptablesWrite $IPTABLES -t mangle -P PREROUTING ACCEPT IptablesWrite $IPTABLES -t mangle -P INPUT ACCEPT IptablesWrite $IPTABLES -t mangle -P FORWARD ACCEPT IptablesWrite $IPTABLES -t mangle -P OUTPUT ACCEPT IptablesWrite $IPTABLES -t mangle -P POSTROUTING ACCEPT } ############################################################################### # Crée les règles pour l'interface loopback # Tres simple: Tout est autorisé # # Créé le: 2003/02/22 Dernière modification le : 2003/06/12 ############################################################################### LoopbackRules () { local Interface local Network Interface=`GetInterface $LO` Network=`GetNetwork $LO` DebugWrite "+ Configuration du loopback ($Interface: $Network)" IptablesDebugWrite "+ Configuration du loopback ($Interface: $Network)" IptablesWrite $IPTABLES -A OUTPUT -o $Interface -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A INPUT -i $Interface -m state --state ! INVALID -j ACCEPT #REMARQUE: # En theorie, il faudrait utiliser des règles plus restricitives, afin de combiner # les "-o lo" / "-i lo" avec des "-s " / "-d ". Mais il faudrait # faire ceci pour toutes les interfaces réseaux, ce qui alourdit de beaucoup les # règles iptables. # # Cependant il semble que ce ne soit pas nécéssaire, car un paquet venant des # interfaces ppp? / eth? (donc de réseaux physiques) ne peuvent se faire passer pour # venant de l'interface "lo". D'où l'utilisation des règles ci-dessus # # Merci à Francois-Xavier 'FiX' KOWALSKI pour ses explications sur ce sujet } ############################################################################### # Crée les règles pour les interface reseaux locales # Tres simple: Tout est autorisé, SAUF si la carte réseau est en fait de l'ADSL # dégroupé... # # Créé le: 2003/02/22 Dernière modification le : 2004/02/17 ############################################################################### LanRules () { local Interface local IP local Network local Broadcast local I # Autorise toutes les connexions depuis et vers le reseau local for I in `echo ${LAN[@]}`; do Interface=`GetInterface $I` Network=`GetNetwork $I` if [ -z "`IsUngrouped $I`" ]; then # Réseau LAN classique, c'est à dire non WAN dégroupé IP=`GetIP $I` Broadcast=`GetBroadcast $I` DebugWrite "+ Configuration du reseau local ($Interface: $Network)" IptablesDebugWrite "+ Configuration du reseau local ($Interface: $Network)" IptablesDebugWrite " - Connexions $IP <-> $Network" IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -d $Network -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A INPUT -i $Interface -s $Network -d $IP -m state --state ! INVALID -j ACCEPT # Autorise aussi les broadcasts depuis et vers le reseau local IptablesDebugWrite " - Connexions $IP <-> broadcast" IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -d $Broadcast -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A INPUT -i $Interface -s $Network -d $Broadcast -m state --state ! INVALID -j ACCEPT if [ "`GetParameter --lan-dhcp-server`" == "on" ] && [ -n "`IsDhcpServer $I`" ]; then # Autorise aussi les broadcasts DHCP depuis et vers le reseau local IptablesDebugWrite " - Connexions $IP <-> broadcast DHCP" IptablesWrite $IPTABLES -A INPUT -i $Interface -s 0.0.0.0 -d 255.255.255.255 \ -p udp --sport bootpc --dport bootps -m state --state NEW,ESTABLISHED -j ACCEPT fi else DebugWrite "+ Configure plus tard l'ADSL dégroupé ($Interface: $Network)" IptablesDebugWrite "+ Configure plus tard l'ADSL dégroupé ($Interface: $Network)" fi done #REMARQUE: # Une methode beaucoup plus simple, mais peut-être plus risquée. # Il faut remplacer les règles de la boucle ci-dessus par: # IptablesWrite $IPTABLES -A OUTPUT -o $Interface -j ACCEPT # IptablesWrite $IPTABLES -A INPUT -i $Interface -j ACCEPT } ############################################################################### # Crée les règles pour l'interface modem # On utilise ici le suivit de connexion, à savoir, seul les connexions initiees # par la machine sont autorisées # # Créé le: 2003/03/12 Dernière modification le : 2004/02/17 ############################################################################### ModemRules () { local Interface local IP Interface=`GetInterface $WAN` IP=`GetIP $WAN` DebugWrite "+ Configuration de l'interface WAN ($Interface: $IP)" IptablesDebugWrite "+ Configuration de l'interface WAN ($Interface: $IP)" IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p all -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p all -m state --state RELATED,ESTABLISHED -j ACCEPT #REMARQUE: # Une methode beaucoup plus simple, mais plus risquée. # Il faut remplacer les règles ci-dessus par: # IptablesWrite $IPTABLES -A OUTPUT -o $Interface -p all -m state --state ! INVALID -j ACCEPT # IptablesWrite $IPTABLES -A INPUT -i $Interface -p all -m state --state RELATED,ESTABLISHED -j ACCEPT # Interêt : Pas besoin de trouver "$IP" } ############################################################################### # Crée les règles pour l'utilisation d'un routeur # On utilise ici le suivit de connexion, à savoir, seul les connexions initiees # par la machine sont autorisées # De plus, les connexions venant directement du routeur sont interdites et # loggees # # Créé le: 2003/06/19 Derniere modification le : 2003/06/19 ############################################################################### GatewayRules () { local Interface local IP local GatewayIP Interface=`GetInterface $WAN` IP=`GetIP $WAN` GatewayIP=`GetGateway $WAN` # Log et interdit les paquets venant directement du routeur DebugWrite "+ Securisation de l'interface routeur ($Interface/$IP)" IptablesDebugWrite "+ Securisation de l'interface routeur ($Interface/$IP)" IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -d $GatewayIP \ -p all -m state --state INVALID -j LogDrop IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -s $GatewayIP \ -p all -m state --state ! RELATED,ESTABLISHED -j LogDrop # Configuration de l'accès WAN (he oui, c'est la même chose que pour le modem ...) ModemRules } ############################################################################### # Autorise le NAT pour les reseau qui ont "IsRoutable" different de # "non_routable" # Tres simple: Toutes les connexions initialisees par le reseau local sont # autorisees # # Créé le: 2003/02/22 Derniere modification le : 2003/12/12 ############################################################################### NatRules () { local WanInterface local LanInterface local LanNetwork local I WanInterface=`GetInterface $WAN` DebugWrite "+ Configuration du NAT" IptablesDebugWrite "+ Configuration du NAT" # Charge les modules nécéssaires au NAT DebugWrite " - Chargement des modules NAT" IptablesDebugWrite " - Chargement des modules NAT" for I in $MODULES_NAT; do IptablesWrite $MODPROBE $I done # Autorise toutes les connexions NAT depuis le reseau local for I in `echo ${LAN[@]}`; do if [ -n "`IsRoutable $I`" ]; then LanInterface=`GetInterface $I` LanNetwork=`GetNetwork $I` IptablesDebugWrite " - Autorise $LanNetwork <-> $WanInterface" IptablesWrite $IPTABLES -A FORWARD -i $LanInterface -o $WanInterface -s $LanNetwork \ -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A FORWARD -i $WanInterface -o $LanInterface -d $LanNetwork \ -m state --state ESTABLISHED,RELATED -j ACCEPT IptablesWrite $IPTABLES -t nat -A POSTROUTING -o $WanInterface -s $LanNetwork -j MASQUERADE # MTU auto fix #IptablesWrite $IPTABLES -A FORWARD -i $LanInterface -o $WanInterface \ # -s $LanNetwork -p tcp --tcp-flags SYN,RST SYN --clamp-mss-to-pmtu -j TCPMSS fi done # Activation du NAT IptablesDebugWrite " - Activation du NAT" echo 1 > /proc/sys/net/ipv4/ip_forward } ############################################################################### # Crée les règles pour activer le mode serveur TO via le modem # C'est assez permitif, car le "ping" est autorise ... # # Créé le: 2003/03/12 Dernière modification le : 2003/06/12 ############################################################################### TacticalOpsWanServerRules () { local Interface local IP local Network local I Interface=`GetInterface $WAN` IP=`GetIP $WAN` DebugWrite "+ Configuration pour le serveur Tactical Ops Internet" IptablesDebugWrite "+ Configuration pour le serveur Tactical Ops Internet" IptablesDebugWrite " - Accepte les connexions entrantes dans le serveur Tactical Ops" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p udp --dport $TO_PORT -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p udp --sport $TO_PORT -m state --state RELATED,ESTABLISHED -j ACCEPT IptablesDebugWrite " - Bloque les broadcast envoyés par le serveur Tactical Ops sur Internet" if [ "$TO_WAN_BROADCAST" == "n" ]; then IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p udp -d 255.255.255.255 -j DROP fi # Autorise les broadcast envoyés par le serveur Tactical Ops sur le reseau local if [ "$TO_LAN_BROADCAST" == "y" ]; then for I in `echo ${LAN[@]}`; do Interface=`GetInterface $I` IP=`GetIP $I` Network=`GetNetwork $I` IptablesDebugWrite " - Autorise les broadcasts sur $Network" IptablesWrite $IPTABLES -A OUTPUT -o $Interface -p udp -s $IP -d 255.255.255.255 -m state --state ! INVALID -j ACCEPT done fi } ############################################################################### # Crée les règles pour activer un serveur FTP via le modem # Merci à Jp. Sylvanie pour sa correction # # Créé le: 2003/03/15 Dernière modification le : 2004/01/05 ############################################################################### FtpWanServerRules () { local Interface local IP Interface=`GetInterface $WAN` IP=`GetIP $WAN` DebugWrite "+ Configuration pour le serveur FTP Internet" IptablesDebugWrite "+ Configuration pour le serveur FTP Internet" IptablesDebugWrite " - Accepte les requetes FTP-commandes" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $FTP_CMD_PORT -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p tcp --sport $FTP_CMD_PORT -m state --state ESTABLISHED,RELATED -j ACCEPT # Règles inutiles, car les connections depuis le serveur vers Internet sont autorises par une règle plus generale #IptablesDebugWrite " - Accepte les envois d'authentification" #IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p tcp --dport auth -m state --state ! INVALID -j ACCEPT #IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --sport auth -m state --state ESTABLISHED,RELATED -j ACCEPT # Règle inutiles, car les connections depuis le serveur vers Internet sont autorises par une règle plus generale #IptablesDebugWrite " - Accepte les envois FTP-data" #IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p tcp --sport $FTP_DATA_PORT -m state --state ! INVALID -j ACCEPT #IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $FTP_DATA_PORT -m state --state ESTABLISHED,RELATED -j ACCEPT } ############################################################################### # Crée les règles pour activer un serveur SSH # Merci à Antoine Büsch et à JP Sylvanie pour leur contributions # # Créé le: 2003/09/07 Dernière modification le : 2003/11/01 ############################################################################### SshWanServerRules () { local Interface local IP Interface=`GetInterface $WAN` IP=`GetIP $WAN` DebugWrite "+ Configuration pour le serveur SSH Internet" IptablesDebugWrite "+ Configuration pour le serveur SSH Internet" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $SSH_PORT -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p tcp --sport $SSH_PORT -m state --state ESTABLISHED,RELATED -j ACCEPT } ############################################################################### # Crée les règles pour activer un serveur HTTP # Merci à Antoine Büsch pour sa contribution # # Créé le: 2003/09/07 Dernière modification le : 2003/11/01 ############################################################################### HttpWanServerRules () { local Interface local IP Interface=`GetInterface $WAN` IP=`GetIP $WAN` DebugWrite "+ Configuration pour le serveur HTTP Internet" IptablesDebugWrite "+ Configuration pour le serveur HTTP Internet" if [ -n "$HTTP_PORT" ]; then IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $HTTP_PORT -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p tcp --sport $HTTP_PORT -m state --state ESTABLISHED,RELATED -j ACCEPT fi if [ -n "$HTTPS_PORT" ]; then IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $HTTPS_PORT -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p tcp --sport $HTTPS_PORT -m state --state ESTABLISHED,RELATED -j ACCEPT fi } ############################################################################### # Crée les règles pour activer un serveur Jabber # Merci à Antoine Büsch pour sa contribution # # Créé le: 2003/09/07 Dernière modification le : 2003/09/07 ############################################################################### JabberWanServerRules () { local Interface local IP Interface=`GetInterface $WAN` IP=`GetIP $WAN` DebugWrite "+ Configuration pour le serveur Jabber Internet" IptablesDebugWrite "+ Configuration pour le serveur Jabber Internet" IptablesDebugWrite "+ Accepte les connexions serveur <-> serveur" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $JABBER_S2S_PORT -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p tcp --sport $JABBER_S2S_PORT -m state --state ESTABLISHED,RELATED -j ACCEPT IptablesDebugWrite "+ Accepte les connexions client <-> serveur" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $JABBER_C2S_PORT -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p tcp --sport $JABBER_C2S_PORT -m state --state ESTABLISHED,RELATED -j ACCEPT } ############################################################################### # Crée les règles pour activer xmule # # Créé le: 2003/12/06 Dernière modification le : 2004/03/07 ############################################################################### XmuleWanRules () { local Interface local IP local Network local I Interface=`GetInterface $WAN` IP=`GetIP $WAN` DebugWrite "+ Configuration pour le client Xmule" IptablesDebugWrite "+ Configuration pour le client Xmule" IptablesDebugWrite " - Accepte les connexions entrantes dans le serveur Xmule" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $XMULE_TCP_PORT -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p udp --dport $XMULE_UDP_PORT -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p tcp --sport $XMULE_TCP_PORT -m state --state RELATED,ESTABLISHED -j ACCEPT IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p udp --sport $XMULE_UDP_PORT -m state --state RELATED,ESTABLISHED -j ACCEPT } ############################################################################### # Crée les règles pour autoriser l'utilisation de GnomeMeeting # # Créé le: 2004/03/03 Dernière modification le : 2003/03/03 ############################################################################### GnomeMeetingWanRules () { local Interface local IP local Network local I Interface=`GetInterface $WAN` IP=`GetIP $WAN` DebugWrite "+ Configuration pour GnomeMeeting" IptablesDebugWrite "+ Configuration pour GnomeMeeting" if [ -n "$GM_TCP_LISTENING_PORT" ]; then IptablesDebugWrite " - Accepte les connexions entrantes H.323" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $GM_TCP_LISTENING_PORT -m state --state ! INVALID -j ACCEPT fi if [ -n "$GM_RTP_PORT_RANGE" ]; then IptablesDebugWrite " - Autorise les connexions RTP" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p udp --dport $GM_RTP_PORT_RANGE -j ACCEPT fi if [ -n "$GM_TCP_PORT_RANGE" ]; then IptablesDebugWrite " - Autorise les connexions H245" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $GM_TCP_PORT_RANGE -j ACCEPT fi if [ -n "$GM_GK_PORT_RANGE" ]; then IptablesDebugWrite " - Parametrage pour une passerelle GateKeeper" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $GM_GK_PORT_RANGE -j ACCEPT # IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p tcp --sport $GM_GK_PORT_RANGE -j ACCEPT fi } ############################################################################### # Crée les règles pour autoriser l'utilisation de BitTorrent # # Créé le: 2004/03/07 Dernière modification le : 2003/03/07 ############################################################################### BitTorrentWanRules () { local Interface local IP local Network local I Interface=`GetInterface $WAN` IP=`GetIP $WAN` DebugWrite "+ Configuration pour BitTorrent" IptablesDebugWrite "+ Configuration pour BitTorrent" if [ -n "$BT_PORT_RANGE" ]; then IptablesDebugWrite " - Accepte les connexions entrantes sur les ports $BT_PORT_RANGE" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $BT_PORT_RANGE -m state --state ! INVALID -j ACCEPT fi if [ -n "$BT_TRACKER_PORT" ]; then IptablesDebugWrite " - Accepte les connexions sur le tracker (port $BT_TRACKER_PORT)" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p tcp --dport $BT_TRACKER_PORT -m state --state ! INVALID -j ACCEPT fi } ############################################################################### # Crée les règles de port forwarding (suivit de port) # # Créé le: 2003/11/02 Dernière modification le : 2003/11/02 ############################################################################### PortForwardingRules () { local Interface local IP Interface=`GetInterface $WAN` IP=`GetIP $WAN` DebugWrite "+ Configuration pour port forwarding" IptablesDebugWrite "+ Configuration pour le port forwarding" IptablesWrite $IPTABLES -t filter -A FORWARD -i lo -s 0.0.0.0/0 -d 192.168.1.252 -p tcp --dport 80 -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -t filter -A FORWARD -o lo -s 192.168.1.252 -d 0.0.0.0/0 -p tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT IptablesWrite $IPTABLES -t nat -A PREROUTING -i lo -s 0.0.0.0/0 -d 192.168.1.50 -p tcp --dport 80 -m state --state ! INVALID -j DNAT --to-destination 192.168.1.252:80 #IptablesWrite $IPTABLES -t filter -A FORWARD -i ppp0 -o eth2 -s 0.0.0.0/0 -d 192.168.1.252 -p tcp --dport 80 -m state --state ! INVALID -j ACCEPT #IptablesWrite $IPTABLES -t filter -A FORWARD -i eth2 -o ppp0 -s 192.168.1.252 -d 0.0.0.0/0 -p tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT #IptablesWrite $IPTABLES -t nat -A PREROUTING -i ppp0 -s 0.0.0.0/0 -d 10.0.0.1 -p tcp --dport 80 -m state --state ! INVALID -j DNAT --to-destination 192.168.1.252:80 echo 1 > /proc/sys/net/ipv4/ip_forward } ############################################################################### # Crée les règles permettant à la machine de repondre aux ping WAN # # Créé le: 2003/04/18 Dernière modification le : 2003/07/17 ############################################################################### PingWanRules () { local Interface local IP Interface=`GetInterface $WAN` IP=`GetIP $WAN` if [ "$KERNEL_PING_PROTECTION" == "n" ]; then DebugWrite "+ Configuration pour autoriser la reponse aux ping" IptablesDebugWrite "+ Configuration pour autoriser la reponse aux ping" IptablesDebugWrite " - Accepte les ping venant d'Internet (GROS trou de sécurite ...)" IptablesWrite $IPTABLES -A INPUT -i $Interface -d $IP -p icmp -m state --state ! INVALID -j ACCEPT IptablesWrite $IPTABLES -A OUTPUT -o $Interface -s $IP -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT else ErrorWrite "Erreur : Impossible d'utiliser le paramètre '--wan-ping on' avec l'option 'KERNEL_PING_PROTECTION=y'" fi } ############################################################################### # Active la protection du kernel anti-spoofing # # Créé le: 2003/07/17 Derniere modification le : 2003/07/17 ############################################################################### KernelSpoofingProtection () { local Filter; # Teste si la focntionnalité existe dans le kernel if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] ; then # Teste si il faut activer la protection if [ "$KERNEL_SPOOFING_PROTECTION" == "y" ]; then DebugWrite "+ Configuration de la protection anti-spoofing du kernel" for Filter in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $Filter done else DebugWrite "+ Desactivation de la protection anti-spoofing du kernel" for Filter in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $Filter done fi else ErrorWrite "Erreur : Impossible de configurer la protection anti-spoofing du kernel" fi } ############################################################################### # Active la protection du kernel anti-ping # # Créé le: 2003/07/17 Derniere modification le : 2003/07/17 ############################################################################### KernelPingProtection () { local Filter; # Teste si la fonctionnalité existe dans le kernel if [ -e /proc/sys/net/ipv4/icmp_echo_ignore_all ] && \ [ -e /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ] && \ [ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ] ; then # Teste si il faut activer la protection if [ "$KERNEL_PING_PROTECTION" == "y" ]; then DebugWrite "+ Configuration de la protection anti-ping du kernel" echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses else DebugWrite "+ Desactivation de la protection anti-ping du kernel" echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo 0 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses fi else ErrorWrite "Erreur : Impossible de configurer la protection anti-ping du kernel" fi } ############################################################################### # Crée les règles anti-spoofing (attaque par fausse adresse IP) # Merci à Francois-Xavier 'FiX' KOWALSKI pour ses règles iptables # # Remarque: On peut utiliser ces règles sur un réseau avec une passerelle, même # si le réseau local utlise des adresses privés. Exemple: # LAN[0]="eth0|192.168.0.1|255.255.255.0|192.168.0.255|routable" # WAN ="eth0|192.168.0.1|255.255.255.0|192.168.0.255|192.168.0.254" # Mais pour cela, il FAUT que les règles d'échange des paquets avec le reseau # local aient été définies AVANT d'executer cette fonction. Typiquement, il # FAUT lancer la fonction "LanRules" AVANT cette fonction-ci # # Créé le: 2003/04/12 Derniere modification le : 2003/07/21 ############################################################################### WanSpoofingFilterRules () { local Interface local IP Interface=`GetInterface $WAN` IP=`GetIP $WAN` DebugWrite "+ Configuration pour l'anti spoofing" IptablesDebugWrite "+ Configuration pour l'anti spoofing" IptablesDebugWrite " - Refuse les packets pretendants venant des classes loopback" IptablesWrite $IPTABLES -A INPUT -i $Interface -s 127.0.0.0/8 -j DROP IptablesDebugWrite " - Refuse les packets pretendants venant des classes A privees" IptablesWrite $IPTABLES -A INPUT -i $Interface -s 10.0.0.0/8 -j DROP IptablesDebugWrite " - Refuse les packets pretendants venant des classes B privees" IptablesWrite $IPTABLES -A INPUT -i $Interface -s 172.16.0.0/12 -j DROP IptablesDebugWrite " - Refuse les packets pretendants venant des classes C privees" IptablesWrite $IPTABLES -A INPUT -i $Interface -s 192.168.0.0/16 -j DROP IptablesDebugWrite " - Refuse les packets pretendants venant d'une classe D multicast (Le Multicast est illegale en temps qu'adresse source)" IptablesWrite $IPTABLES -A INPUT -i $Interface -s 224.0.0.0/4 -j DROP IptablesDebugWrite " - Refuse les packets venant des classes E reservees" IptablesWrite $IPTABLES -A INPUT -i $Interface -s 240.0.0.0/4 -j DROP } ############################################################################### # Force la suppression des trames correspondant aux definitions du tableau # $DROP # # Créé le: 2003/03/16 Dernière modification le : 2003/07/18 ############################################################################### ForceDropRules () { local Result local Chaine local Rule local I DebugWrite "+ Configuration des regles de rejet" IptablesDebugWrite "+ Configuration des regles de rejet" # Crée chacune des règles de DROP (suppression des trames) for I in `echo ${DROP[@]}`; do # Initialise la nouvelle règle Rule="" # Recupère la chaîne Chaine=`GetDropChaine $I` if [ -n "$Chaine" ]; then case "$Chaine" in INPUT) Rule="$Rule -A $Chaine" ;; OUTPUT) Rule="$Rule -A $Chaine" ;; *) ErrorWrite "Chaîne DROP non valide ! Type de chaîne non valide \`$Chaîne\` (valeur attendue: INPUT/OUTPUT)" esac else ErrorWrite "Chaîne DROP non valide ! Nom de la chaîne manquant pour la règle \'$I\'" fi # Recupere l'interface Result=`GetDropInterface $I` if [ -n "$Result" ]; then if [ "$Chaine" == "INPUT" ]; then Rule="$Rule -i $Result" else Rule="$Rule -o $Result" fi fi # Vérifie si l'interface existe réelement avant de créer la règle if [ -z "$Result" ] || \ [ -n "`IsAvailableInterface $Result`" ]; then # Recupere l'adresse IP / reseau SOURCE Result=`GetDropSourceIP $I` if [ -n "$Result" ]; then Rule="$Rule -s $Result" fi # Recupere l'adresse IP / reseau CIBLE Result=`GetDropTargetIP $I` if [ -n "$Result" ]; then Rule="$Rule -d $Result" fi # Recupere le protocol Result=`GetDropProtocol $I` if [ -n "$Result" ]; then Rule="$Rule -p $Result" fi # Recupere le port SOURCE Result=`GetDropSourcePort $I` if [ -n "$Result" ]; then Rule="$Rule --sport $Result" fi # Recupere le port CIBLE Result=`GetDropTargetPort $I` if [ -n "$Result" ]; then Rule="$Rule --dport $Result" fi # La règle est prete, il suffit de l'ecrire IptablesDebugWrite " - Regle: $I" IptablesWrite $IPTABLES $Rule -j DROP else # L'interface n'existe pas. Ne crée pas de règle de rejet pour cette interface DebugWrite " - Regle: $I annulee ('$Result' indisponible)" fi done } ############################################################################### # Crée les règles de log, en fonction des variables $LOG_TYPE, $LOG_PREFIX # $LOG_LOG_LEVEL, $LOG_TABLES # Merci à Christian Chanuel pour sa contribution # # # Créé le: 2003/07/08 Dernière modification le : 2003/10/02 ############################################################################### LogRules () { local I; local Table; local Chaine; local Prefix; local Rule; # Log tout ce qui n'a pas ete valide par les règles iptables de case "$LOG_TYPE" in LOG) Rule="-j LOG" # Rajout de la definition du "log level" (géré par "syslog", afin de séparer les informations # de log dans différents fichiers de log) if [ -n "$LOG_LOG_LEVEL" ]; then Rule="$Rule --log-level $LOG_LOG_LEVEL" fi # Rajout de la definition du "log prefix", qui permet de rajouter une sorte de "commentaire" au log if [ -n "$LOG_PREFIX" ]; then Rule="$Rule --log-prefix" fi ;; ULOG) # Chargement du module kernel ULOG (ipt_ULOG) IptablesWrite $MODPROBE ipt_ULOG # Rajout de la règle if [ -n "$LOG_PREFIX" ]; then Rule="-j ULOG --ulog-prefix" else Rule="-j ULOG" fi ;; NO_LOG) DebugWrite "+ Les trames supprimées ne seront pas loggées" return ;; *) ErrorWrite "Constante LOG non valide ($LOG) ! Valeur souhaitée: LOG / ULOG / NO_LOG" return esac for I in `echo $LOG_TABLES | sed "s/ //g;s/|/ /g"`; do Table=`GetTable $I` Chaine=`GetChaine $I` Prefix=`echo $LOG_PREFIX | sed s/\\$T/$Table/g | sed s/\\$C/$Chaine/g` IptablesWrite $IPTABLES -t $Table -A $Chaine -p all $Rule $Prefix done } ############################################################################### ######################## DEBUT GESTION DES PARAMETRES ######################### ############################################################################### ############################################################################### # Affiche "y" si le parametre ($1) est un parametre valide # Affiche "" sinon # Cette fonction utilise les parametres declares dans "WAITING_PARAMETERS" # # Créé le: 2003/03/16 Dernière modification le : 2003/03/16 ############################################################################### IsAvailableParameter () { local Parameter=$1 local I # Analyse chaque parametres for I in `echo ${WAITING_PARAMETERS[@]}`; do # Cherche le parametre qui correspond à "$Parameter" if [ "`echo $I | cut -d'|' -f1`" == "$Parameter" ]; then # Le parametre a ete trouve, affiche "y" echo "y" return fi done # Le parametre N'est PAS un parametre attendu (pas declare dans WAITING_PARAMETERS) # => Affiche "" } ############################################################################### # Affiche "" si la valeur ($2) n'est pas une valeur valide du parametre ($1) # Affiche la valeur ($2) sinon # Cette fonction utilise les parametres declares dans "WAITING_PARAMETERS" # # Créé le: 2003/03/16 Dernière modification le : 2003/03/16 ############################################################################### IsAvailableValue () { local Parameter=$1 local Value=$2 local I local J # Analyse chaque parametres for I in `echo ${WAITING_PARAMETERS[@]}`; do # Cherche le parametre qui correspond à "$Parameter" if [ "`echo $I | cut -d'|' -f1`" == "$Parameter" ]; then # Cherche si la valeur correspond à une des valeur attendue du parametre for J in `echo $I | cut -d'|' -f2- | sed "s/|/ /g"`; do if [ "$J" != "$Parameter" ] && \ [ "$J" == "$Value" ]; then # Il y a au moins une valeur attendue pour ce parametre # De plus, "Value" est est justement une option du parametre # Retourne la valeur du parametre echo $J return fi done fi done # Le parametre N'est PAS un parametre attendu (pas declare dans WAITING_PARAMETERS) # OU le parametre N'attend PAS de valeur (donc la valeur fournie n'est pas valable) # OU la valeur NE correspont PAS a une valeur attendue par le parametre # => Affiche "" } ############################################################################### # Affiche "y" si le parametre ($1) n'attend pas de valeur # Affiche "" sinon # Cette fonction utilise les parametres declares dans "WAITING_PARAMETERS" # # Créé le: 2003/03/16 Dernière modification le : 2003/03/16 ############################################################################### IsNoValueParameter () { local Parameter=$1 local I # Analyse chaque parametres for I in `echo ${WAITING_PARAMETERS[@]}`; do # Cherche le parametre qui correspond à "$Parameter" if [ "`echo $I | cut -d'|' -f1`" == "$Parameter" ]; then if [ "`echo $I | cut -d'|' -f2-`" == "$I" ]; then echo y return else return fi fi done # Le parametre N'est PAS un parametre attendu (pas declare dans WAITING_PARAMETERS) # => Affiche "" } ############################################################################### # Affiche la valeur par defaut du parametre ($1) # Affiche "$$NO_DEFAULT_VALUE$$" si il n'y a pas de valeur par defaut # Cette fonction utilise les parametres declares dans "WAITING_PARAMETERS" # # Créé le: 2003/03/16 Dernière modification le : 2003/03/16 ############################################################################### GetDefaultValue () { local Parameter=$1 local Value local I # Analyse chaque parametres for I in `echo ${WAITING_PARAMETERS[@]}`; do # Cherche le parametre qui correspond à "$Parameter" if [ "`echo $I | cut -d'|' -f1`" == "$Parameter" ]; then Value=`echo $I | sed 's/^.*|//g'` if [ -z "$Value" ] || [ "$Value" == "$Parameter" ]; then # Pas de valeur par defaut pour ce parametre echo "\$\$NO_DEFAULT_VALUE\$\$" return else # Affiche la valeur par defaut et retourne "1" echo $Value return fi fi done # Le parametre N'est PAS un parametre attendu (pas declare dans WAITING_PARAMETERS) # => Affiche "\$\$NO_DEFAULT_VALUE\$\$" echo "\$\$NO_DEFAULT_VALUE\$\$" } ############################################################################### # Rempli le tableau PARAMETERS avec le nom du parametre ($1) et sa valeur ($2) # # Créé le: 2003/03/16 Dernière modification le : 2003/03/16 ############################################################################### SetParameterValue () { local Parameter=$1 local Value=$2 local I local Cpt # Recherche "$Parametre|$Value" dans le tableau $PARAMETERS Cpt=0 for I in `echo ${PARAMETERS[@]}`; do # Cherche le parametre qui correspond à "$Parameter" if [ "`echo $I | cut -d'|' -f1`" == "$Parameter" ]; then if [ -n "$Value" ]; then PARAMETERS[$Cpt]="$Parameter|$Value" else PARAMETERS[$Cpt]="$Parameter" fi return fi Cpt=$(( $Cpt + 1)) done # Le parametre N'est PAS un parametre attendu (pas declare dans PARAMETERS) # Rajoute ce parametre au tableau PARAMETERS[$Cpt]="$Parameter|$Value" } ############################################################################### # Retourne la valeur du parametre ($1) # # Créé le: 2003/04/05 Dernière modification le : 2003/04/05 ############################################################################### GetParameter () { local Parameter=$1 local I # Recherche "$Parametre|????" dans le tableau $PARAMETERS for I in `echo ${PARAMETERS[@]}`; do # Cherche le parametre qui correspond à "$Parameter" if [ "`echo $I | cut -d'|' -f1`" == "$Parameter" ]; then # Le parametre attend il une valeur ? if [ -z "`IsNoValueParameter $Parameter`" ]; then # Affiche la valeur echo "`echo $I | cut -d'|' -f2`" else # Le parametre n'attend pas de valeur, mais a été passé au programme echo "yes" fi return fi done } ############################################################################### # Analyse les parametres du programme # Cette fonction analysera les paramètres du programme en fonction du contenu # du tableau "WAITING_PARAMETERS" # Les valeurs des parametre seront stocke dans le tableau PARAMETERS # # Créé le: 2003/03/16 Dernière modification le : 2003/06/12 ############################################################################### ParametersAnalysis () { local Parameter local Value local SkipParameter local Cpt SkipParameter="" Cpt=0 # Positionne les valeurs par defaut for Parameter in ${WAITING_PARAMETERS[@]} ; do # Recherche la valeur par defaut pour $Parameter Parameter="`echo $Parameter | cut -d'|' -f1`" Value=`GetDefaultValue $Parameter` #echo $Parameter $Value if [ "$Value" != "\$\$NO_DEFAULT_VALUE\$\$" ]; then PARAMETERS[$Cpt]="$Parameter|$Value" #echo $Cpt: PARAMETERS[$Cpt]="$Parameter|$Value" Cpt=$(( $Cpt + 1)); fi done Cpt=0 # Analyse chacun des parametres for Parameter in $@ ; do if [ -z "$SkipParameter" ]; then #echo "+ Analyse: (${Parameter}) ($2)" if [ -n "`IsAvailableParameter $Parameter`" ]; then if [ -z "`IsNoValueParameter $Parameter`" ]; then # Le parametre attend une valeur # Recuperation de la valeur shift Value=$1 # Vérifie si la valeur est une valeur attendue if [ -n "`IsAvailableValue $Parameter $Value`" ]; then # La valeur est une valeur attendue par le programme # Rajoute ce couple parametre / valeur au tableau $PARAMETERS SetParameterValue $Parameter $Value #echo $@ # Annule le traitement du prochain parametre (car c'est la valeur de $Parameter) SkipParameter="y" else # Valeur non valide. # Peut-être est-ce un autre parametre, et dans ce cas, il faut # utiliser la valeur par defaut de $Parameter if [ -n `IsAvailableParameter $Parameter` ]; then # Il faut utiliser la valeur par defaut de $Parameter, # ce qui a déjà été fait au debut de la procedure echo -n "" #echo $@ # La ligne ci-dessus ne sert a rien, mais sans cela, on ne peut pas commenter # la boucle if/then/else ... else # La valeur n'est pas valide, et ce n'est pas un autre parametre. C'est une valeur # non attendu, donc on affiche un message d'erreur ErrorWrite "'$Value' n'est pas une valeur attendue pour '$Parameter'.\n Utilisez '$PROGRAM_NAME --help' pour avoir de l'aide" fi fi else # Le parametre est attendu, mais il ne necessite pas de valeur # Rajoute ce parametre au tableau $PARAMETERS SetParameterValue $Parameter # Supprime ce parametre de la liste des parametres ($@) shift #echo $@ fi else # Parametre non valide ErrorWrite "Parametre '$Parameter' invalide.\n Utilisez '$PROGRAM_NAME --help' pour avoir de l'aide" fi else #echo "+ Passe: (${Parameter}) ($2)" #Passe au parametre suivant shift SkipParameter="" fi done } ############################################################################### ######################### FIN GESTION DES PARAMETRES ########################## ############################################################################### FirewallStop() { # Efface toutes les chaines chains=`cat /proc/net/ip_tables_names 2>/dev/null` for i in $chains; do $IPTABLES -t $i -F; done for i in $chains; do $IPTABLES -t $i -X; done # Efface tout IptablesWrite $IPTABLES -F IptablesWrite $IPTABLES -X # Accepte par defaut IptablesWrite $IPTABLES -t filter -P INPUT ACCEPT IptablesWrite $IPTABLES -t filter -P OUTPUT ACCEPT IptablesWrite $IPTABLES -t filter -P FORWARD ACCEPT IptablesWrite $IPTABLES -t nat -P PREROUTING ACCEPT IptablesWrite $IPTABLES -t nat -P POSTROUTING ACCEPT IptablesWrite $IPTABLES -t nat -P OUTPUT ACCEPT IptablesWrite $IPTABLES -t mangle -P PREROUTING ACCEPT IptablesWrite $IPTABLES -t mangle -P OUTPUT ACCEPT } ############################################################################### # Programme principal # # Créé le: 2003/02/22 Derniere modification le : 2003/06/19 ############################################################################### MainProgram () { # Initialises les variables globales MainProgramInit $@ # Affiche l'aide si necessaire if [ "`GetParameter --help`" == "yes" ]; then # Affiche l'aide DisplayHelp elif [ "`GetParameter stop`" == "yes" ]; then # Stoppe le firewall FirewallStop else # Protection anti-spoofing du kernel KernelSpoofingProtection # Protection anti-ping du kernel KernelPingProtection # Determine la configuration NetworkConfiguration # Charge les modules kernel de netfilter/firewall/nat/etc ... ModulesInit # Initialise netfilter NetFilterInit # Supprime les trames correspondant à une certaine declaration, afin d'eviter # de saturer le fichier de log (/var/log/messages par defaut) if [ "`GetParameter --drop-rules`" == "on" ]; then ForceDropRules fi # Active les règles pour l'interface loopback (LO <=> localhost) LoopbackRules case "$NETWORK_TYPE" in lan) # Active les règles pour les réseaux locaux LanRules ;; wan-modem) # Active les règles pour les réseaux locaux LanRules # Active les règles pour le modem ModemRules # Active les règles pour le client GnomeMeeting WAN if [ "`GetParameter --wan-gnomemeeting`" == "on" ]; then GnomeMeetingWanRules fi # Active les règles pour le client xMule WAN if [ "`GetParameter --wan-xmule`" == "on" ]; then XmuleWanRules fi # Active les règles pour le client BitTorrent WAN if [ "`GetParameter --wan-bittorrent`" == "on" ]; then BitTorrentWanRules fi # Active les règles pour le serveur Tactical Ops WAN if [ "`GetParameter --wan-to-server`" == "on" ]; then TacticalOpsWanServerRules fi # Active les règles pour le serveur FTP WAN if [ "`GetParameter --wan-ftp-server`" == "on" ]; then FtpWanServerRules fi # Active les regles pour le serveur SSH WAN if [ "`GetParameter --wan-ssh-server`" == "on" ]; then SshWanServerRules fi # Active les regles pour le serveur HTTP WAN if [ "`GetParameter --wan-http-server`" == "on" ]; then HttpWanServerRules fi # Active les regles pour le serveur Jabber WAN if [ "`GetParameter --wan-jabber-server`" == "on" ]; then JabberWanServerRules fi # Active le filtre anti-spoofing if [ "`GetParameter --spoofing-filter`" == "on" ]; then WanSpoofingFilterRules fi # Active les règles permettant la machine à répondre aux ping if [ "`GetParameter --wan-ping`" == "on" ]; then PingWanRules fi # Active le NAT (Network Adress Translation), qui permet aux réseau # ayant l'option "routable" d'aller sur Internet, via le modem if [ "`GetParameter --nat`" == "on" ]; then NatRules else # Desactivation du NAT echo 0 > /proc/sys/net/ipv4/ip_forward fi ;; wan-gateway) # Ajoute une chaine permettant de logger et de dropper (détruire) un trame LogDropWrite # Actives les règles spécifiques à la passerelle GatewayRules # Active les règles pour les réseaux locaux LanRules # Active les règles pour le client GnomeMeeting WAN if [ "`GetParameter --wan-gnomemeeting`" == "on" ]; then GnomeMeetingWanRules fi # Active les règles pour le client xMule WAN if [ "`GetParameter --wan-xmule`" == "on" ]; then XmuleWanRules fi # Active les règles pour le client BitTorrent WAN if [ "`GetParameter --wan-bittorrent`" == "on" ]; then BitTorrentWanRules fi # Active les règles pour le serveur Tactical Ops WAN if [ "`GetParameter --wan-to-server`" == "on" ]; then TacticalOpsWanServerRules fi # Active les règles pour le serveur FTP WAN if [ "`GetParameter --wan-ftp-server`" == "on" ]; then FtpWanServerRules fi # Active les regles pour le serveur SSH WAN if [ "`GetParameter --wan-ssh-server`" == "on" ]; then SshWanServerRules fi # Active les regles pour le serveur HTTP WAN if [ "`GetParameter --wan-http-server`" == "on" ]; then HttpWanServerRules fi # Active les regles pour le serveur Jabber WAN if [ "`GetParameter --wan-jabber-server`" == "on" ]; then JabberWanServerRules fi # Active le filtre anti-spoofing if [ "`GetParameter --spoofing-filter`" == "on" ]; then WanSpoofingFilterRules fi # Active les règles permettant la machine à répondre aux ping if [ "`GetParameter --wan-ping`" == "on" ]; then PingWanRules fi # Active le NAT (Network Adress Translation), qui permet aux réseau # ayant l'option "routable" d'aller sur Internet, via le modem if [ "`GetParameter --nat`" == "on" ]; then NatRules else # Desactivation du NAT echo 0 > /proc/sys/net/ipv4/ip_forward fi ;; esac # Log tout ce qui n'a pas ete valide par les règles iptables de LogRules # Affiche le status d'iptables if [ "$IPTABLES_DEBUG_DISPLAY" == "y" ]; then # On afficher la table Iptable IptablesWrite $IPTABLES -L -n -v --line-numbers echo -e "\n" fi # Affiche le message de fin DebugWrite "+ Règles iptables modifiées. Utilisez 'iptables -L -n' ou 'iptables -L -n -v' pour afficher la liste des tables" if [ "$DEBUG_FILE" != "/dev/null" ]; then DebugWrite "+ Fichier de debug: $DEBUG_FILE\n" fi fi } Test () { local I local Cpt clear for I in `echo ${WAITING_PARAMETERS[@]}`; do echo $I done Temp=IsAvailableParameter echo -e "\n--------------- $Temp ---------------" echo `echo -n "--enabled-wan-to-server no: "; $Temp --enabled-wan-to-server no` echo `echo -n "--test2 toto: "; $Temp --test2 toto` echo `echo -n "--test yes: "; $Temp --test yes` echo `echo -n "--test3 yes: "; $Temp --test3 yes` echo -e "-----------------------------------------\n" Temp=IsAvailableValue echo -e "\n--------------- $Temp ---------------" echo `echo -n "--enabled-wan-to-server no: "; $Temp --enabled-wan-to-server no` echo `echo -n "--test2 toto: "; $Temp --test2 toto` echo `echo -n "--test yes: "; $Temp --test yes` echo `echo -n "--test3 yes: "; $Temp --test3 yes` echo -e "-----------------------------------------\n" Temp=IsNoValueParameter echo -e "\n--------------- $Temp ---------------" echo `echo -n "--enabled-wan-to-server no: "; $Temp --enabled-wan-to-server no` echo `echo -n "--test2 toto: "; $Temp --test2 toto` echo `echo -n "--test yes: "; $Temp --test yes` echo `echo -n "--test3 yes: "; $Temp --test3 yes` echo -e "-----------------------------------------\n" Temp=GetDefaultValue echo -e "\n--------------- $Temp ---------------" echo `echo -n "--enabled-wan-to-server no: "; $Temp --enabled-wan-to-server no` echo `echo -n "--test2 toto: "; $Temp --test2 toto` echo `echo -n "--test yes: "; $Temp --test yes` echo `echo -n "--test3 yes: "; $Temp --test3 yes` echo -e "-----------------------------------------\n" # Initialises les variables globales MainProgramInit # Analyse des parametres ParametersAnalysis $@ Cpt=0 for I in `echo ${PARAMETERS[@]}`; do echo "$Cpt: $I" Cpt=$(( $Cpt + 1)) done } MainProgram $@ #Test $@