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