====== syntaxe des commandes utilisant les regexp ======
* Objet : boite à outils des expressions régulières
* Niveau requis : {{tag>avisé}}
* Commentaires : //Contexte d'utilisation du sujet du tuto. //
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-)
=====Synthèse grep =====
grep [options] regexp [fichier...]
Voir : [[atelier:chantier:bash-vii-globs-etendus-regex#tableau-des-caracteres-utilises-dans-les-expressions-regulieres-etendues|caractères utilisés dans les expressions régulières étendues]]
^ ^ ^
|''-c'' |afficher le décompte des lignes correspondantes |
|''-i'' | ignorer la case |
|''-E'' |utiliser les regexp étendues\\ (correspond à egrep) |
|''-o'' |afficher uniquement les parties (non vides) correspondantes des lignes sélectionnées, chaque partie étant affichée sur une ligne séparée.|
> Deux utilisations:\\
>Soit ''grep [options] "expression" /chemin/fichier'' (on applique grep sur un fichier)
>Soit ''cmd | grep [options]'' (on travaille à partir d'un flux d'entrée avec un filtre (pipe)\\
===Sur un fichier===
grep -E "(:[0-9]{4}:){1}" /etc/passwd
hypathie:x:1000:1000:Hypathie,,,:/home/hypathie:/bin/bash
===Filtre un flux d'entrée ===
/sbin/ifconfig | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
inet adr:192.168.0.22 Bcast:192.168.0.255 Masque:255.255.255.0
inet adr:127.0.0.1 Masque:255.0.0.0
/sbin/ifconfig | grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
127.0.0.1
255.0.0.0
192.168.0.21
192.168.0.255
255.255.255.0
Attention de ne pas oublier ''-o'' pour afficher l'occurrence exacte d'un mot au lieu de la ligne entière où figure l'occurrence du mot !
echo "bfer aaa jhgao aaaaaa haug aaaaaaaa" | grep -E "[[:blank:]][a]{3}[[:blank:]]"
bfer aaa jhgao aaaaaa haug aaaaaaaa
echo "bfer aaa jhgao aaaaaa haug aaaaaaaa" | grep -oE "[[:blank:]][a]{3}[[:blank:]]"
aaa
=====Synthèse sed =====
===Options===
^options ^significations ^
| ''-e'' |enchaîner plusieurs commandes |
| ''-r'' |utiliser les expressions régulières étendues dans un script |
|''-n'' |mode silencieux : permet de ne rien modifier\\ associée au drapeau p (print)\\ (affichage sur la sortie standard) |
|''-f'' |Les commandes sont lues à partir d'un fichier préalablement rédigé. |
|''-i'' |Le fichier est édité sur place.|
===Commandes de sed===
^ ^ ^
|d et D|supprimer |
|q |quitter |
|p et P |afficher avec ''-n'' |
|i\texte |insérer du texte|
|a\texte |ajouter du texte |
|c\texte |remplacer du texte |
| = |afficher |
|: |label |
|# |commentaire |
|{....} |Bloc |
|b |label (section)|
|g et G | obtenir |
|h et H | tenir |
|n et N | après |
|r //fichier// | lire //fichier// |
|s/..../..../ | substitution |
|t | test |
|w //fichier// | écrire //fichier// |
|x | eXchange |
|y/..../..../ | translittération |
===Les drapeaux de la commande sed s/.../.../===
^ ^ ^
|g | global : toutes les occurrences |
|1, 2, etc. | un nombre : la nième occurrence |
|w | écrire les modifications effectuées dans un fichier |
|p | afficher la ligne modifiée |
|e | exécution d'une commande |
=====awk =====
=====Détail : ligne de commandes shell et awk=====
===Utilisation du pipe===
Comme toutes commandes, awk peut traiter la sortie d'un pipe.
* Soit la variable suivante :
ligne="mot1 mot2 mot3"
* Exemple 1 :
echo $ligne | awk -F " " '{print $1}'
mot1
* Exemple 2 :
echo $ligne|awk -F " " '{print $1 $2}'
mot1mot2
* Exemple 3 :
echo $ligne|awk -F " " '{print $0}'
mot1 mot2 mot3
===Redirections d'entrée et de sortie ===
* On peut passer à awk le fichier à traiter avec **''<''** :
awk -F ':' '{ print $1 " est " $5 }' < /etc/passwd
* équivalent de :
awk -F ':' '{ print $1 " est " $5 }' /etc/passwd
* on peut rediriger la sortie de awk vers un fichier :
awk '{ print $1 ": moyenne math => " $4 }' fichier-awk.txt > Fichier1-sortie
=====awk programmation =====
====Variables utilisateurs ====
Une variable utilisateur peut aussi bien avoir un type correspondant à une chaîne de caractères ou à un nombre, ou même correspondre au deux types.
* Exemple1 : Soit script "var-u.awk"
$1 == "Constance"{
var=3
$4=$4+var
nom=$1 " -Correction note de math :"
print nom, $4
}
>Pour le fichier "fichier-awk.txt",
>on donne comme condition la correspondance correcte entre $1 et la chaîne "Constance", afin que le programme soit exécuté ;
>on crée la variable utilisateur var de valeur 3 ;
>pour modifier $4, on crée la variable $4 de valeur $4+var ;
>on crée la variable nom de valeur : $1 " -Correction note de math :" (on voit là une variable dont la valeur est un mélange des deux types, numérique et caractère) ;
>on récupère la valeur des variables créées tout simplement avec la fonction print.
awk -f var-u.awk fichier-awk.txt
Constance -Correction note de math : 18
====Utilisation de test "if-else" ====
* Soit le fichier "var-u.txt" :
cat var-u.txt
$1 == "Constance"{
# la condition du programme
var=3
# première variable crée
$4=$4+var
# deuxième variable crée
nom=$1 " -Correction note de math :"
# troisième crée
print nom, $4
# action du programme
}
* Soit le script "if-else.awk" :
BEGIN {
print "Début du script:"
variable=0
commentaire=0
print " nombre de variable = " variable
print " nombre de commantaire = " commentaire
}
/^# / {
commentaire++
}
/^[^#]/ && /[[:graph:]]=[[:graph:]]/{
variable++
}
{ if ( FNR > 1 ) {
print "Le nombre de lignes commentées est: " commentaire ;
print "Le nombre de variables est: " variable
}
else {
print "Pas d'enregistrement à traiter; lecture du fichier ..."
}
}
END {
print "Fin de traitement du fichier '" FILENAME "'."
print "Il y a eu " NR " enregistrements courants, " FNR " lignes traitées."
}
* Application du script "if-else.awk" sur le fichier "var-u.txt" :
awk -f if-else.awk var-u.txt
Début du script:
nombre de variable = 0
nombre de commantaire = 0
Pas d'enregistrement à traiter; lecture du fichier ...
Le nombre de lignes commentées est: 0
Le nombre de variables est: 0
Le nombre de lignes commentées est: 0
Le nombre de variables est: 1
Le nombre de lignes commentées est: 0
Le nombre de variables est: 1
Le nombre de lignes commentées est: 0
Le nombre de variables est: 2
Le nombre de lignes commentées est: 0
Le nombre de variables est: 2
Le nombre de lignes commentées est: 0
Le nombre de variables est: 3
Le nombre de lignes commentées est: 0
Le nombre de variables est: 3
Le nombre de lignes commentées est: 0
Le nombre de variables est: 3
Le nombre de lignes commentées est: 0
Le nombre de variables est: 3
Le nombre de lignes commentées est: 0
Le nombre de variables est: 3
Fin de traitement du fichier 'var-u.txt'.
Il y a eu 11 enregistrements courants, 11 lignes traitées.
hypathie@debian:~/Documents/AWK/Awk-exos$
hypathie@debian:~/Documents/AWK/Awk-exos$ awk -f if-else.awk var-u.txt
Début du script:
nombre de variable = 0
nombre de commantaire = 0
Pas d'enregistrement à traiter; lecture du fichier ...
Le nombre de lignes commentées est: 1
Le nombre de variables est: 0
Le nombre de lignes commentées est: 1
Le nombre de variables est: 1
Le nombre de lignes commentées est: 2
Le nombre de variables est: 1
Le nombre de lignes commentées est: 2
Le nombre de variables est: 2
Le nombre de lignes commentées est: 3
Le nombre de variables est: 2
Le nombre de lignes commentées est: 3
Le nombre de variables est: 3
Le nombre de lignes commentées est: 4
Le nombre de variables est: 3
Le nombre de lignes commentées est: 4
Le nombre de variables est: 3
Le nombre de lignes commentées est: 5
Le nombre de variables est: 3
Le nombre de lignes commentées est: 5
Le nombre de variables est: 3
Fin de traitement du fichier 'var-u.txt'.
Il y a eu 11 enregistrements courants, 11 lignes traitées.
=====Iptables index=====
Les données transmises sur un réseau est seulement un flux d'électrons (CAT 6/5e) ou photons (fibre) et RF qui se modifient en amplitude en fréquence. Ces modulations sont régies par les médias sur lesquels ces particules voyagent.\\
Des exemples les électrons sont absorbés après une période de temps après laquelle ils sont restés dans les conducteurs qui les portent.\\ Il s'agit là de métrique.
Une certaine quantité du flux de particules devient toujours entropique dans un système fermé(par exemple du fait de la chaleur résiduelle). Le flux peut être altéré par des interférences électromagnétiques (EMI) de ligne électrique, par les ondes des téléphones portables et la connexion peut être endommagé ainsi que l'équipement.
Pour faire face à ces erreurs, chaque paquet détient une valeur CRC (contrôle de redondance cyclique) qui est calculé par un algorithme avant d'être envoyés. Lorsque les paquets arrivent à destination la somme de contrôle (checksum) est calculée. Si elle correspond aux données de la source, le paquet est bon. Si le paquet est mauvais il est renvoyé.
Lorsque plusieurs périphériques transmettent des messages sur un réseau en même temps, différents protocoles doivent être respectées et appliquées à ces paquets sur ce réseau. Par exemple, CSMA/CD régit "collisions". C'est à la couche 3 du modèle OSI, que les routeurs acheminent des paquets à différents sous-réseaux en fonction de leurs données, par exemple selon les protocoles RIP et OSPF.
====Détail du vocabulaire ====
===Chaîne===
Une chaîne est une suite de règles ordonnées.\\ Chaque chaîne peut être comparée à un ensemble de tests, chacun ayant pour résultat l’envoi du paquet vers la **cible** spécifiée si la condition est vérifiée. Si ce n’est pas le cas, on passe à la suivante. En arrivant à la fin d’une des chaînes, une cible par défaut est utilisée.
* **Les types de chaînes** :
^chaîne ^ signification ^
|PREROUTING |Chaîne qui stoppe le paquet qui n'a subit aucune modification par rapport à ce que l'interface réseau a reçu. Il peut y être modifier pour de NAT.|
|INPUT| les paquets venant vers le PC : à ce stade, le paquet est prêt à être envoyé aux couches applicatives, c'est à dire aux serveurs et aux clients qui tournent sur la machine.|
|FORWARD| Chaîne qui permet aux paquets de passer d'une interface à une autres du PC (il devient un routeur), mais n'est pas livré à la couche applicative.|
|OUTPUT |Chaîne qui permet aux paquets de quitter le PC après que les couches applicatives ont été traitées.|
|POSTROUTING | La décision de routage a été prise. Les paquets entrent dans cette chaîne, juste avant qu’ils soient transmis vers le matériel.|
===Cible===
Action effectuée en cas de validation d'une règle.\\ Voici les cibles prédéfinies les plus courantes :
* **Types de cibles** :
^Cible ^Description ^
|ACCEPT |Les paquets envoyés vers cette cible seront tout simplement acceptés et pourront poursuivre leur cheminement au travers des couches réseaux.|
|DROP |Cette cible permet de jeter des paquets qui seront donc ignorés.|
|REJECT|Permet d’envoyer une réponse à l’émetteur pour lui signaler que son paquet a été refusé.|
|LOG |Demande au noyau d’enregistrer des informations sur le paquet courant. Cela se fera généralement dans le fichier /var/log/messages (selon la configuration du programme syslogd).|
|MASQUERADE |Cible valable uniquement dans la chaîne POSTROUTING de la table NAT. Elle change l’adresse IP de l’émetteur par celle courante de la machine pour l’interface spécifiée. Cela permet de masquer des machines et de faire par exemple du partage de connexion.|
|SNAT |Egalement valable pour la chaîne POSTROUTING de la table NAT seulement. Elle modifie aussi la valeur de l’adresse IP de l’émetteur en la remplaçant par la valeur fixe spécifiée.|
|DNAT |Valable uniquement pour les chaînes PREROUTING et OUTPUT de la table NAT. Elle modifie la valeur de l’adresse IP du destinataire en la remplaçant par la valeur fixe spécifiée.|
|RETURN |Utile dans les chaînes utilisateurs. Cette cible permet de revenir à la chaîne appelante. Si RETURN est utilisé dans une des chaînes de base précédente, cela est équivalent à l’utilisation de sa cible par défaut.|
===Table===
On peut se représenter une table comme ce qui gère les paquets grâce à un regroupement de chaînes, elles-mêmes composées de règles ; c'est ce qui permet de contrôler les paquets arrivant et sortant.\\ Il existe pour trois tables (Filter, NAT et Mangle).
En bref, une table applique aux paquets plusieurs chaînes
^TABLE ^USAGE ^CHAÎNES ^
|FILTER\\ | Filtrage des paquets réseaux ; mise en place des règles du pare-feu.\\ Tout ce qui n'est pas explicitement autorisé doit être strictement interdit.\\ En pratique, on commence par mettre à ''DROP'' les 3 chaînes FORWARD, INPUT et OUTPUT.\\ Puis on autorise que certains flux bien particuliers.|INPUT\\ contrôle les paquets à destination des applications\\ OUTPUT\\ analyse les paquets qui sortent des applications\\ FORWARD\\ filtrage des paquets qui passent d'une interface réseau à l'autre. Les paquets de ce type ne passent jamais par les chaînes INPUT et OUTPUT|
|NAT | Translation d'IP : elle permet de transformer un PC en routeur | PREROUTING\\ Les paquets vont être modifiés à l'entrée de la pile réseaux, qu'ils soient à destination des processus locaux où d'une autre interface\\ POSTROUTING\\ Les paquets sortant des processus locaux sont modifiés.\\ OUTPUT\\ les paquets qui sont près à être envoyés aux interfaces réseaux sont modifiés. |
|MANGLE | Modification des paquets : permet à Linux d'avoir un contrôle sur les débits des flux de données entrants et sortants de la machine, afin de rendre certains flux plus prioritaires que d'autres | PREROUTING\\ INPUT\\ FORWARD\\ OUTPUT\\ POSTROUTING |
|RAW | principalement utilisée pour placer des marques sur les paquets qui ne doivent pas être vérifiés par le système de traçage de connexion.\\ (nécessite le module iptable_raw) | PREOUTING\\ OUTPUT |
Voir [[http://www.admin-debian.com/securite/iptables-et-netfilter/]]
====script client simple====
===commandes pour flush===
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
===liste de commandes testées et fonctionnelles pour futur script pare-feu user===
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -t filter -A OUTPUT -p udp -m udp\
--dport 53 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -p udp -m udp\
--sport 53 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -p icmp -m conntrack\
--ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -m conntrack\
--ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -m multiport\
--dports 80,443,8000 -m conntrack --ctstate\
NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -p tcp -m multiport\
--sports 80,443,8000 -m conntrack --ctstate\
RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -N OutGoingSSH
iptables -I INPUT -p tcp --dport 10015 -j OutGoingSSH
iptables -A OutGoingSSH -j LOG --log-prefix '[OUTGOING_SSH] : '
iptables -t filter -N InComingSSH
iptables -I OUTPUT -p tcp --sport 10015 -j InComingSSH
iptables -A InComingSSH -j LOG --log-prefix '[INCOMING_SSH] : '
iptables -t filter -A INPUT -i eth0 -s 192.168.0.0/24\
-p tcp -m tcp --dport 10015 -m conntrack\
--ctstate NEW,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -o eth0\
-p tcp -m tcp --sport 10015 -m conntrack\
--ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 10015 -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p tcp -m tcp --dport 10015 -m conntrack\
--ctstate NEW,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i eth0 -s 192.168.0.0/24 -p tcp --sport 10015 -m conntrack\
--ctstate ESTABLISHED -j ACCEPT
====commandes bash pour script passerelle (fin)====
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P INPUT ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#Maintenant que tout est à DROP il faut s'occuper de la boucle local
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Et notre interface interne :
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
#On garde nos règles concernant le DROP sur FORWARD (FILTER)
#mais on oublie pas eth1 !
iptables -t filter -A FORWARD -i eth1 -o eth0 -s 192.168.1.0/24\
-d 0.0.0.0/0 -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth1 -s 0.0.0.0/0\
-d 192.168.1.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A FORWARD -p icmp -j ACCEPT
iptables -t filter -A INPUT -p icmp -i eth0 -m conntrack\
--ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -o eth0 -m conntrack\
--ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A INPUT -p icmp -i eth1 -m conntrack\
--ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -o eth1 -m conntrack\
--ctstate ESTABLISHED,RELATED -j ACCEPT
# Et on prend soin de laisser entrer et sortir (INPUT, OUTPUT de FILTER)
# le flux nécessaire au DNS (53) et au web (80, 443..)
# et là encore on n'oublie pas eth1
iptables -t filter -A OUTPUT -o eth0 -p udp -m udp --dport 53\
-m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p udp -m udp --sport 53\
-m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -o eth1 -p udp -m udp --dport 53\
-m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i eth1 -p udp -m udp --sport 53\
-m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p tcp -m multiport --dports\
80,443,8000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p tcp -m multiport --sports\
80,443,8000 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -p tcp -m multiport --dports 80,443,8000 -j ACCEPT
iptables -A INPUT -i eth1 -p tcp -m multiport --sports 80,443,8000 -j ACCEPT
# Les règles imcp pour OUTPUT et INPUT
#(en y intégrant celles de testées pour FORWARD)
iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3/4 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 3/4 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 3/4 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 3/3 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 3/3 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3/3 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 3/1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3/1 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 3/1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 4 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 4 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 4 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 2/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j LOG --log-prefix "ICMP/in/8 Excessive: "
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 11 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 12 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 12 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.0.0/24 -p icmp\
--icmp-type echo-request -j ACCEPT
#pour le retour nous utilison la derniere regle
iptables -A FORWARD -s 192.168.0.0/24 -d 192.168.1.0/24 -p icmp\
--icmp-type echo-reply -j DROP
iptables -A INPUT -p icmp -m limit -j LOG --log-prefix "ICMP/IN: "
iptables -A OUTPUT -p icmp -m limit -j LOG --log-prefix "ICMP/OUT: "
#TCP_BAD
iptables -N syn_flood
iptables -I INPUT -p tcp --syn -j syn_flood
iptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A syn_flood -j LOG --log-prefix '[SYN_FLOOD] : '
iptables -A syn_flood -j DROP
# SSH
iptables -t filter -N InComingSSH
iptables -I INPUT -i eth0 -s 192.168.0.0/24 -p tcp -m tcp\
--dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j InComingSSH
iptables -A InComingSSH -j LOG --log-prefix '[INCOMING_SSH] : '
iptables -A InComingSSH -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p tcp -m tcp\
--sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -o eth1 -p tcp -m tcp\
--dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -i eth1 -s 192.168.0.0/24 -p tcp\
--sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#FTP_IN
iptables -N ftp_in_accept
iptables -I INPUT -i eth0 -p tcp --sport 21 -m state\
--state ESTABLISHED,RELATED -j ftp_in_accept
iptables -I INPUT -i eth0 -p tcp --sport 20 -m state\
--state ESTABLISHED,RELATED -j ftp_in_accept
iptables -I INPUT -i eth0 -p tcp --sport 1024:65535 --dport\
1024:65535 -m state --state ESTABLISHED -j ftp_in_accept
iptables -A ftp_in_accept -p tcp -j ACCEPT
iptables -A INPUT -i eth1 -p tcp --sport 21 -m state\
--state ESTABLISHED,RELATED -j ACCEPT
iptables -A NPUT -i eth1 -p tcp --sport 20 -m state\
--state ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT -i eth1 -p tcp --sport 1024:65535 --dport\
1024:65535 -m state --state ESTABLISHED -j ACCEPT
=====iptables : qqs compléments=====
====Masquerade====
iptables [-t table] [Action] [Options Valeur] [Cible]\\
iptables -t nat -A POSTROUTING -p tcp --destination-port smtp -j MASQUERADE\\
iptables -t NAT -A POSTROUTING -d machin.distant -j MASQUERADE\\
iptables -t NAT -A POSTROUTING -d machin.distant -p udp --dport domain -j MASQUERADE\\
====DHCP====
===Commandes pour récupérer les IP de la passerelle===
INET_IP=`ifconfig $INET_IFACE | grep inet | \
cut -d : -f 2 | cut -d ' ' -f 1 | awk 'NR==3{print $1}'`
Puis
echo $INET_IP
192.168.1.1
DHCP fonctionne sur le protocole UDP. Donc, on n'autorise que les ports UDP utilisés par DHCP, qui sont les ports 67 et 68.\\
Ensuite, il faut autoriser l'ouverture de ces ports uniquement sur l'interface de la passerelle susceptible de recevoir les requêtes DHCP.\\ En d'autres termes, on autorisera le flux sur les 67 et 68 pour l'interface eth1 qui relie le réseau B à la passerelle. Par exemple, si votre interface eth0 est activée par DHCP, vous n'autoriserez pas les requêtes DHCP sur eth1. Pour rendre la règle un peu plus précise, Ce sont les critères que nous choisissons pour sélectionner les paquets, et que nous autorisons.
Ce qui donne ceci :\\
* Dans une script
IPTABLES -I INPUT -i ${LAN_IFACE} -p udp --dport 67:68 --sport \
67:68 -j ACCEPT
* En ligne de commande :
IPTABLES -I INPUT -i 192.168.1.1 -p udp --dport 67:68 --sport \
67:68 -j ACCEPT
===Et le DHCP ?===
Rassurez-vous nous n'avons pas oublié d'ouvrir les UDP pour que le serveur DHCP installé sur cette passerelle puisse continué d'attribuer des IP à notre réseau B.
* Ne pas ajouter de règle aveuglément !
Voici une autre maxime qu'il faut appliquer.
On lit dans de nombreux wiki l'ajout de cette règle :\\
''IPTABLES -I INPUT -i 192.168.1.1 -p udp --dport 67:68 --sport 67:68 -j ACCEPT''\\
Nous ne l'ajouterons pas !
* Dans notre script nous avons mis :
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
Et nous allons à voir si une règle est à ajouter avec l'outil tcpdump.
===Utiliser tcpdump===
* On l'installe :
apt-get install tcpdump
*Puis on lance sur le serveur :
tcpdump -i eth1 port 67 or port 68
Rien ne se passe, c'est normal : pour voir quelque chose, il faut générer du flux depuis le client du réseau B.\\
On laisse le terminal en état d'attente, et on passe sur le client
* Côté client DHCP (ordinateur B) :
-On commence par annuler le bail DHCP.\\ Comme ceci :
dhclient -r eth0
-Il n'y a plus d'IP :
eth0 Link encap:Ethernet HWaddr 00:1e:0b:67:9b:b7
adr inet6: xxxxxxxxxxxx Scope:Lien
- On lance une requête DHCP
dhclient eth0
Observez ce que nous dit "tcpdump" au lancemant de la commande suivante sur l'ordinateur B (client DHCP) :
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
07:47:00.535348 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from xx:xx:xx:xx:xx:xx (oui Unknown), length 300
07:47:00.535553 IP debian-serveur.mondomaine.hyp.bootps > debian-hp.local.bootpc: BOOTP/DHCP, Reply, length 302
07:47:00.535745 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from xx:xx:xx:xx:xx:xx (oui Unknown), length 300
07:47:00.626390 IP debian-serveur.mondomaine.hyp.bootps > debian-hp.local.bootpc: BOOTP/DHCP, Reply, length 302
^C
4 packets captured
4 packets received by filter
- Et en plus l'IP de l'ordinateur B a changé !
INET_IP=`ifconfig $INET_IFACE | grep inet | \
cut -d : -f 2 | cut -d ' ' -f 1` && echo $INET_IP
192.168.1.4 127.0.0.1
=====Sauvegarde des règles iptables avec systemd=====
Nous allons utiliser cette fois systemd pour utiliser "service" au lieu d'init.d
===Prérequis : sauvegarde des règles du pare-feu===
Pour ce faire nous allons créer deux fichiers de sauvegarde iptables ;
* un pour "service start" et "service reload"
* un pour "service stop"
===Préparation de "service stop" ===
* Exécuter cette suite de commandes :
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables-save > /etc/iptables-gateway-flush
===Préparation de "service start" et de "service reload"===
* Exécuter ce script après l'avoir téléchargé :
Un script parce que ça fait beaucoup de commandes à copier/coller et coller le bloc entier dans une indigestion à bash.
Ne pas le lancé sur le serveur depuis un client en ssh.
#!/bin/sh
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -t nat -P PREROUTING ACCEPT
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P INPUT ACCEPT
/sbin/iptables -t nat -P OUTPUT ACCEPT
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
##commenter / décommenter et adapter les quatre lignes suivantes pour ne pas mettre en place / mettre en place
##un proxy transparent (squid)
/sbin/iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.0.1:3129
/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3129
/sbin/iptables -t mangle -A PREROUTING -p tcp --dport 3128 -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --dport 3129 -j DROP
#accepter l'interface lo
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
#accepter le sous-réseau
/sbin/iptables -A INPUT -i eth1 -j ACCEPT
/sbin/iptables -A OUTPUT -o eth1 -j ACCEPT
#permettre le passage entre les deux interfaces eternet de la passerelle
/sbin/iptables -t filter -A FORWARD -i eth1 -o eth0 -s 192.168.1.0/24 -d 0.0.0.0/0 -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -t filter -A FORWARD -i eth0 -o eth1 -s 0.0.0.0/0 -d 192.168.1.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -t filter -A FORWARD -p icmp -j ACCEPT
#accepter le ping entre les réseaux locaux
/sbin/iptables -t filter -A INPUT -p icmp -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -t filter -A OUTPUT -p icmp -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -t filter -A INPUT -p icmp -i eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -t filter -A OUTPUT -p icmp -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
/sbin/iptables -A FORWARD -p icmp --icmp-type 0 -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 3/4 -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp --icmp-type 3/4 -j ACCEPT
/sbin/iptables -A FORWARD -p icmp --icmp-type 3/4 -j ACCEPT
/sbin/iptables -A FORWARD -p icmp --icmp-type 3/3 -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp --icmp-type 3/3 -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 3/3 -j ACCEPT
/sbin/iptables -A FORWARD -p icmp --icmp-type 3/1 -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 3/1 -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp --icmp-type 3/1 -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 4 -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp --icmp-type 4 -j ACCEPT
/sbin/iptables -A FORWARD -p icmp --icmp-type 4 -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 2/s -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 8 -j LOG --log-prefix "ICMP/in/8 Excessive: "
/sbin/iptables -A INPUT -p icmp --icmp-type 8 -j DROP
/sbin/iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
/sbin/iptables -A FORWARD -p icmp --icmp-type 8 -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT
/sbin/iptables -A FORWARD -p icmp --icmp-type 11 -j ACCEPT
/sbin/iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp --icmp-type 12 -j ACCEPT
/sbin/iptables -A FORWARD -p icmp --icmp-type 12 -j ACCEPT
/sbin/iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.0.0/24 -p icmp --icmp-type echo-request -j ACCEPT
/sbin/iptables -A FORWARD -s 192.168.0.0/24 -d 192.168.1.0/24 -p icmp --icmp-type echo-reply -j DROP
/sbin/iptables -A INPUT -p icmp -m limit -j LOG --log-prefix "ICMP/IN: "
/sbin/iptables -A OUTPUT -p icmp -m limit -j LOG --log-prefix "ICMP/OUT: "
/sbin/iptables -N syn_flood
/sbin/iptables -I INPUT -p tcp --syn -j syn_flood
/sbin/iptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN
/sbin/iptables -A syn_flood -j LOG --log-prefix '[SYN_FLOOD] : '
/sbin/iptables -A syn_flood -j DROP
#autoriser la connexion avec les serveurs DNS
/sbin/iptables -t filter -A OUTPUT -o eth0 -p udp -m udp --dport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -t filter -A INPUT -i eth0 -p udp -m udp --sport 53 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -t filter -A OUTPUT -o eth1 -p udp -m udp --dport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -t filter -A INPUT -i eth1 -p udp -m udp --sport 53 -m state --state RELATED,ESTABLISHED -j ACCEPT
#autoriser la navigation web
/sbin/iptables -t filter -A OUTPUT -o eth0 -p tcp -m multiport --dports 80,443,8000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -t filter -A INPUT -i eth0 -p tcp -m multiport --sports 80,443,8000 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -o eth1 -p tcp -m multiport --dports 80,443,8000 -j ACCEPT
/sbin/iptables -A INPUT -i eth1 -p tcp -m multiport --sports 80,443,8000 -j ACCEPT
#Si le serveur cups est branché sur un ordinateur du réseau 192.168.0.0/24, par exemple sur 192.168.0.22
# laisser décommenter les deux lignes suivantes :
/sbin/iptables -A INPUT -i eth0 -s 192.168.0.22 -d 192.168.0.1 -p tcp --sport 631 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -o eth0 -s 192.168.0.1 -d 192.168.0.22 -p tcp --dport 631 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
#créer une chaîne utilisateur pour les connexion ssh, les loguer et les accepter
/sbin/iptables -t filter -N InComingSSH
/sbin/iptables -I INPUT -i eth0 -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j InComingSSH
/sbin/iptables -A InComingSSH -j LOG --log-prefix '[INCOMING_SSH] : '
/sbin/iptables -A InComingSSH -j ACCEPT
/sbin/iptables -t filter -A OUTPUT -o eth0 -p tcp -m tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
/sbin/iptables -t filter -A OUTPUT -o eth1 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
/sbin/iptables -t filter -A INPUT -i eth1 -s 192.168.0.0/24 -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#créer une chaîne utilisateur pour les connexions ftp, et les accepter
/sbin/iptables -N ftp_in_accept
/sbin/iptables -I INPUT -i eth0 -p tcp --sport 21 -m state --state ESTABLISHED,RELATED -j ftp_in_accept
/sbin/iptables -I INPUT -i eth0 -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ftp_in_accept
/sbin/iptables -I INPUT -i eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ftp_in_accept
/sbin/iptables -A ftp_in_accept -p tcp -j ACCEPT
/sbin/iptables -A INPUT -i eth1 -p tcp --sport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -i eth1 -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -I INPUT -i eth1 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
exit 0
* Lui ajouter droits d'exécution et compagnie ...
chmod +x /etc/init.d/firewall-client.sh
chmod 755 /etc/init.d/firewall-client.sh
* L'exécuter : adapter la commande suivante en fonction de chemin du fichier téléchargé
Par exemple :
bash /home/hypathie/script-iptables-passerelle
iptables-save > /etc/iptables-gateway
===Mise en place de service systemd ===
* Il faut créer un fichier dans le répertoire "cd /etc/systemd/system/":
vim /etc/systemd/system/iptables.service
[Unit]
Description=Firewall et NAT
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c "/sbin/iptables-restore < /etc/iptables-gateway"
ExecReload=/bin/sh -c "/sbin/iptables-restore < /etc/iptables-gateway"
ExecStop=/bin/sh -c "/sbin/iptables-restore < /etc/iptables-gateway-flush"
[Install]
WantedBy=multi-user.target
**cp /etc/systemd/system/iptables.service /lib/systemd/system/**
===Prise en compte par systemD===
* On installe
apt-get install systemd
* Puis on charge son fichier
systemctl -f enable iptables.service
* Et maintenant :
systemctl start iptables.service
=====Example squid conf =====
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
#acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
#acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl LAN src 132.5.210.0/24 # network local
acl SSL_ports port 443
acl SSL_ports port 10000
acl SSL_ports port 631
acl SSL_ports port 563
acl SSL_ports port 873
# acl badsite url_regex "/etc/squid/squid-deny.acl"
acl Safe_ports port 80 # https
acl Safe_ports port 21 # webmin
acl Safe_ports port 443 # Cups
acl Safe_ports port 70 # snews
acl Safe_ports port 210 # rsync
acl Safe_ports port 1025-65535 # http
acl Safe_ports port 280 # ftp
acl Safe_ports port 488 # https
acl Safe_ports port 591 # gopher
acl Safe_ports port 777 # wais
acl Safe_ports port 631 # unregistered ports
acl Safe_ports port 873 # http-mgmt
acl Safe_ports port 901 # gss-http
acl purge method PURGE # filemaker
acl CONNECT method CONNECT # multiling http
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
icp_access allow localhost
http_access allow LAN
http_access deny all
# http_access deny badsite
icp_access deny all
http_port 132.5.210.16:3128 transparent
hierarchy_stoplist cgi-bin ?
cache_mem 512 MB
maximum_object_size_in_memory 1024 KB
minimum_object_size 0 KB
maximum_object_size 2048 KB
cache_dir ufs /var/spool/squid3 4096 16 256
access_log /var/log/squid3/access.log squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Package(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320
hosts_file /etc/hosts
pipeline_prefetch on
shutdown_lifetime 3 second
TCP_REFRESH_UNMODIFIED/304\\
* cache directories
new cache directory :
/home/hypathie/cache/spool/squid3/
->
/mnt/proxy/cache/spool/squid3
*logs directory :
/var/log/squid3/access.log
->
/mnt/proxy/log/squid3/access.log
tail -f /mnt/proxy/log/squid3/access.log
ou
tail -f /var/log/squid3/access.log
owner : proxy not root
*cache_store_log
/mnt/proxy/cache_store_log/store.log
->
/home/hypathie/cache/spool/cache_store_log/store.log
* cache.log
/var/log/squid3/cache.log
->
/mnt/proxy/log/squid3/cache.log
only "TCP_MISS/200" never "TCP_HIT"\\
**Cache hit.** Un Cache hit a lieu chaque fois que Squid est en mesure de satisfaire une requête Web depuis son cache. Les paramètres tels que cache hit ratio et le cache hit rate donne le pourcentage de requêtes ayant satisfaits au hit. On considère généralement qu'un ratio compris dans l'intervalle [30%, 60%] est un bon ratio. Un autre paramètre, le byte hit ratio donne le volume de données délivré depuis le cache, en octets [byte].
**Cache miss.** Un Cache miss a lieu chaque fois que Squid n'est pas en mesure de satisfaire une requête Web depuis son cache. Cela peut survenir pour nombre de raisons :
-l'objet sollicité l'est pour la première fois !\\
-l'objet sollicité n'est pas cachable ;\\
-l'objet sollicité est périmé ;\\
-l'objet sollicité a été purgé du cache pour faire de la place à d'autres objets.\\
* Voici les règles qui sont suivies pour décider de la mise en cache :
Si des instructions interdisant la mise en cache sont rencontrées (Cache-Control: private), la ressource n’est pas mise en cache.\\
Si la connexion est sécurisée ou authentifiée, la ressource n’est pas mise en cache.
Si aucune directive de validation n’est présente (Last-Modified ou Etag), la ressource n’est pas mise en cache.\\
Autrement, la ressource est considérée comme éligible au cache et Squid décide de la stocker.
=====Test config =====
#Définition des ACL
acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
#acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
#acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
#acl localnet src 192.168.1.0/24 # RFC1918 possible internal network
#acl lan src 192.168.0.1 192.168.1.0/24
acl SSL_ports port 443 # https
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 873 # rsync
acl Safe_ports port 901 # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
###Nos ACL
#Notre réseau
acl lanhome src 192.168.1.0/255.255.255.0
#Les domaines qui doivent passer par Tor
#google
acl domain_tor dstdomain .google.fr
acl domain_tor dstdomain .google.com
acl domain_tor dstdomain .googleapis.com
acl domain_tor dstdomain .googleusercontent.com
acl domain_tor dstdomain .recaptcha.net
#facebook
acl domain_tor dstdomain .fbcdn.net
acl domain_tor dstdomain .facebook.com
#yahoo
acl domain_tor dstdomain .yahoo.com
acl domain_tor dstdomain .yimg.com
acl domain_tor dstdomain .yahoo.fr
#torrent
acl domain_tor dstdomain .openbittorrent.com
#On définie le contrôle si c est un post ou pas
acl method_post method POST
#Le contrôle des extentions qui ne doivent pas être mises en cache
acl extention_no_cache url_regex \.iso$ \.mdf$ \.mkv$ \.mp4$ \.wma$ \.mp3$ \.wav$ \.flac$ \.torrent$ \.mpeg$ \.mpg$ \.exe$ \.vbs$ \.msi$ \.avi$ \.php$ \.php5$ \.php4$ \.php3$ \.html$ \.htm$
#Si on veut que certaines extentions passent par tor
acl files_to_tor url_regex \.js$ \.css$
#Si on veut que certaines extentions NE passent PAS par tor
acl files_NO_tor url_regex \.flv$ \.avi$ \.mpg$ \.mpeg$ \.wmv$
###L acces HTTP... Utilise donc les ACL définis plus haut. Je m'étend pas dessus
http_access allow manager localhost
http_access deny manager
# Only allow purge requests from localhost
http_access allow purge localhost
http_access deny purge
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports
http_access allow lanhome
http_access allow localhost
# And finally deny all other access to this proxy
http_access deny all
###Les ICP, protocole d'échange entre serveurs de cache
#Allow ICP queries from local networks only
icp_access allow localnet
icp_access deny all
###Le port d'écoute ! Ici on dit qu'on prend le port 3128, qui écoute notre adresse.
#Transparent, signifie que le proxy accepte une redirection de port, ainsi qu'on ne soit pas obligé de spécifier de proxy dans le navigateur
http_port 192.168.2.1:3128 transparent
#Heu...
hierarchy_stoplist cgi-bin ?
#La mémoire utilisée
cache_mem 128 MB
maximum_object_size_in_memory 1 MB
##Vous pouvez modifier l'emplacement des repertoires de log
access_log /var/log/squid/access.log squid
#access_log /home/hypathie/squid/squid_access.log squid
cache_log /var/log/squid/cache.log
#cache_log /home/[user]/squid/cache.log
cache_store_log /var/log/squid/store.log
cache_store_log /home/[user]/squid/store.log
###Durée de cache en seconde.
refresh_pattern -i \.gif$ 10080 150% 43200 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.flv$ 10080 150% 43200 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.js$ 10080 150% 43200 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.pdf$ 10080 90% 43200 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.art$ 10080 150% 43200 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.avi$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.mov$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.wav$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.mp3$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.qtm$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.mid$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.viv$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.mpg$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.jpg$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.jpeg$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.png$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.rar$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.ram$ 10080 150% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.gif$ 10080 300% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.txt$ 1440 100% 20160 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.zip$ 2880 200% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.arj$ 2880 200% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.exe$ 2880 200% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.tgz$ 10080 200% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.gz$ 10080 200% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.tgz$ 10080 200% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
refresh_pattern -i \.tar$ 10080 200% 40320 ignore-no-store override-expire override-lastmod ignore-reload ignore-no-cache ignore-must-revalidate
#Suggested default:
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Package(.gz)*)$ 0 20% 2880
#refresh_pattern (\.deb|\.udeb)$ 129600 100% 129600
refresh_pattern . 0 20% 4320
###ICI on peut spécifier un autre serveur DNS si on le souhaite
#dns_nameservers 89.233.43.71 89.104.194.142
##Changer la durée du cache des noms de domaine.
#positive_dns_ttl 48 hours
#negative_dns_ttl 1 minutes
# Don't upgrade ShoutCast responses to HTTP=>Heuuu
acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
upgrade_http0.9 deny shoutcast
# Apache to signal ETag correctly on such responses=>Heeuuu
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
# You can add up to 20 additional "extension" methods here.
extension_methods REPORT MERGE MKACTIVITY CHECKOUT
###Les repertoires
hosts_file /etc/hosts
coredump_dir /var/spool/squid
##le nom du proxy...
#visible_hostname not_your_business
#cache_dir ufs /home/[user]/squid/cache 1000 16 256
cache_dir ufs /home/hypathie/cache/spool/squid3/ 100 16 256
#La mémoire, demandez moi pas la différence
memory_pools_limit 256 MB
### Cache
#On interdit de mettre en cache les extensions
#sans caches définis dans les ACL plus haut
#cache deny extention_no_cache
#cache allow src all
### MULTIPLE CACHE
#Et oui, vous avez vu squid redirige soit vers privoxy un soit vers privoxy2. Il a donc #deux caches différents.
#On indique qu'il a quelqu'un derrière, il doit pas renvoyer directement le paquet sur #le net
#prefer_direct off
#never_direct deny SSL_ports
#never_direct allow all
#
=====Inverser les mots d'une phrase=====
PROCEDURE INVERSER L'ORDRE DES MOTS D'UNE PHRASE TERMINEE PAR UN POINT
___________________________________________________________________________________________
1) Définition du problème :
une phrase | | Une phrase nouvelle phrase dont les
avec point --------> | | ---> mots sont séparés d'un seul espace écrit à l'envers
obigatoire | | dont chacun des mots sont écrits à l'envers.
2 ) Jeu d'essai
Phrase phrase inversée
------------------------------------------------------------------
' '. ' '
. '.'
"Il fait beau." "lI tiaf uaeb."
"Li tiaf uaeb." "iL fait beau."
"il fait beau." "li tiaf uaeb."
"il fait beau." "li tiaf uaeb."
"il fait. beau" "li tiaf."
3)Algo de principe:
Parcourir une phrase terminée par un point pour lui enlever les espaces inutiles.
Saisir chaque mot avec sa taille sur cette phrase.
Inverser et copier chaque mot de cette phrase dans une nouvelle chaîne.
4) Définition des données
5) Programme de test
6) Programme de la procédure inverser l'ordre des lettres des mots dans une phrase
________________________
réflexion préalable sur l'affichage d'un tableau
---------------------
= > comment afficher un tableau dans le bon sens ?
Enregistrer un tableau de 1 à n (sens du début à la fin)
n
| b | o | n | j | o | u | r |
1 2 3 4 5 6 7
Pour i de 1 à n
cible := Mot[1], cible := 'b' ; pour cible := Mot[2], cible := 'o' ...
// donc pour afficher tous les éléments de tab dans l'ordre' on fait
// cible := Mot[n], cible := n
// lire (Mot[cible]) de 1 à n
// Pour avancer on sait que n suit l'indice i du tableau, càd, quand n =1 ; i = 1'
// Donc ci-dessus revient à : lire (Mot[i]) de 1 à n
// Pour avancer : Pour i de 1 à n
// lire (Mot[i]) ; i := i + 1
// Ou encore :
// TANTQUE i <= n FAIRE
// i := i + 1
// lire(Mot[i])
// FINTANTQUE
Pour lire un tableau en sens inverse de longueur à 1 (par exemple de 7 à 1)
Pour i de longueur à 1 (par exemple, longueur = 7 ; on a 'r' )
i commence à 7 et termine à 1 ; à chaque tour on enleve 1 à i (i=i-1)
cible := mot[i] ; par exemple quand i = 4 ; mot[4]='n' ; cible prend la valeur 'n'
mot-inverse[longueur - i ] := cible ;ainsi 7-4 =3 donc Mot-Inverse[3]='n'
n
| b | o | n | j | o | u | r | => lire(MotInverse[longueur - i ])
1 2 3 4 5 6 7
____________________________________________________________________________
fonction inversMot(entrée chaine : Mot
entrée long : entier) : Mot
Type
Mot = tableau[long] de caractères
Variables
long : entier // taille réelle de mot
i : entier // indice de parcours en sens inverse de Mot[long]
MotInverse : Mot // c est le mot inversé
Début
écrire('saisissez un mot')
lire(mot, tailleMot)
i := tailleMot
long := long(mot)
Pour i de (long) à 1
cible := mot[i]
motInverse[long - i]
FinPour
copier(MotInverse)
Fin
________________________