filtrage de spam en ipv6
Transcription
filtrage de spam en ipv6
FILIERE SYSTEMES LOGICIELS ET RESEAUX RENNES 2010-2011 PROJET INDUSTRIEL FILTRAGE DE SPAM EN IPV6 CAS DUAL STACK LITE Rapport Final Par : Abdessamad EL GON NOUNI Mustafa IDELHOUSSAIN [email protected] [email protected] Encadrants : Laurent TOUTAIN Tanguy ROPITAULT [email protected] [email protected] 21/03/2011 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite Sommaire Introduction..................................................................................................................................... 4 I. Architecture de mail globale ........................................................................................................... 5 II. Technique de filtrage....................................................................................................................... 6 1. Greylist ........................................................................................................................................ 6 2. Bayes ........................................................................................................................................... 6 3. Listes Noires : .............................................................................................................................. 6 3.1. Types de listes noires : ............................................................................................................ 6 3.1.1. RHSBL: Right Hand Side Black List ....................................................................................... 6 3.1.2. DNSBL: DNS Black List.......................................................................................................... 7 3.1.3. DNSBL URI : DNS Black List Uniform Ressource Identifier .................................................. 7 3.2. Critères d’ajout dans une liste noire : ..................................................................................... 8 3.2.1. Plaintes utilisateurs: ............................................................................................................ 8 3.2.2. Adresses piège : ................................................................................................................... 8 III. Architecture DS-lite ..................................................................................................................... 9 IV. Nouvelles problématiques ........................................................................................................ 11 V. Description de la solution.............................................................................................................. 12 1. Notification de spam MTA-AFTR : ............................................................................................. 12 2. Table de score ........................................................................................................................... 12 3. Table de filtrage......................................................................................................................... 13 4. DNSBLv6 .................................................................................................................................... 13 5. Architecture générale du Framework : ..................................................................................... 14 VI. 1. Implémentation de la solution .................................................................................................. 16 Protocole de communication : .................................................................................................. 16 1.1. Format des messages : .......................................................................................................... 16 1.2. Les messages : ....................................................................................................................... 16 1.3. Scénario nominal ................................................................................................................... 17 2. Implémentation de la solution en C : ........................................................................................ 18 2.1. Hypothèses : .......................................................................................................................... 18 2.2. Etude fonctionnelle : ............................................................................................................. 18 3. Problématiques restantes : ....................................................................................................... 19 3.1. Timeout iptables.................................................................................................................... 19 3.2. Règles redondantes ............................................................................................................... 19 2 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite 3.3. Bande passante ..................................................................................................................... 20 3.4. Test de trafic réel................................................................................................................... 21 VII. Conclusion & Perspectives : ...................................................................................................... 22 VIII. Annexes ..................................................................................................................................... 23 1. Annexe 1 : Commands_MTA ..................................................................................................... 23 2. Annexe 2 : natEntries ................................................................................................................ 24 3. Annexe 3 : DSlite_spam_notifier.c ............................................................................................ 26 4. Annexe 4 : DSlite_spam_handler.c............................................................................................ 28 Bibliographie.......................................................................................................................................... 41 3 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite Introduction Les adresses IPv4 libres vont bientôt être épuisées. Par conséquent, le passage en IPv6 devient une nécessité pour les opérateurs afin d'assurer leurs services malgré l'augmentation du nombre de clients. Et vue l'incompatibilité entre ces deux protocoles et l'utilisation universelle du protocole IPv4, les ISP (Internet Service Provider) sont obligés de passer par une phase de transition pour réduire l’impact de ce changement. L'une des solutions proposées est l'architecture DS Lite (Dual-Stack Lite) qui consiste à migrer le réseau d'accès de l'opérateur en IPv6 de manière transparente vis à vis ses clients tout en gardant le réseau cœur en IPv4. En effet, une adresse IPv4 sera partagée entre plusieurs clients ayant chacun une adresse IPv6 unique, le CGN (Carrier Grade NAT) gérera le mapping en utilisant les numéros de port TCP/UDP. Cependant, cette solution de transition ainsi que l'utilisation d'une adresse IPv6 par les clients génèrent une problématique de filtrage de SPAM. Le but de ce projet est de mettre en œuvre un mécanisme de filtrage de spam en IPv6 dans le cas d’une architecture DS-lite. Cette solution devra bloquer les spammeurs sans impacter les autres clients qui partagent la même adresse IPv4. Dans la première partie, on présentera brièvement l’architecture générale du mail et les équipements qu’on utilise pour envoyer, relayer ou recevoir les messages sur le réseau. Puis, on détaillera quelques techniques de filtrages utilisées aujourd’hui pour identifier et intercepter les mails de sources douteuses. Ensuite, on se focalisera sur l’architecture DSLite (Dual Stack Lite) et on expliquera les problèmes induits par cette architecture pour le filtrage des messages. Enfin, on présentera une solution pour palier à ces problèmes. 4 Rapport final I. Filtrage de spam en IPv6 – Cas Dual Stack Lite Architecture de mail globale Le schéma suivant illustre de façon simplifiée les éléments importants qui interviennent dans les flux de mail : Figure 1 : Architecture Globale Mail Un message est rédigé par un aMUA (Author Mail User Agent), qui le soumet à un MSA (Mail Submission Agent). Le MSA s'assure du respect des standards internet et des règles définies au préalable par l'administrateur du domaine. Le message est transmis ensuite vers le MTA (Mail Transfer Agent) et sera transféré de MTA à MTA jusqu'au MDA du domaine destinataire. Le MDA (Mail Delivery agent) dépose enfin le message reçu dans la boite aux lettres du destinataire qui sera ensuite récupéré par le rMUA (Recipient MUA). Le protocole utilisé pour l'acheminement du message du aMUA jusqu'au MDA est SMTP, par contre on utilise soit le protocole POP3 ou IMAP entre le MDA et rMUA. Les MTA ne modifient pas le contenu du message, par contre, ils se chargent de filtrer les messages non conformes (ex. spam). 5 Rapport final II. Filtrage de spam en IPv6 – Cas Dual Stack Lite Technique de filtrage Plusieurs techniques sont utilisées pour détecter et filtrer les spams. On peut éventuellement combiner plusieurs mécanismes afin d’avoir une meilleure précision. Ci-dessous les mécanismes les plus utilisés par les filtres anti-spam : 1. Greylist Les MTA Spammeurs ne renvoient pas les messages en cas d'échec puisqu'ils ne gardent pas en mémoire les messages envoyés. L'efficacité du graylisting réside dans le blocage temporaire de tout nouveau message reçu. On identifie chaque message par un triplet (adresse IP expéditeur, adresse email expéditeur, adresse email destinataire). Si ce dernier est inconnu (ne fait pas parti d'une liste blanche ou noire), le MTA rejette temporairement le message et met le triplet dans la greylist. S'il est renvoyé avant une durée déterminée, il sera blanchi et le message accepté. Tout triplet "gris" est effacé de la greylist après un certain délai. 2. Bayes Ici on va analyser le contenu du message afin de calculer la probabilité qu'il soit un spam. Il sera rejeté si cette probabilité dépasse un seuil arbitraire. Ce filtre se base sur un apprentissage dynamique des mots-clés souvent utilisés dans les messages de sources douteuses . 3. Listes Noires : Le blacklistage est une méthode simple et efficace pour identifier le spam sur le réseau, cette technique a abouti à la création de plusieurs listes noires connues (SBL, SCBL...etc.) que le MTA peut consulter à chaque réception d’un nouveau message. Ces listes ne sont utilisées que pour identifier le spam. Un message provenant d’une adresse IP figurant dans l’une d’elles ne sera pas systématiquement détruit. Le MTA a le choix entre plusieurs actions selon la politique de sécurité adoptée : Effectuer d’autres vérifications sur d’autres listes noires, qualifier le message de SPAM et le relayer au destinataire, transférer le message dans le courrier indésirable ou le rejeter. 3.1.Types de listes noires : 3.1.1. RHSBL: Right Hand Side Black List 6 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite Ces listes sont basées sur les noms de domaines des spammeurs connus, c’est à dire la partie droite des adresses après le signe « @ » (exemple gmail.com, hotmail.fr... etc.) d’où le nom “Right Hand Side”. Les RHSBL ne sont pas efficaces vu que les spammeurs exploitent en général des machines zombies qui peuvent avoir un nom de domaine connu (comme gmail.com). 3.1.2. DNSBL: DNS Black List Les DNSBL sont des listes d’adresses IP des spammeurs identifiés sur le réseau, cette liste est associée à une zone DNS sur un nom de domaine (par exemple dnsbl.example.com) auquel on assigne les adresses IP détectées comme source de spam. Son utilisation est similaire au reverse DNS. La seule différence réside dans l'utilisation du record type “A” au lieu de “PTR” et le forward domain (dnsbl.example.com) au lieu de “in-addr.arpa”. Il existe plusieurs listes noires connues (spamhaus, spamcop...etc.) qui diffèrent par leurs critères d’identification du spam. La probabilité qu’un message soit un spam augmente considérablement avec le nombre de listes noires où figure l’adresse IP de l’émetteur. Spamhaus : Le projet Spamhaus1 est une organisation internationale qui gère en temps réel plusieurs listes noires, ces listes sont utilisées par plusieurs fournisseurs d’accès internet et administrateurs des serveurs mail pour identifier et intercepter le spam sur le réseau. Toute adresse IP ajoutée dans la SBL (Spamhaus Block List) est effacée après une durée qui peut varier entre 4 jours à 6 mois. Spamcop : Spamcop2 est un service de reporting gratuit. Il repose essentiellement sur les plaintes utilisateurs et les adresses pièges pour alimenter sa liste noire appelée SCBL (Spamcop Blocking List). Un score est calculé pour chaque adresse IP, il dépend du nombre des plaintes utilisateurs reçues contre cette adresse, la date à laquelle cette dernière a été utilisée pour envoyer le message et le nombre d’adresses pièges l’ayant reçu. Si ce score dépasse un seuil fixé par l’équipe Spamcop, le message sera considéré comme Spam et l’adresse IP sera ajoutée à la SCBL. Si aucune plainte n’est reçue contre cette adresse pendant 24h, elle sera systématiquement effacée de la liste (Cisco Systems, Inc). 3.1.3. DNSBL URI : DNS Black List Uniform Ressource Identifier Ces listes sont crées pour filtrer le nombre important de spams reçus pendant la période de temps entre le moment où le spammeur utilise pour la première fois une nouvelle adresse IP et celui où cette adresse est listée dans l’une des DNSBL utilisée par le serveur mail. Les DNBL URI regroupent les adresses IP et noms de domaines qu’on peut trouver dans le corps d’un message spam. Ce genre de méthode est extrêmement efficace, puisque les spammeurs utilisent les mêmes liens dans le corps du spam même s’ils changent constamment d’adresse IP émettrices. 1 2 (Wikipedia-Spamhaus) (Wikipedia-SpamCop) 7 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite Notons bien qu'il existe d'autres mécanismes utilisés pour filtrer les spams qu’on n’a pas détaillés (ex : filtrage par mot clé, filtrage heuristique, vérification de domaine...etc.). 3.2.Critères d’ajout dans une liste noire : 3.2.1. Plaintes utilisateurs: Les FAI (Fournisseur d’Accès Internet) prennent sérieusement en compte les plaintes clients pour identifier les spams puisque le but final d’un FAI est de satisfaire et protéger sa clientèle. Donc, s’il reçoit un nombre déterminé de plaintes contre un message donné, il le filtrera automatiquement et bloquera l’adresse IP émettrice. 3.2.2. Adresses pièges : En plus des plaintes utilisateurs, les FAI utilisent des adresses mail dites « pièges » pour identifier les spammeurs. Il existe deux types d’adresses pièges : • Adresses créées par les FAI : Cette technique repose sur un principe est très simple. Les adresses mail créées par les FAI n’appartiennent à aucun client réel, de ce fait, ils ne sont pas censées recevoir des messages (puisqu’ils ne sont inscrits à aucune liste de diffusion par exemple). Par conséquent, tout message reçu par l’une de ces boites mail est considéré comme du spam. • Adresses abandonnées par les utilisateurs : Certains utilisateurs abandonnent leurs adresses (pour changer de nom de domaine, nettoyer leur liste de contacts…etc.), ces adresses sont en général désactivées puis effacées par les FAI. Cependant, ces derniers gardent en leur possession quelques adresses qu’ils utilisent pour identifier les spams. Le processus de transformation de ces adresses en adresses pièges s’exécute en deux étapes. En premier temps, le MTA du FAI sera configuré pour rejeter tout message envoyé à ces boites, cette période varie entre 3 à 6 mois et sert à informer les émetteurs que cette boite mail n’est plus active et qu’il faut la supprimer de leur liste de contacts. Une fois cette étape achevée, l’adresse est réactivée puis utilisée pour piéger les spammeurs de la même façon que les adresses créées directement par les FAI. 8 Rapport final III. Filtrage de spam en IPv6 – Cas Dual Stack Lite Architecture DS-lite Principe : Un nombre de clients se voient partager une adresse IPv4 en se basant sur deux techniques : le tunneling (IPv4 in IPv6) et le NAT à grande échelle (LSN : Large Scale NAT). Les principaux éléments d'une architecture DS lite sont : • • • CPE : c’est la passerelle qui donne accès au réseau de l'opérateur. elle peut se comporter comme un serveur DHCP, routeur par défaut ou bien comme un serveur DNS pour le réseau privé du client. B4 : C’est l’élément qui crée le tunnel entre le CPE et l’AFTR. il permet également d’effectuer les opérations de fragmentation et d'assemblage pour palier au problème de MTU (RFC2473). Il peut se comporter aussi comme un proxy DNS. AFTR : Address Family Translation Router. il s’agit du nœud au bout du tunnel qui effectue la fonction du LSN, anciennement appelé CGN (Carrier Grade NAT). il permet d’allouer à chaque client un certain nombre de ports qui seront utilisés pour faire le mapping avec son adresse IPv6. Les deux techniques utilisées pour l’allocation de ports sont l’A+P et le PCP. Figure 2 : Architecture Dual Stack Lite L’ISP met en place un AFTR (le LSN) afin de mapper chaque adresse IPv6 avec une adresse IPv4 et un nombre de ports TCP/UDP. Les paquets sont ensuite acheminés dans un tunnel IPv4/IPV6 entre le B4 et le LSN et sortent de l’ISP vers l’internet en IPv4 après l’extraction et la translation. 9 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite Exemple3: Adresse IPv6 du B4 : 2001:db8:0:1::1 Adresse privée du client IPv4 : 10.0.0.1 Quand le client envoie un paquet IPv4, le B4 l’encapsule dans un paquet IPv6 en mettant son adresse comme adresse source et celle de l’AFTR comme adresse de destination. A l’autre bout du tunnel, l’AFTR décapsule le paquet IPv6 reçu et crée une entrée dans sa table de translation comme suit : IPv6 IPv4 Protocole Port IPv4 publique Protocole Port 2001:db8:0:1::1 10.0.0.1 TCP 10000 192.0.2.1 TCP 5000 L’adresse IPv6 du B4 peut être vue comme un identifiant du tunnel. Cette translation sera utilisée par l’AFTR pour le chemin de retour afin de mapper le paquet vers le bon tunnel. Notons qu'un paquet IPv6 sera acheminé normalement vers l'internet IPv6 sans passer par l'AFTR. Avantages : 3 • Maintien des services en IPv4 • Découplage du déploiement IPv6 dans le cœur réseau de l’ISP du déploiement dans le reste de l’internet. • Flexibilité par rapport au facteur d'échelle : l’ISP peut mettre en place des LSN d’une manière décentralisée en fonction du trafic. • Transparence au niveau applicatif : La communication se fait soit entre nœuds IPv4 ou nœuds IPv6, donc, il n’y a pas besoin d’une traduction de protocoles. (draft-ietf-softwire-dual-stack-lite-06) 10 Rapport final IV. Filtrage de spam en IPv6 – Cas Dual Stack Lite Nouvelles problématiques Les DNSBL sont certes un outil simple et relativement efficace pour filtrer une bonne partie des spams sur le réseau. Cependant, avec la mise en place d’une architecture Dual Stack, on se trouve face à quelques problèmes d’un point de vue architecture ou même des spécificités de l’IPv6. Dans une architecture Dual Stack, une adresse IPv4 publique est partagée entre plusieurs clients, De ce fait, le blocage de cette adresse impacte tout ceux qui la partagent. Prenons l’exemple d’un client qui envoie un spam et qu’un MTA le détecte, il ne verra que l’adresse IPv4, donc si ce MTA décide de bloquer cette machine en ajoutant son adresse IPv4 dans une liste noire, les autres clients qui partagent la même adresse publique ne pourront plus envoyer de mail jusqu’à ce que cette adresse soit effacée de cette liste, ce qui peut durer des mois si la machine infectée continue à envoyer les spams. Donc, on voit bien qu’on ne peut pas se baser sur l’adresse IPv4 pour bloquer un spammeur dans une architecture DS lite. L’autre problématique auquel on est confronté est l’utilisation de l’IPv6. Dans ce cas, un client peut avoir plusieurs adresses et peut la changer autant de fois qu’il le souhaite, ce qui diminue fortement la probabilité qu’elles soient ajoutées dans une liste noire. En plus, l’ajout de chaque adresse IPv6 (/128) dans la blacklist est inconcevable vu les ressources limitées des équipements en CPU et en mémoire. 11 Rapport final V. Filtrage de spam en IPv6 – Cas Dual Stack Lite Description de la solution On suppose que la détection de spam est effectuée au niveau d’un MTA de l’ISP. Cela dit, notre solution peut être intégrée à n’importe quel équipement en charge de cette opération. Tout d’abord, étant donné que plusieurs clients utilisent une adresse IPv4 commune, il est impensable de se baser sur cette adresse pour filtrer les spammeurs. Il faudra donc utiliser une information qui nous permettra d’identifier un client de façon unique par rapport aux autres, il s’agit de l’adresse IPv6 du B4. Cependant, le MTA ne voit que des paquets IPv4, seul l’AFTR est capable d’identifier les clients avec l’adresse IPv6 de leur B4. Par conséquent, il faut trouver un moyen pour bloquer les spams au niveau de l’AFTR sans pour autant déplacer la complexité de la détection à son niveau et la garder au niveau du MTA. La détection de spam sera donc effectuée de la même manière que dans une architecture normale, sauf qu’une notification doit être ajoutée pour informer l’AFTR qu’un mail reçu est douteux. Cette notification doit contenir l’adresse IPv4 et le port source qui ont été utilisés. l’AFTR, comme il a gardé en mémoire le contexte relatif à ce couple adresse/port, saura identifier le tunnel IPv6 correspondant. L’AFTR de son coté va maintenir deux tables. La première pour attribuer des scores aux préfixes des adresses signalées, et la deuxième pour le filtrage. La table de filtrage regroupera les préfixes IPv6 dont le score a dépassé un certain seuil dans la première table. On mettra en place également une DNSBL, qui sera peuplée par les préfixes qui ont été ajoutés à la table de filtrage. Elle sera exploitée par un MTA qui gère le mail IPv6 natif. 1. Notification de spam MTA-AFTR : Étant donné que la détection du spam est effectuée au niveau du MTA, une procédure de notification sera définie pour permettre à ce dernier de partager l’information avec l’AFTR. D’abord, un port TCP dédié sera ouvert au niveau de l’AFTR. Seule l’adresse IP du MTA sera autorisée à utiliser ce port pour communiquer avec lui. Le message de notification va contenir l’adresse IPv4 source et le port source utilisés pour l’envoi du spam. L’AFTR, à la réception d’une notification, va chercher dans sa table de translation l’adresse IPv6 du tunnel correspondant, si le préfixe de cette adresse est déjà listé dans la table des scores, il va simplement incrémenter son score. Sinon, il l’ajoute dans cette table avec un score initial de 1. Il reste à définir le protocole de communication utilisé pour normaliser ces notifications. 2. Table de score On mettra en place une table qui va contenir les préfixes des adresses indirectement signalés par le MTA comme sources de spam en associant à chacun un score. Si un MTA signale une adresse /128, on vérifie si elle fait partie d’un préfixe déjà existant dans la table, si c’est le cas on incrémente le score de ce préfixe sinon on ajoute le nouveau préfixe. 12 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite Si le score d’un préfixe dépasse un certain seuil, il sera ajouté à la table de filtrage et la DNSBL. Une entrée de cette table a une durée de vie prédéfinie. Si aucune notification n’est reçue pour une adresse pendant une durée T, le score de son préfixe est décrémenté de 1. Si on arrive à un score nul, on supprime le préfixe de cette table. On suppose qu’il existe une DNSL (DNS List) où les opérateurs définissent la taille de chaque préfixe alloué à leur clients, cette base a un rôle important dans notre solution puisqu’elle permettra de bloquer plus efficacement le spam en filtrant directement le bon préfixe de la machine source. En effet, lorsque l’AFTR confirme le blocage d’un préfixe en envoyant un message au MTA, ce dernier vérifie dans la DNSL si la taille du préfixe filtré correspond bien à celle alloué par l’opérateur, si ce n’est pas le cas, le MTA envoie un message à l’AFTR pour mettre à jour cette donnée dans la table de filtrage et également dans la table des scores. On considère que l’architecture du Fournisseur d’accès Internet est telle que les AFTR qui gèrent le réseau grand public sont différents de ceux qui gèrent les réseaux d’entreprise. On suppose aussi que le préfixe initial IPv6 alloué à un client du réseau grand public est un /564 (ce qui est largement suffisant pour ce type d’utilisateurs), donc on commence par filtrer les préfixes de taille /56. Par contre, si l’AFTR gère des clients “Entreprise”, on va appliquer un deuxième algorithme pour pouvoir filtrer d’autres niveau de préfixes, car ces clients peuvent avoir des préfixes /48 ou plus. Un préfixe autre que /56 sera ajouté à la table de filtrage s’il remplit l’une des deux conditions suivantes : 10 sous-préfixes appartenant à ce même préfixe listés dans la table de score. 5 sous-préfixes appartenant à ce même préfixe listés avec un score maximal. Ce préfixe figure dans la DNSL. En même temps, il sera ajouté à la table de score avec un score de 1. Le choix de l’utilisation du 2ème algorithme reviendra aux administrateurs du réseau du FAI. 3. Table de filtrage L’AFTR va effectuer une fonction de firewall en se basant sur cette table de filtrage. Elle est utilisée donc pour bloquer les paquets sur les ports 25 et peuplée par les préfixes ayant atteint le score maximal défini pour la table des scores. Chaque entrée de cette table aura une durée de vie égale au timer T. 4. DNSBL Pour exploiter les informations acquises par l’AFTR, on mettra en place une DNSBL pour les préfixes IPv6 que l’AFTR a bloqués. L’alimentation de cette liste noire pourra se faire soit directement par l’AFTR ou bien par le MTA. Tout autre MTA du réseau de l’opérateur (gérant les messages en IPv6 natif) pourra ainsi consulter cette liste afin de l’intégrer dans son processus de détection de spam (RFC5782 : DNS Blacklists and Whitelists). 4 Taille choisie par Orange pour un client grand public 13 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite Quand un préfixe est bloqué au niveau de l’AFTR, ce dernier envoie un message (voir le Framework) au MTA pour lui signaler ce blocage. Le MTA va ensuite se charger d’ajouter le préfixe IPv6 à la DNSBL. 5. Architecture générale du Framework : Figure 3 : Architecture du Framework (1) : Le MTA, se basant sur les mécanismes de filtrage cités dans la partie II, détecte le spam, puis envoie un message à l’entité DSN (DS-lite Spam Notifier). Le message contiendra le port duquel il est envoyé et l’adresse IPv4 publique de l’émetteur du spam. (2) : Le module Notifier du DSN enverra un message de notification à l’AFTR. Ce message suivra un protocole de communication spécifique (Voir la partie VI.1) et contiendra les informations reçues de la part du module de détection de spam. Le message est reçu par l’AFTR sur un port réservé pour la communication entre l’AFTR et le MTA. 14 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite (3) : La partie DSH (DS-lite Spam Handler) de l’AFTR se chargera de récupérer l’adresse IPv6 du spammeur en consultant la table de translation du NAT. On suppose que le contexte relatif à cette adresse sera encore présent puisque le MTA envoie sa notification dès la détection de spam. Mais dans le cas où le MTA décide de signaler un couple adresse/port ultérieurement par rapport à l’instant de l’envoie du mail, on pourra envisager d’exploiter les logs de l’AFTR pour trouver l’adresse IPv6 correspondante. (4) Le module “Scoring” mettra à jour la table de score. Il incrémente le score d’un préfixe à chaque fois qu’une adresse lui appartenant est notifiée. (5) Si le score du préfixe IPv6 atteint une valeur maximale fixé par l’opérateur (Threshold), alors on a deux choix : soit il sera automatiquement bloqué (ce qui implique le rejet de tout mail reçu par l’AFTR de la part d’une adresse de ce préfixe) ou bien on limitera la bande passante allouée à ce préfixe. (6) Si le DSH a choisi de bloquer le préfixe IPv6, il le signale au DSH. L’AFTR enverra ce message par le port dédié à la communication avec le MTA. (7) Le module DNS du DS-lite Spam Notifier ajoute le préfixe reçu à la DNSBL. La suite du Framework suppose l’existence de la DNSL : (8) Le DSN consulte la DNSL pour vérifier la taille du préfixe filtré. (9) Si le DSN découvre que la taille du préfixe alloué par le FAI est inférieure à celle bloqué par l’AFTR, il envoie un message de mise à jour du préfixe au DSH. (10) Le DSH met à jour la taille du préfixe bloqué dans la table de filtrage. 15 Rapport final VI. Filtrage de spam en IPv6 – Cas Dual Stack Lite Implémentation de la solution 1. Protocole de communication : La solution définie pour filtrer le spam dans un réseau DS lite impose une interaction entre l’AFTR et le MTA. Ce dernier détecte le spam et envoie une alerte à l’AFTR qui, grâce à son contexte NAT, identifie la source puis déclenche l’algorithme de calcul de score. Si le score atteint une valeur maximale fixée par l’opérateur, l’AFTR bloque le préfixe de la source et envoie un message au MTA pour qu’il l’ajoute à la DNSBL. Finalement, le MTA peut envoyer un message à l’AFTR pour diminuer la taille du préfixe si elle ne correspond pas à celle allouée par l’opérateur (après consultation de la DNSL). Pour assurer le bon fonctionnement du Framework, on doit simplifier et normaliser l’échange d’informations entre les deux machines. En effet, la taille et le type des données transportées influent sur le temps de traitement du message ce qui impacte le temps de réaction de notre solution. En plus, la spécification des règles de communications entre le MTA et l’AFTR garantit une meilleure robustesse face aux attaques externes. D’où la définition d’un protocole qui cadrera le flux de communication entre les deux. 1.1. Format des messages : Type de message Le 1er champ spécifie le type de message. Les messages de type 1xx sont envoyés par le MTA alors que les messages de type 2xx sont envoyés par l’AFTR. IP Address Ce champ contient selon le type de message l’adresse IPv4 ou IPv6 source du spam. Info Ce champ contient selon le type de message le numéro de port de l’adresse IPv4 ou la taille du préfixe IPv6 à bloquer. 1.2. Les messages : Vu la simplicité de notre solution, on n’a défini que 3 messages : 16 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite Spam Notification Format: "101" "IPv4 Address" "Port number" Ce message est envoyé par le MTA (type 1xx) pour notifier l’AFTR de la réception d’un spam. Le champ « IP address » contient l’adresse IPv4 source du mail douteux et le champ « info » contient le port TCP de l’AFTR émetteur de ce paquet. Exemple: 101 206.18.10.8 8382 Block response Format: "201" "IPv6 prefix" "length" Ce message est envoyé par l’AFTR (type 2xx) pour demander au MTA d’ajouter le préfixe IPv6 défini par les deux champs « IP Address » et « Info » (le champ « info » représente la taille du préfixe) à la DNSBL. Exemple: 201 2001:660:7301:4168::3 56 Update prefix Format: "102" "prefix" "length" Ce message est une réponse éventuelle au 201 où le MTA demande à l’AFTR de diminuer la taille du préfixe bloqué, le champ « info » contient la nouvelle taille à prendre en compte. Exemple: 102 2001:660:7301:4168::3 48 1.3.Scénario nominal Figure 4 : Scénario nominal Framework 17 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite 2. Implémentation de la solution en C : 2.1. Hypothèses : L’AFTR est un produit open source5 développé par le groupe ISC (Internet Systems Consortium), dont le code est écrit en langage C. Notre première tentative consistait à lire le code de l’AFTR et de le modifier dans le but d’ajouter le module « DS lite Spam Handler ». Cependant, vu notre niveau en langage C (premier contact dans ce projet) et la taille du fichier aftr.c (13 000 lignes), on a décidé de coder notre solution séparément et de faire appel aux commandes de l’AFTR quand c’est nécessaire, ces commandes sont détaillées dans le manuel produit par l’ISC6. En plus, comme on n’avait pas accès à une machine qui pouvait jouer le rôle du MTA, on a décidé de ne développer que le module DSH, et de simuler le DSN par un simple socket client. En outre, l’école n’a que 2 B4 déjà réservés à un autre projet, donc, notre AFTR n’était connecté à aucun réseau. Par conséquent, on avait décidé de remplacer la table du NAT par un fichier texte (Voir annexe 2), dont le contenu a été récupéré d’un autre AFTR (déjà raccordé à un réseau test) sachant que si notre AFTR était connecté au réseau, il suffirait de lancer la commande « list nat all» et de stocker le résultat dans le même fichier ou le traiter directement pas le programme. Notre solution se base sur les sockets en mode connecté, où le client simule le DSN (voir annexe 3) alors que le serveur représente le module DSH (voir annexe 4). 2.2.Etude fonctionnelle : Le DSN parcourt le fichier texte « commands_MTA » (annexe 1) pour récupérer les commandes à envoyer au DSH. Dès que Le DSH reçoit une commande, il vérifie dans le fichier « natEntries.txt » le contexte relatif au couple (@IPv4, port). S’il existe, il récupère le préfixe IPv6 correspondant et calcule son score. Si le score atteint une valeur maximale appelée « Threshold », il bloque directement ce préfixe et envoie un message du type 201 au DSN pour qu’il l’ajoute dans la DNSBL. Le blocage du préfixe se fait grâce aux règles ip6tables, qui permettent d’ajouter le préfixe directement dans la table du Firewall de la machine où est installé l’AFTR. Si le DSN signale un préfixe IPv6 pour la première fois, on l’ajoute à la table de score en lui attribuant un score de 1 et on arme le timer T (voir la partie V.2) qui représentera la durée de vie de ce score, si T expire avant de recevoir une autre notification concernant ce préfixe, on le supprime de la table de score. Sinon, on incrémente le score et on réarme T. Le DSN peut envoyer un message du type 102 pour changer la taille du préfixe filtré par l’AFTR. Dans ce cas, le DSH met à jour sa table de score et la table de filtrage en utilisant ip6tables. 5 6 Le code peut être récupéré sur le lien : http://www.isc.org/software/aftr/11/download/aftr-11targz. (ISC Inc, 2010) 18 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite Problématiques restantes : On a implémenté les fonctionnalités principales du mécanisme de filtrage de spam pour un AFTR destiné au grand public. Cependant, quelques points ne sont toujours pas réalisés. 3.1.Timeout iptables Selon notre algorithme, une entrée dans la table de filtrage ne doit pas y rester au-delà d’une durée T. Sauf qu’ip6tables ne permet pas de gérer nativement cette fonctionnalité. On aurait pu utiliser le module time en jouant sur l’option --datestop, mais ce n’est pas pratique, puisque la table de filtrage sera remplie de règles non utilisées et il n’y a aucun moyen de les nettoyer. On peut régler le problème des timeouts de deux façons différentes : La première consiste à gérer la suppression des règles après la durée T dans le cœur du module DSH qui va mémoriser la règle envoyée à ip6tables pour le filtrage, et dès que le score est décrémenté, ce qui équivaut à l’écoulement de la durée T, la même règle sera envoyée à ip6tables pour la supprimer. La deuxième solution consiste à utiliser un module d’ip6tables qui permettrait d’ajouter des règles temporaires au firewall. Le site http://linux-attitude.fr (Peccatte) propose justement deux patchs qui permettent d’ajouter ce module à iptables. Le premier patch est pour netfilter, donc le noyau, et le deuxième est pour iptables (en userland). iptables -A INPUT -s 192.168.2.1 -p tcp --dport 80 -m timeout --timeout 3600 –j ACCEPT Dans un premier temps, le module associe un timeout à une règle du firewall, mais cette règle ne disparait pas après l’expiration de ce dernier, toutefois, le patch propose une option –C qui permet de nettoyer les règles qui ne matcheront plus jamais. Pour ne pas encombrer le firewall, il serait judicieux d’ajouter la commande « iptables –C » au crontab journalier. Même si ce patch peut résoudre la problématique du timeout iptables, Il reste quelques points à éclaircir. D’abord, le patch netfilter a été développé pour la version 2.6.23 de linux, donc, il faudra vérifier s’il faut y apporter des modifications pour l’adapter à un noyau plus récent. En plus, dans notre cas, on s’intéresse plus au filtrage de préfixes IPv6, par conséquent, le patch doit être modifié pour utiliser ip6tables au lieu d’iptables. 3.2.Règles redondantes Ce problème vient du fait qu’ip6tables ne gère pas automatiquement sa table de filtrage. Il ne peut pas par exemple détecter l’ajout de deux règles exactement pareilles, et encore moins supprimer une règle quand il existe une autre règle plus générale. L’exemple suivant illustre un cas où la première règle doit être supprimée : 19 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite target prot opt source destination DROP tcp 2001:660:7301:4100::/56 DROP tcp 2001:660:7301::/48 2001:660:7301:54::/64 tcp dpt:smtp 2001:660:7301:54::/64 tcp dpt:smtp Ce cas se produit notamment quand le MTA envoie un message pour mettre à jour la longueur du préfixe qui a été bloqué par l’AFTR. S’il existe plusieurs sous-préfixes filtrés appartenant à ce même préfixe, seule la règle correspondante au sous-préfixe qui a été utilisé dans la requête du MTA sera supprimée. Deux solutions peuvent être envisagées. La première consiste à dire que le MTA doit envoyer des messages d’update de préfixe pour tous les sous-préfixes bloqués. Cependant, on risque d’ajouter la même règle plusieurs fois dans le firewall. Il faudra dans ce cas trouver une solution pour supprimer les doublons dans la table de filtrage. La deuxième option consiste à traiter tous les sous-préfixes dans le cœur du module DSH dès qu’il reçoit la première requête d’update du MTA. Cela peut être effectué durant la phase d’update des préfixes dans la table des scores. En effet, un seul sous-préfixe de la table des scores est mis à jour avec la nouvelle longueur, alors que les autres sont supprimés, on pourra donc envisager de supprimer la règle qui leur corresponde avant. 3.3.Bande passante Il s’agit de brider le débit du trafic mail d’un spammeur au lieu de le bloquer. La version actuelle du code fait un simple filtrage. Il faudra donc trouver un moyen pour diminuer le débit sur le port TCP 25 entrant pour l’adresse spammeuse. Il existe un moyen sous linux qui permettrait d’appliquer une qualité de service spéciale pour un flux de donnée précis. Il s’agit de « tc », Traffic Controller. (Keller, Ariane ETH Zurich, 2006). Cet outil permet de définir des classes de trafic et de leur appliquer la qualité de service souhaitée. L’exemple suivant montre comment on pourrait mettre en place cette fonctionnalité : D’abord, on définit la classe avec les paramètres souhaités : # tc qdisc add dev eth3 root handle 1: cbq # tc class add dev eth3 parent 1:0 classid 1:1 cbq rate 20Kbit avpkt 1000 \ bounded isolated Ensuite, on ajoute le filtre qui va matcher les paquets à brider : Cette commande va donc remplacer celle utilisée dans le code pour le filtrage. # tc filter add dev eth3 parent 1:0 protocol ipv6 u32 20 \ Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite match ip6 dport 25 0xffff \ match ip6 src 2001:660:7301:54::/56 \ flowid 1:1 Avec cette dernière commande, on pourra gérer de la même manière le bridage des préfixes spammeurs comme on fait avec le filtrage. 3.4.Test de trafic réel La version actuelle du code d’implémentation de notre algorithme a été testée sur l’AFTR mais sans MTA et sans trafic réel. On a simulé le MTA par un socket client qui envoie des notifications à l’AFTR, selon le protocole qu’on a défini, en se basant sur un fichier texte qui contenait ces requêtes (Voir annexe1) On a également simulé les contextes NAT de l’AFTR par un fichier texte qui contient le résultat de la requête « list nat all » qu’on aurait pu utiliser dans le cas d’un trafic réel. (Voir annexe 2) Ces tests nous ont permis de vérifier le bon fonctionnement du code, par contre, on ne peut pas affirmer si cette implémentation est capable de supporter la charge d’un trafic réel de production. Les tests dans un environnement réel permettront d’optimiser les valeurs fixées dans notre code, notamment le seuil de la table des scores, les timers ou les longueurs de préfixe à prendre en compte. 21 Rapport final VII. Filtrage de spam en IPv6 – Cas Dual Stack Lite Conclusion & Perspectives : L’architecture DS lite permet de passer de manière souple au monde IPv6. Elle consiste à migrer, dans un premier temps, le réseau d’accès en IPv6, tout en gardant le cœur de l’opérateur en IPv4. L’AFTR est utilisé comme nœud central pour lier les deux mondes. Néanmoins, le partage d’une adresse IPv4 par plusieurs clients soulève une problématique dans le cas du filtrage de spam. En effet, en filtrant une adresse IPv4 on risque de pénaliser tous les clients qui la partagent. Dans le cadre de notre projet, on a été amené à spécifier et implémenter une solution pour résoudre ce problème. Notre proposition consiste à mettre en place deux modules. Le premier, au niveau du MTA (DSN), identifie le couple (adresse IPv4, port source) de l’émetteur du spam et notifie le deuxième module (DSH), installé sur l’AFTR, qui se charge de récupérer l’adresse IPv6 correspondante et éventuellement la bloquer. A ce jour, on a développé et implémenté une première version du module DSH au niveau de l’AFTR qui n’inclut pas d’agrégation de préfixe. N’ayant pas accès à un vrai MTA, on était obligé de simuler cette machine par un simple socket client. Les tests effectués nous ont permis de valider les fonctionnalités principales du DSH ce qui répond aux objectifs qu’on s’est fixés au départ. Néanmoins, pour implémenter cette solution dans un vrai réseau d’opérateur, plusieurs points sont à approfondir : Au niveau du MTA Le DSN est sensé récupérer l’adresse IPv4 et le port source de l’émetteur sachant que le spam est identifié au niveau de l’antispam de la machine. Donc, il faut d’abord, spécifier l’interaction entre ces deux entités. Une piste de solution serait d’ajouter un champ dans l’entête du mail douteux. Il faut aussi prendre en compte la partie d’interrogation de la DNSL et la DNSBL. Le développement du DSN pourra aboutir à un test grandeur nature de notre solution. Au niveau des listes DNS Pour avoir une base de données des préfixes douteux bloqués par les différents AFTR du réseau de l’opérateur, il serait judicieux de créer une DNSBL alimentée par le MTA. Cette liste noire sera très utile dans un réseau natif IPv6. Au niveau de l’AFTR Le temps de réaction de l’AFTR impacte l’efficacité du système face aux spams. Pour augmenter les performances du module DSH, il serait plus intéressant de l’intégrer directement dans le cœur du code de l’AFTR pour exploiter les structures de données déjà définies. 22 Rapport final VIII. Filtrage de spam en IPv6 – Cas Dual Stack Lite Annexes 1. Annexe 1 : Commands_MTA # Spam Notification: 101 198.18.200.111 5367 # Wait 2s 101 198.18.200.111 5481 # Wait 2s 101 198.18.200.111 6460 # Wait 2s 101 198.18.200.111 6493 # Wait 12s 101 198.18.200.111 7595 # Wait 2s 101 198.18.200.111 9207 # Wait 2s 101 198.18.200.111 10486 # Wait 2s 101 198.18.200.111 20832 # Wait 2s 101 198.18.200.111 21751 # Wait 2s 101 198.18.200.111 22074 # Wait 2s 101 198.18.200.111 22169 # Wait 2s 101 198.18.200.111 22402 # Wait 2s 101 198.18.200.111 23116 # Wait 2s # Update prefix 102 2001:660:7301:4168:224:b2ff:fe5a:1136 48 23 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite 2. Annexe 2 : natEntries <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:5168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 24 36203 58839 38811 34037 43111 53309 36148 33437 33439 43131 48410 33448 43112 34236 57227 53863 36143 43134 58840 34041 33444 43138 47397 34019 33518 50569 37356 57233 38791 43133 34237 36211 43316 50574 43137 50573 33438 34028 50572 53864 38814 48408 50571 48423 33441 34023 33506 43106 37355 50575 38789 36126 53310 33443 50564 50570 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 5367 98.139.50.166 80 5481 193.51.224.22 80 6460 76.13.6.175 80 6493 50.16.235.161 80 7595 209.20.73.184 80 9207 66.196.80.71 443 10486 98.139.50.166 80 10711 76.13.6.209 80 11837 76.13.6.209 80 12394 209.20.73.184 80 12882 76.13.6.209 443 13033 76.13.6.209 80 13186 209.20.73.184 80 15167 77.238.161.253 80 16282 76.13.6.190 443 16919 66.196.80.71 80 17529 98.139.50.166 80 17918 209.20.73.184 80 18542 193.51.224.22 80 18932 50.16.235.161 80 19962 76.13.6.209 80 20832 209.20.73.184 80 21751 193.51.224.23 80 22074 50.16.235.161 80 22169 76.13.6.209 80 22402 72.21.211.171 80 23116 209.85.149.95 80 24436 76.13.6.190 443 24618 76.13.6.175 80 25457 209.20.73.184 80 26468 77.238.161.253 80 27444 98.139.50.166 80 27545 184.85.189.227 443 28033 72.21.211.171 80 30244 209.20.73.184 80 30342 72.21.211.171 80 31118 76.13.6.209 80 31401 50.16.235.161 80 31409 72.21.211.171 80 31425 66.196.80.71 80 32023 76.13.6.175 80 32482 76.13.6.209 443 32542 72.21.211.171 80 32555 76.13.6.209 443 32967 76.13.6.209 80 33672 50.16.235.161 80 33686 76.13.6.209 80 34072 209.20.73.184 80 34411 209.85.149.95 80 35020 72.21.211.171 80 35448 76.13.6.175 80 35899 98.139.50.166 80 38721 66.196.80.71 443 38999 76.13.6.209 80 39755 72.21.211.171 80 41172 72.21.211.171 80 Rapport final <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 2001:660:7301:4168:224:b2ff:fe5a:1136 Filtrage de spam en IPv6 – Cas Dual Stack Lite tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 192.168.1.133 25 34038 56592 50567 34036 43135 43113 33455 33442 53928 48422 56594 43130 33445 56599 50565 33446 43104 36219 43114 33432 36215 43136 43103 36155 43132 57238 38874 40299 38877 56661 36152 43323 49748 53927 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 198.18.200.111 41547 41673 41720 41784 42489 42885 45223 45349 46015 46806 47158 47648 49033 49098 49492 50437 51046 51166 52237 53682 53686 53930 54736 55155 56782 56902 57005 57345 57395 57818 58266 58656 59011 59734 50.16.235.161 80 66.196.65.174 80 72.21.211.171 80 50.16.235.161 80 209.20.73.184 80 209.20.73.184 80 76.13.6.209 80 76.13.6.209 80 66.196.80.71 80 76.13.6.209 443 66.196.65.174 80 209.20.73.184 80 76.13.6.209 80 66.196.65.174 80 72.21.211.171 80 76.13.6.209 80 209.20.73.184 80 98.139.50.166 80 209.20.73.184 80 76.13.6.209 80 98.139.50.166 80 209.20.73.184 80 209.20.73.184 80 98.139.50.166 80 209.20.73.184 80 76.13.6.190 443 76.13.6.175 80 209.85.149.118 80 76.13.6.175 80 66.196.65.174 80 98.139.50.166 80 184.85.189.227 443 87.248.122.90 80 66.196.80.71 80 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite 3. Annexe 3 : DSlite_spam_notifier.c /* * TELECOM Bretagne, */ March 2011 /* DS lite Spam Notifier Simulator * This is only a simulation of DSN module used for testing purpose * * [email protected] * [email protected] * */ #include #include #include #include #include #include #include #include <stdio.h> <stdlib.h> <unistd.h> <string.h> <sys/types.h> <sys/socket.h> <netinet/in.h> <netdb.h> void error(const char *msg) { perror(msg); exit(0); } int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; char buffer[256]; if (argc < 3) { fprintf(stderr,"usage %s hostname port\n", argv[0]); exit(0); } portno = atoi(argv[2]); //Use of "commands_MTA" FILE *fichier = NULL; fichier = fopen("MTA_commands", "r"); int nb_ligne; int i=0; while(fgets(buffer, 500, fichier) != NULL) { char buf0=buffer[0]; char comment[]="#"; if(comment[0]==buffer[0]) { printf("%s\n",buffer); continue; } 26 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); server = gethostbyname(argv[1]); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(0); } printf("Processing the message : %s", buffer); bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(portno); if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) error("ERROR connecting of socket"); n = write(sockfd,buffer,strlen(buffer)); if (n < 0) error("ERROR writing to socket"); bzero(buffer,256); n = read(sockfd,buffer,255); if (n < 0) error("ERROR reading from socket"); printf("Server response : %s\n",buffer); close(sockfd); nb_ligne++; bzero(buffer,256); //sleep between two commands (to use just for the demonstration) i++; if(i==4) //to show the update prefix command in the demonstration sleep(12); else sleep(2); } return 0; } 27 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite 4. Annexe 4 : DSlite_spam_handler.c /* * TELECOM Bretagne, */ March 2011 /* DS lite Spam Handler * * [email protected] * [email protected] * */ #include #include #include #include #include #include #include #include #include <stdio.h> <stdlib.h> <string.h> <unistd.h> <sys/types.h> <sys/socket.h> <netinet/in.h> <signal.h> <time.h> #define threshold 5 void error(const char *msg) { perror(msg); exit(1); } /* entry structure for scoring table */ struct entry { u_char address[INET6_ADDRSTRLEN]; int prefix_length; int score; time_t last_update; // last time this entry was updated struct entry *p_next; // next entry on the table }; /*initialisation p_head */ struct entry *p_head; const u_char mask6[129][16] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, { 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, { 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, { 0xf0, 0x00, 0x00, = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, Rapport final 0x00, { 0xf8, 0x00, { 0xfc, 0x00, { 0xfe, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, Filtrage de spam en IPv6 – Cas Dual Stack Lite 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 29 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, Rapport final { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0x00, { 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, Filtrage de spam en IPv6 – Cas Dual Stack Lite 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xc0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 30 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x00, 0x00 }, 0x80, 0x00 }, 0xc0, 0x00 }, 0xe0, 0x00 }, 0xf0, 0x00 }, 0xf8, 0x00 }, 0xfc, 0x00 }, 0xfe, Rapport final 0x00, { 0xff, 0x00, { 0xff, 0x80, { 0xff, 0xc0, { 0xff, 0xe0, { 0xff, 0xf0, { 0xff, 0xf8, { 0xff, 0xfc, { 0xff, 0xfe, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0xff, 0xc0, 0xff, 0xe0, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, Filtrage de spam en IPv6 – Cas Dual Stack Lite 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0xff, 0xc0, 0xff, 0xe0, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0xff, 0xc0, 0xff, 0xe0, 0xff, 0xf0, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 31 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, Rapport final { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, Filtrage de spam en IPv6 – Cas Dual Stack Lite 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0xff, 0xc0, 0xff, 0xe0, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0xff, 0xc0, 0xff, 0xe0, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0xff, 0xc0, 0xff, 0xe0, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 32 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x00 }, 0xff, 0x80 }, 0xff, Rapport final 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, Filtrage de spam en IPv6 – Cas Dual Stack Lite 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0 }, 0xff, 0xe0 }, 0xff, 0xf0 }, 0xff, 0xf8 }, 0xff, 0xfc }, 0xff, 0xfe }, 0xff, 0xff } }; /* These two functions calculate the prefix for an address and a netmask */ // first parameter in binary form (use pton before) u_char *compute_prefix_netAddr(u_char addr6[16],const u_char *mask) { u_char *prefix=malloc (INET6_ADDRSTRLEN); if(prefix != NULL){ int i = 0; for (i = 0; i < 16; i++) prefix[i] = addr6[i] & mask[i]; } inet_ntop(AF_INET6, prefix, prefix, INET6_ADDRSTRLEN); return prefix; } //first parameter in string form (ex : "2001:34::") u_char *compute_prefix_sAddr(u_char *addrS,const u_char *mask) { u_char addr6[16]; inet_pton(AF_INET6, addrS, addr6); u_char *prefix=malloc (INET6_ADDRSTRLEN); if(prefix != NULL){ int i = 0; for (i = 0; i < 16; i++) prefix[i] = addr6[i] & mask[i]; inet_ntop(AF_INET6, prefix, prefix, INET6_ADDRSTRLEN); } return prefix; } /* This function compare two prefixes * return 1 if they are equal and 0 if not */ int are_equal(u_char *prefix1,u_char *prefix2) { 33 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite int same=1; int i = 0; while(i<INET6_ADDRSTRLEN) { if(prefix1[i]!= prefix2[i]){ same=0; break; } i++; } return same; } /* * this function is used to Add or remove a prefix from filtering table * if type=0 it removes the prefix */ void fw_command(u_char *address,u_char *length,int type) { char *option; if(type==0) option="D"; // remove prefix else option="A"; // add prefix char iptab[512]="ip6tables -"; strcat(iptab,option); strcat(iptab," INPUT -s "); strcat(iptab,address); strcat(iptab,"/"); strcat(iptab,length); strcat(iptab," -i eth3 -d 2001:660:7301:1:20c:29ff:fed4:5c31/64 -p TCP --dport 25 DROP"); system(iptab); printf("test=%s",iptab); } /* * This function adds an entry to scoring table */ struct entry *add_end (struct entry *p_head, u_char *address, int prefix_length, int score) { //allocation struct entry *p_new = malloc (sizeof *p_new); if (p_new != NULL) { int i=0; for (i = 0; i <INET6_ADDRSTRLEN; i++) p_new->address[i] = address[i]; p_new->prefix_length = prefix_length; p_new->score = score; p_new->last_update=time(NULL); // default link 34 -j Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite p_new->p_next = NULL; // linking to the last entry if (p_head == NULL) { //it's the first one p_head = p_new; } else { //look for the last entry struct entry *p = p_head; while (p->p_next != NULL) { p = p->p_next; } // change the link for the last entry p->p_next = p_new; } } return p_new; } /* * This function removes an entry from scoring table */ del_entry(u_char *addr){ // we should have 3 entries to link 'previous' and 'next' in case 'current' is deleted struct entry *previous = p_head; struct entry *current = previous->p_next; struct entry *next = current->p_next; while (current != NULL) { u_char *curr_pref=compute_prefix_sAddr(current->address,mask6[current>prefix_length]); u_char *my_pref=compute_prefix_sAddr(addr,mask6[current->prefix_length]); int comp=are_equal(my_pref,curr_pref); if(comp) { // link 'previous' with 'next' previous->p_next = next; free(current); break; } // go to the next entry previous = current; current = next; next = next->p_next; } } /* * update an entry of scoring table 35 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite */ void update_entry(u_char *addr, struct entry *p_head) { struct entry *p = p_head; int exist=0; while (p != NULL) { u_char *pref1=compute_prefix_sAddr(p->address, mask6[p->prefix_length]); u_char *pref2=compute_prefix_sAddr(addr, mask6[p->prefix_length]); int comp=are_equal(pref1,pref2); if(comp){ exist=1; break; } p = p->p_next; } // incremente the score if the prefix exist if(exist==1){ p->score++; p->last_update=time(NULL); if(p->score<=threshold) printf("The prefix %s/%d already exist so the score=%d\n",p->address,p>prefix_length,p->score); if(p->score==threshold){ fw_command(p->address,"56",1); printf("The prefix %s/%d is filtered\n",p->address,p->prefix_length); } if(p->score==(threshold+1)){ p->score=threshold; printf("The prefix %s/%d has already a maximum score of %d\n",p>address,p->prefix_length,threshold); } } // the prefix does not exist, we add it with score 1 else { struct entry *cEntry; cEntry=add_end(p_head,addr,56, 1); printf("The new prefix %s/%d has a score of %d\n",cEntry->address,cEntry>prefix_length,cEntry->score); } } /* * Update a prefix length */ void update_prefix_len(u_char *addr, int new_prefix_length){ struct entry *p = p_head; int exist=1; 36 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite if(p != NULL) p=p->p_next; while (p != NULL) { u_char *pref1=compute_prefix_sAddr(p->address, mask6[new_prefix_length]); u_char *pref2=compute_prefix_sAddr(addr, mask6[new_prefix_length]); int comp=are_equal(pref1,pref2); if(comp && exist){ p->prefix_length=new_prefix_length; exist=0; } else if(comp==1 && exist==0) del_entry(p->address); p = p->p_next; } } /* * this function is used to update entries score regarding T timer * the score is decremented if no notification was received for an entry during T time */ void update_score (int sig) { signal (sig, update_score); struct entry *p = p_head; if(p != NULL) p=p->p_next; while (p != NULL) { int score_lifetime=10; // for testing purpose, this value is too small double diff; diff=difftime(time(NULL),p->last_update); if(diff>=score_lifetime && p->score>0){ p->score--; p->last_update=time(NULL)+(diff-score_lifetime); printf("\nUpdate scoring: score=%d prefix=%s/%d\n",p->score,p->address,p>prefix_length,p->last_update); } p = p->p_next; } alarm(5); } int main(int argc, char *argv[]) { //alarm signal (SIGALRM, update_score); 37 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite //instanciation p_head : u_char *addrS; addrS="FFFF::FFFF"; p_head=add_end(p_head,addrS,128,1000); int sockfd, newsockfd, portno; socklen_t clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; if (argc < 2) { fprintf(stderr,"ERROR, no port provided\n"); exit(1); } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); /* Loop to keep DSH module listening */ while(1){ alarm (5); listen(sockfd,5); clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("ERROR on accept"); bzero(buffer,256); n = read(newsockfd,buffer,255); if (n < 0) error("ERROR reading from socket"); printf("\n\n\033[31;47m************** New message received **************\033[0m\n\n"); printf("Here is the message: %s",buffer); if (n < 0) error("ERROR writing to socket"); // variables to store information from buffer char *type; u_char *ipAddr; char *info_bis; char *info; type = strtok (buffer, " "); ipAddr = strtok (NULL, " "); 38 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite info_bis = strtok (NULL, " "); info = strtok(info_bis,"\n"); //handeling requestes switch(strtol(type, NULL, 10)) { case 101 : printf("\n\t\033[37;40m***Spam notification***\033[0m\n"); // Get the nat contexts from the aftr process // the aftr process is listening on TCP port 1015 by default // this number should be modifier if it was lunched with another port system("echo help |nc localhost 1015 > contexts.txt"); u_char natBuf[256]; u_char *ipAddr6; char response[256]="201 "; FILE *fp; // we are using a static txt file for testing purpose // nat entries can be replaced with contexts.txt if we want to // apply it on a real case char context[256]="cat natEntries | grep \""; strcat(context,ipAddr); strcat(context," "); strcat(context,info); strcat(context,"\""); fp = popen(context, "r"); if(fgets(natBuf,256, fp)) { strtok(natBuf," "); ipAddr6=strtok(NULL," "); update_entry(ipAddr6,p_head); n=write(newsockfd,"OK",18); // this line should be modified to send the IPv6 blocked prefix } else{ printf("ERROR : No nat context found\n"); n = write(newsockfd,"ERROR",18); } break; case 102 : printf("\t\033[37;40m***Update prefix length***\033[0m\n"); fw_command(compute_prefix_sAddr(ipAddr,mask6[56]),"56",0); fw_command(compute_prefix_sAddr(ipAddr,mask6[atoi(info)]),info,1); update_prefix_len(ipAddr,atoi(info)); printf("The new prefix is %s/%d\n",compute_prefix_sAddr(ipAddr,mask6[atoi(info)]),atoi(info)); n = write(newsockfd,"OK",18); break; default : printf("ERROR\n"); } 39 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite /*Clear all tables*/ memset memset memset memset (buffer, 0, sizeof (buffer)); (type, 0, sizeof (type)); (ipAddr, 0, sizeof (ipAddr)); (info, 0, sizeof (info)); /*close client socket*/ close(newsockfd); } return 0; } 40 Rapport final Filtrage de spam en IPv6 – Cas Dual Stack Lite Bibliographie Cisco Systems, Inc. (s.d.). SpamCop. Consulté le Novembre 23, 2010, sur http://www.spamcop.net draft-ietf-softwire-dual-stack-lite-06. (s.d.). ISC Inc. (2010). Address Family Transition Router Manual. Consulté le 03 14, 2011, sur http://www.isc.org/files/book.pdf Keller, Ariane ETH Zurich. (2006, Juillet 20). Manual tc Packet Filtering and netem. Peccatte, B. (s.d.). linux-attitude.fr. Consulté le Mars 14, 2011, sur http://linux-attitude.fr/post/tout-estephemere RFC5782 : DNS Blacklists and Whitelists. (s.d.). Wikipedia-SpamCop. (s.d.). Consulté le Novembre 23, 2010, sur http://en.wikipedia.org/wiki/SpamCop Wikipedia-Spamhaus. (s.d.). Consulté le Novembre 23, 2010, sur http://en.wikipedia.org/wiki/Spamhaus 41