HOWTO msn messenger derrière un NAT
Un article de Gentoo Linux Wiki.
| Méthodes d'installation • CD Live • Noyau et matériel • Portables et Notebooks • Portage • Système • Réseaux et Services • Serveur X • Logiciels fréquemment utilisés • Autres |
Nombre d'entre nous rencontrent des soucis pour faire fonctionner les fonctions évoluées de msn messenger avec le monde lorsque leur pc est situé derrière leur pare-feu linux.
Après de longues recherches, et nombre d'essais peu fructueux : ça marche enfin !
Sommaire |
[modifier] La théorie : quel est le problème ?
[modifier] Mise en situation
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 appellerons ce PC : XP1.
Un autre PC dans la maison est utilisé de la même manière, sous Windows, et sert occasionnellement à messenger : nous l'appellerons XP2.
Enfin, tout ce beau monde se connecte à Internet via un pare-feu / routeur Linux qui partage sa connexion ADSL : nous l'appellerons Nunux.
[modifier] Cas simple
Lorsque vous chattez sur XP1 (chat msn texte), msn va se connecter sur le port 1863/TCP à un serveur de 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).
[modifier] Problèmes rencontrés
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 hasard entre le port TCP/9000 et TCP/65535 !
Ensuite, vient le moment de la connexion proprement dite, et c'est là 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 ...
[modifier] Présentation de la solution
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 hasard je vous le rappelle), et de renvoyer vers la machine MSN (XP1 dans cet exemple) le flux video / audio. Alors la connexion marche. Or, iptables ne sait pas gérer cela en standard.
Une des solutions 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, ce qui dans mon cas, est invraisemblable, et le confort apporté par l'utilisation d'upnp dépasse largement ce risque que je considère minime.
Sur ce, suivez le guide !
[modifier] Ma configuration réseau
Ma Gentoo est sur ma passerelle / pare-feu. 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 :
| Fichier : /etc/conf.d/iptables |
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.
[modifier] L'installation des outils upnp pour GNU/Linux.
Le démon upnp pour linux se nomme... upnpd. Assez controversé, il a néanmoins le mérite d'exister, et je citerai donc ce que les développeurs en disent sur cette page :
Les développeurs d'upnpd ont écrit :
- 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.
À ce jour (18 juillet 2005), le développement de linux-igd (Internet Gateway Device, le paquet qui contient upnpd) est quasiment arrêté. D'après son auteur, il ne faut de plus pas utiliser la dernière version du paquet upnp (la 1.2.1a) mais une version plus ancienne (la 1.0.4). Il faut donc masquer la nouvelle version (uniquement si vous êtes en ~x86 ; si vous êtes en x86 ce n'est pas la peine car upnp-1.2.1a est marquée unstable).
echo =net-misc/upnp-1.2.1a >> /etc/portage/package.mask
Par contre il vaut mieux utiliser la toute dernière version de linux-igd :
echo net-misc/linux-igd ~x86 >> /etc/portage/package.keywords
Puis lancez l'installation
emerge linux-igd
Ensuite, n'oubliez pas de configurer vos interfaces dans le fichier /etc/linuxigd/upnpd.conf. Pour ma configuration, cela donne :
| Fichier : /etc/linuxigd/upnpd.conf |
# configuration file for upnpd INTERFACE="eth0" OUTERFACE="ppp0" |
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) !
| Fichier : /etc/conf.d/local.start |
route add -net 239.0.0.0 netmask 255.0.0.0 eth0 |
Si vous avez configuré iptables en tant que firewall, il faut activer l'accès au démon upnp, sans quoi il ne servira à rien puisque personne ne pourra rien lui demander :-)
Cet accès se fait par le protocole HTTP sur le port TCP/2869 (affiché dans /etc/linux-igd/gatedesc.xml dans la balise URLBase). Il faut donc ouvrir ce port pour l'accès par l'interface locale (ici eth0) :
iptables -A INPUT -i eth0 -p tcp --dport 2869 -j ACCEPT
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) :
rc-update add upnpd default
[modifier] Testez !
Voilà, en principe à ce stade vous pouvez utiliser la fonction webcam, et le transfert de fichiers depuis un poste derrière votre routeur / pare-feu linux.
Si vous utilisez un logiciel de peer 2 peer compatible UPnP (comme Azureus ou eMule Morph XT), pensez à activer cette fonctionnalité : elle vous rendra beaucoup de service (par exemple pour avoir un HighID avec eMule).
Amicalement.
MAJ : 18/07/2005 Source : http://forums.gentoo.org/viewtopic.php?t=186505 références : http://forum.hardware.fr/hardwarefr/OSAlternatifs/sujet-14206-1.htm http://linux-igd.sourceforge.net/ Auteur : Anigel Mise à jour : MagicTom
