# [HOWTO] routeur UPNP (ou msn derrière un NAT).

## anigel

màj (28/09/2005) : je n'utilise plus cette solution, puisque je possède maintenant un routeur "hard". Mais je suis tombé par hasard sur cette page chez Microsoft, détaillant un peu les ports utilisés par MSN (le voile se lève enfin :d).

Bonsoir.

Nombre d'entre nous recontrent des soucis pour faire fonctionner les fonctions évoluées de msn messenger avec le monde lorsque leur pc est situé derrière leur firewall linux. Après de longues recherches, et nombre d'essais peu fructueux : ça marche enfin ! 

1. La théorie : quel est le problème ?

Prenons la topologie suivante : vous utilisez à la maison votre PC sous Windows, avec MSN Messenger pour discuter avec vos amis, et plus particulièrement pour les fonctions de transfert de fichiers, chat vocal et vidéo. Nous appelerons ce PC : XP1.

Un autre PC dans la maison est utilisé de la même manière, sous Windows, et sert occasionnelement à messenger : nous l'appelerons XP2.

Enfin, tout ce beau monde se connecte à internet via un firewall / routeur Linux qui partage sa connexion ADSL : nous l'appelerons Nunux  :Laughing:  !

Lorsque vous chattez sur XP1 (chat msn texte), msn va se connecter sur le port 1863/TCP à un serveur d chez microsoft. Nunux sait donc que c'est XP1 qui a initié la connexion vers le serveur chez MS, et saura donc router les paquets que ce dernier va renvoyer en réponse.

Idem, si XP2 sert vient pour se connecter de la même manière, Nunux saura "pister" (tracker en anglais) la connexion, pour ne pas mélanger les flux. tout ceci fonctionne fort bien, il s'agit de NAT classique (Network Address Translation).

Les problèmes arrivent lorsque vous demandez une connexion vocale / video. Dans ce cas, msn va demander au serveur de choisir un autre port pour faire passer le flux video. Et le problème c'est que ce port est choisi au pif entre le port TCP/9000 et TCP/65535 ! Ensuite, vient le moment de la connexion proprement dite, et c'est la que le firewall perd les pédales, ne sachant plus où router les demandes qui lui arrivent, sur des ports qui sortent de nulle part, etc...

La solution retenue par l'industrie est upnp : c'est l'application elle-même qui demande, dynamiquement, au firewall d'ouvrir le port choisi (au pif je vous le rappele  :Laughing: ), et de renvoyer vers la machine MSN (XP1 dans cet exemple) le flux video / audio. Alors la connexion marche. Hors iptables ne sait pas gérer cela en standard.

Une des solutions que j'ai vu passer sur le net consiste à tout renvoyer directement vers le PC MSN. Dans ce cas, ca marche, pas besoin d'upnp... à condition toutefois que vous n'ayez qu'un seul client MSN derrière ! Sinon le firewall ne saura pas vers lequel renvoyer le flux.

La seule solution "propre" et élégante : installer upnp. Nombreux sont ceux qui considèrent upnp comme une aberration niveau sécurité. Pour ma part je trouve le système plutôt élégant : les demandes d'ouverture de port ne peuvent venir que de l'intérieur du réseau local. Donc ouvrir une brèche pour permettre une attaque demanderait d'avoir un complice en interne, de se mettre d'accord à l'avance sur le port sur lequel on va attaquer, etc  :Arrow:  pour moi, invraisemblable, et le confort apporté par l'utilisation d'upnp dépasse largement ce risque que je considère minime.

Sur ce, voici le guide.

2. Ma config réseau.

Ma Gentoo est sur ma passerelle / firewall. Elle est configurée avec un modem speedtouch usb. Mon IP publique correspond donc à l'interface ppp0. Mon réseau interne, lui, est configuré sur eth0.

Mon PC de test est sous Windows, classiquement.

Question firewall, j'ai peu de choses : j'ai activé le NAT dans le fichier /etc/conf.d/iptables en validant la ligne suivante :

```
ENABLE_FORWARDING_IPv4="yes"
```

Et voici le code de mon firewall, qui ne filtre que netbios en fait :

```
# flush du firewall

iptables -F

iptables -F -t nat

# activation du NAT :

iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0

# DROP des paquets NETBIOS

iptables -A INPUT -i ppp0 -p udp --dport 137:139 -j DROP

iptables -A INPUT -i ppp0 -p tcp --dport 137:139 -j DROP
```

Comme je vous le disais : un filtrage rudimentaire, je veux un minimum d'embûches lorsque je travaille  :Smile:  !.

3. L'installation des outils upnp pour linux.

Le démon upnp pour linux se nomme... upnpd  :Laughing: . Assez controversé, il a néanmoins le mérite d'exister, et je citerais donc ce que les développeurs en disent sur cette page :

 *Les développeurs d'upnpd wrote:*   

> There are many opponents against UPnP. However, we feel that Open Source is all about giving people choices, and letting intelligent people make intelligent decisions about its use. A lot of us really NEED this daemon, and can live with the consequences because we are simply connecting a home network to the internet through one ip, and we would have had the windows machines (or whatever internet device) connected directly in the first place.

 

Sous Gentoo, la version dite "stable" d'upnpd est très ancienne. Nous installerons donc directement la dernière version avec cette commande :

```
ACCEPT_KEYWORDS="~x86" emerge linux-igd
```

NB : adaptez la variable ACCEPT_KEYWORDS à votre architecture bien entendu !

Je n'ai pas utilisé le fichier /etc/portage/packages.keywords car... ça marche pas :'( : je cherche !

Ensuite, n'oubliez pas de configurer vos interfaces dans le fichier /etc/linuxigd/upnpd.conf. Pour ma config, cela donne :

```
# configuration file for upnpd

INTERFACE="eth0"

OUTERFACE="ppp0"
```

Ensuite, il faut savoir que upnpd s'attend à trouver iptables dans /usr/sbin. Hors, sur Gentoo, il est dans /sbin. Donc pour pallier à ce problème : 

```
ln -s /sbin/iptables /usr/sbin/iptables
```

Enfin, avant de lancer le démon, une dernière étape : ajoutez la ligne suivante dans votre fichier /etc/conf.d/local.start, puis lancez-la directement dans la ligne de commande. N'oubliez pas d'adapter à votre config (eth0 n'est pas forcément votre interface interne) !

```
route add -net 239.0.0.0 netmask 255.0.0.0 eth0
```

Voilà, c'est fini : vous pouvez maintenant démarrer le démon :

```
/etc/init.d/upnpd start
```

Voire même le programmer pour chaque démarrage (utile si vous comptez l'utiliser régulièrement, pour ne pas avoir à le lancer à chaque conversation msn  :Laughing: ) :

```
rc-update add upnpd default
```

4. Testez !

Voilà, en principe à ce stade vous pouvez utiliser la fonction webcam, et le transfert de fichiers depuis un poste derrière votre routeur / firewall linux.

N'hésitez pas à demander aide / éclaircissements, tout commentaire est bienvenue, toute correction aussi  :Smile:  !

Amicalement.

Ani.

références :

ce post du forum du site hardware.fr.

le site officiel de linux upnp évidemment  :Wink: 

----------

## scout

Merci beaucoup pour ce nouvel howto, et je teste quand je rentre chez moi !

----------

## Pachacamac

C'est sympa mais je n'ai pas windows pour pouvoir tester.   :Confused: 

En tout cas il est évident que cela servira à plus d'une personne.

Merci pour ce ~howto

----------

## yuk159

Merci Ani, je l'ai rajouté à l'index.

@+

----------

## equi-NoX

excusez moi mais j'ai pas bien compris ce à quoi servait ce HOWTO

... pas dans le sens "C nul, C trop facil"  :Razz: 

mais dans le sens que je n'ai pas compris quel est le problème que ce ~howto permet de résoudre  :Embarassed: 

de ce que j'ai compris soit:

 - il permet à un pc sous windows qui est derrière un pc sous linux qui lui sert d'interface web, d'utiliser les fonctions 'spéciales' de MSN

 - il permet à un pc sous linux d'utiliser ces fonctions spéciales

 :Question: 

----------

## anigel

 *equi-NoX wrote:*   

>  - il permet à un pc sous windows qui est derrière un pc sous linux qui lui sert d'interface web, d'utiliser les fonctions 'spéciales' de MSN

 

C'est exactement ça, à quelques anachronismes près. Lorsqu'on utilise un PC windows derrière une connexion partagée par un PC Linux, les fonctions évoluées de MSN messenger ne fonctionnent pas.

Je ne veux pas entrer dans les détails, mais le problème vient de la gestion de l'Universal Plug & Play sous Linux, inexistante au niveau du noyau. D'où l'apparition d'upnpd, qui pallie à ce manque.

En fait, upnp permet à une application d'ouvrir dynamiquement les ports dont elle a besoin dans un firewall. MSN utilise toujours le port 1863 pour son fonctionnement de base. Jusque-là, pas de souci, puisque tout passe par un serveur central (dont le NAT ne pose aucun souci).

Par contre, pour utiliser l'audio / vidéo / transferts de fichiers, il utilise des ports dynamiques, choisis au pif parmi un peu plus de 50 000... Dur dur d'ouvrir le bon au bon moment ! C'est le rôle d'upnp : msn lui demande d'ouvrir le port dont il a besoin, au moment où il en a besoin, afin que le flux vidéo puisse atteindre votre machine, au lieu de se viander directement sur le firewall, sur un port filtré en temps normal.

L'explication est succinte, mais le problème est complexe à gérer, et je ne maîtrise pas bien le sujet encore, toutes mes excuses si mes propos ne sont pas clairs.

Je renouvelle mon appel : HELP & TESTERS WANTED  :Laughing:  !

----------

## equi-NoX

ok  :Smile: 

étrange que ma soeur ne s'en soit jamais plaint  :Laughing: 

merci pour ce HOWTO en tous cas  :Wink: 

--je testerais peut-être (faut déjà que je trouve quelqu'un avec qui lancer ce genre de truc)

----------

## ttgeub

Je ramene un autre thread oublier d'y a longtemps : ici.

Dans ce thread anigel avait posé la question : est ce que ca marche chez vous msn derriere un NAT ?. Une discussion surprenante s'etait alors engagée puisque de nombreuses personnes disaient que oui et qu'elles n'avaient besoin de rien pour que cela fonctionne. Les accusés  :Very Happy:  sont : sebweb, sebbb et Fraker. Ce dernier donnait meme l'adresse d'un howto tres simple pour le faire fonctionner. (c'est le howto de bases sur le nat)

Deux possibilités  sebweb, sebbb et Fraker sont des menteurs invintérés   :Very Happy:   :Very Happy: , ou alors y a un truc qui est passé à la trappe quelque part ....

----------

## anigel

C'est bien ça que j'essaie de comprendre aussi... le fonctionnement de msn messenger semble avoir changé depuis le test dont tu parles tty (2 versions sont passées dessus, le h323 est passé à la trappe, etc...), c'est pourquoi je n'avais pas mis de référence à ce thread, ne voulant pas embrouiller les choses avec des problèmes qui n'en sont plus.

Une chose est sûre : avec ma config de base (indiquée au point 1) : msn ne veut rien savoir. Avec upnp je m'en sors maintenant.

----------

## Pachacamac

Est ce qu'en utilisant un parefeu, comme ceux de windows, qui filtrent par applications cela fonctionne ?

----------

## fafounet

Il me semble que chez moi, ca marchait avec amsn. J´en suis pas sur et je pourrai que confirmer fin juillet

----------

## Pachacamac

amsn ne gère ni le son, ni la vidéo.

Par contre les fonctions basiques fonctionnent très bien derrière un NAT, je confirme.

----------

## fafounet

Oue enfin je voulais dire le transfert de fichiers. Desole mais deux topics qui parlent de msn en meme temos ca fait beaucoup !!

----------

## Leander256

Je ferai tester ça à ma soeur dans la soirée, je sais qu'elle se sert du service vocal, mais peut-être ne peut-elle pas initier le dialogue, enfin je verrai avec elle ce genre de détails.

----------

## zdra

echo "catégorie/package ~x86" >> /etc/portage/packages.keywords

à la place des acceptkeywords c'est mieux  :Wink: 

Sinon un grd merci, j'avais trouvé comment le faire avec shorewall en ajoutant simplement un ligne dans les fichiers de config. Jle poste ici qd je le retrouve (je le cherche pour moi).

----------

## anigel

Je viens de terminer ce HOWTO dans sa première version "stable". L'audio marche très bien, le testeur en revanche devait être un peu buggé le soir du test  :Laughing:  !

Bons emerge à tous.

----------

## Oupsman

Salut,

j'ai essayé la configuration donnée (enfin je l'avais trouvé tout seul).

Elle a marché correctement tant que je n'avais pas de firewall actif sur mon routeur  :Surprised: )

Maintenant que le firewall est correctement réglé, MSN fonctionne, la vidéo fonctionne, mais l'audio non  :Sad: 

Sur mon firewall, j'ai fermé tous les ports, et ouvert le 22, le 25, le 143, le 80 et le 110.

MSN me dit que les fonctionnalités audio ne sont pas bonnes, ou un truc dans le genre.

J'ai compilé upnpd.

J'active la route.

Je lance upnpd ppp0 eth1.

Et pis rien ...

J'avoue que je craque, parce que là, tout fonctionnait bien jusqu'a un reboot...

Pourtant, j'ai bien la route dans le local.start, et tout de suite après j'ai le upnpd ...

Je craque là ...  :Crying or Very sad: 

----------

## anigel

Peux-tu recopier ici tes règles de firewall stp ?

PS : vite, je pars en vacances sous peu  :Smile:  !

----------

## Oupsman

```

oupsman root # iptables -L

Chain INPUT (policy ACCEPT)

target     prot opt source               destination

firewall   all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination

firewall   all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

firewall   all  --  anywhere             anywhere

Chain firewall (3 references)

target     prot opt source               destination

ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED

ACCEPT     all  --  anywhere             anywhere            state NEW

ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:www

ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:imap2

ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:pop3

ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:smtp

ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh

DROP       all  --  anywhere             anywhere

oupsman root #

```

Voilà les règles de firewall.

----------

## anigel

Tout me parait normal...

Ca me rappele en me relisant, que j'avais eu des soucis lors de mes premiers tests : l'audio avait refusé de fonctionner, alors que tout le reste passait sans soucis...

Puis c'est parti et maintenant plus aucun souci...

Là honnêtement je ne sais trop que te dire. Peut-être de refaire un essai ultérieurement ? Après un restart d'upnpd par exemple ?

----------

## Oupsman

Bon, plutot que de pomper les règles de firewall, je les ai faites moi même (m'as prit du temps mais bon)

toujours est-il que cela fonctionne bien maintenant.

Merci anigel pour le coup de main.

----------

## Salutken

Bien pratique le tutoriel ! Pour moi il y a juste un truc qui va pas... le upnp marche très bien sous azureus mais messenger n'en fait rien. Même dans outils, options puis connexion il le voit toujours comme "non-upnp" !

En fait c'est démineur qu'il est impossible de jouer  :Wink: 

----------

## MagicTom

Merci pour le tuto !

Quelques indications supplémentaires : linux-igd ne fonctionne qu'avec upnp-1.0.4-r1 et pas -1.2.1a, donc dans packages.keywords il ne faut PAS mettre ~x86 pour upnp (il faut juste le mettre pour linux-igd).

De plus, si vous avez un firewall, pensez à débloquer le port TCP 2869 pour que le démon upnpd fonctionne.

Ce sont les 2 étapes qui m'ont été indispensable pour que Messenger fonctionne bien et pour qu'eMule (mod Morph XT) m'affiche enfin un HighID depuis le LAN  :Smile: 

----------

## anigel

Merci pour ces précisions !

Comme tu as dû le voir, ce document commence à dater, et de mon côté j'ai fini par acquérir un routeur DSL (mon ancien modem ne suivait pas la cadence de ma ligne ADSL, un comble ^^), qui intègre ça en standard.

----------

## MagicTom

Pas de problème  :Wink:  Moi je suis en train de configurer un vieux PC comme passerelle, j'ai pas de routeur ADSL, mais j'aimerais bien parce que le modem ECI USB de Wanadoo est tout pourri  :Smile: 

J'ai mis à jour le HOWTO sur fr.gentoo-wiki.org... En espérant que ça aidera quelqu'un  :Wink: 

----------

## anigel

Toute petite mise à jour de ce document, suite à la découverte de cette page, qui lève enfin le voile sur une partie des ports "officiellement" utilisés par MSN pour ses fonctions avancées.

----------

