Aller au contenu

Linux Attitude

Le libre est un état d'esprit

Archive

Catégorie : Réseau

Niveau : Star Star Star Star Empty
Résumé : slirp

Si vous n'êtes pas admin de la machine sur laquelle vous êtes (université ?), mais que vous voudriez partager votre connexion, par exemple pour une machine virtuelle ou pour des amis qui voudraient emprunter votre IP ... Il vous faut du NAT (a moins que vous vous contentiez d'un simple tunnel).

Problème : vous ne pouvez pas le mettre en place puisque vous n'êtes pas admin sur la machine qui partage la connexion.
Solution : slirp.

Hé oui c'est tout simple, slirp décapsule du PPP pour l'injecter dans de une socket normale et donc fait l'équivalent du NAT. Mais avec quelques limitations, on ne peut pas faire passer n'importe quel paquet (genre ping) depuis l'espace utilisateur, malgré tout c'est largement suffisant.

Le serveur de NAT (enfin le routeur quoi)

Bon c'est pas si simple mais presque.

Slirp est une commande qui utilise le l'entrée et sortie standard pour communiquer ce qui fait que si on veut l'utiliser à distance il faut le connecter à un "listener", ici nous allons utiliser socat, mais si vous voulez un tunnel chiffré, utilisez stunnel.

Donc vous avez besoin de socat et slirp sur la machine où vous êtes simple utilisateur. Si vous ne les avez pas recompilez les vous avez le droit. Si vous n'avez pas de compilateur copiez-lez depuis une autre machine, si cela ne fonctionne pas, recompilez les chez-vous en statique ... enfin vous êtes grands que diable, ne me posez pas cette question !

Il vous faut un fichier de configuration minimaliste pour slirp (à mettre dans ~/.sliprc) :

ppp
asyncmap 0

Puis lancez le service genre sur le port 2000 (fullbolt = pas de limitation de vitesse) :

$ socat -s tcp4-listen:2000,fork system:/usr/bin/slirp-fullbolt



... continuer la lecture ...

Niveau : Star Star Empty Empty Empty
Résumé : TCP + RTT + window size = debit

Si je me connecte au réseau local gigabit, que je fais un transfert de fichier ... je n'arrive pas à dépasser 200Mb/s ! Vous rendez-vous compte que c'est normal ?

Vous allez me dire que je ne suis pas doué, mais ce n'est pas moi, ce sont les lois de la physique.

Bon puisque nous somme dans un cas particulier je m'explique.

Temps de réponse

Le débit a beau toujours augmenter, il y a quelque chose qui s'améliore beaucoup moins vite : le temps de réponse. Pour une bonne raison, l'information a une vitesse limite, celle de la lumière. La limite est un peu inférieure sur une fibre optique et encore inférieure sur un câble cuivre.

De plus il faut une certaine électronique pour traiter tous ces paquets et ce débit. Du coup la traversée de switchs et de firewall en fout un coup à la latence. Et pourtant le débit ne change quasiment pas.

Tout ceci se voit avec la commande ping. Si vous lancez un ping sur la machine d'à coté, vous constatez un temps de réponse de l'ordre de la milliseconde.

Par exemple :

PING mamachine (10.0.0.0.1) 56(84) bytes of data.
64 bytes from mamachine (10.0.0.0.1): icmp_seq=1 ttl=61 time=1.16 ms

C'est le temps qu'il a fallu pour créer le paquet ping, l'envoyer à travers le switch, le réceptionner, répondre, repasser dans le switch, lire la réponse. Donc il faut la diviser par deux pour avoir un ordre de grandeur du temps de transfert du paquet.

Pour une machine sur un autre réseau c'est plus dans les 20ms voire 100ms.

Dans cette histoire les plus gros temps de latence dépendent de votre infrastructure, si vous êtes sur une fibre de 100km c'est elle qui contribuera à la latence, si vous êtes sur un réseau local c'est plus le temps de traitement par la carte réseau et le noyau, et s'il y a plusieurs switchs ou un routeurs c'est l'électronique des ces appareils.


... continuer la lecture ...

Niveau : Star Star Star Empty Empty
Résumé : ferm

Ferm

Vous battez-vous toujours avec vos scripts shell pour configurer les firewall de vos serveurs ? Ne ramez plus, j'ai la solution : Ferm.

Pourquoi ferm ? Ben pourquoi pas ?

Je l'ai choisi car il ne fait qu'une chose (et le fait bien), il remplace vos scripts shell de lancement de firewall. Et c'est tout ! Pas d'interface graphique, pas d'assistance à création de règle, pas de gestion de votre serveur DHCP ...

Donc si votre machine de bureau sert de passerelle vers internet, ou si vous ne connaissez pas bien iptables, ce n'est probablement pas le meilleur outil. Par contre si vous avez l'habitude d'écrire des scripts shell pour gérer votre firewall, ferm est là pour vous simplifier la vie.

Configuration

Ferm génère des règles iptables à partir de son fichier de configuration. Il n'invente rien, il ne fait qu'écrire sous forme hiérarchique les règles iptables et vous permet d'utiliser des variable et des listes. Il faut donc les connaître un peu.

Petit exemple pour vous montrer comment gagner du temps (il se comprend tout seul) :


... continuer la lecture ...

Niveau : Star Star Empty Empty Empty
Résumé : Internet

Maintenant qu'on connaît Internet, faisons le voyage du petit paquet.

Prélude

Un paquet n'apparait pas subitement du néant, il vient d'une information. Prenons par exemple un concert de Johnny transmis en streaming. L'information est le son, lui-même codé sous une certaine forme, nous avons par exemple le PCM, le MP3 etc. Pour ceux que ca intéresse, vous pouvez étudier les codecs ou déjà les transformées de Fourier. Jusque là ce que sont que des maths et de la physique.

Une fois ces données devenues des nombres, on les code comme des suites d'octets (8 bits, mais c'est historique, pourquoi pas 12 bits ou 18 bits ou même 7 ? mystère), on en fait des groupes de disons 1460 (totalement au hasard) qu'on met dans un paquet.

Ensuite le système ajoute des informations à ce paquet, par exemple un numéro d'ordre, la taille, l'adresse de l'émetteur, ou même des trucs qui ne servent à rien. L'information la plus importante est l'adresse de destination, en IPv4 elle est de la forme 1.2.3.4

Le premier problème est qu'il faut deviner cette adresse, le deuxième problème est que les barbus qui ont inventé ce protocole n'ont pas pensé qu'un jour les gens pourraient ne pas connaître l'adresse IP de la machine avec qui elles communiquent (qui ne connaît pas le numéro de téléphone des ses amis ?).

C'est pourquoi on a dû inventer un autre système qui permet d'obtenir cette information. Il tourne par dessus IP (ouf). Il s'agit du DNS, un annuaire qui permet non seulement de retrouver les adresses des machines depuis un nom lisible, mais aussi qui permet de déménager sans avoir à avertir tout son carnet d'adresse.

Il est bien dommage que ce système n'ait pas été intégré au protocole internet, ça nous aurait évité bien des soucis, mais bon il faut faire avec.

Ça y est, nous avons un paquet, il est rempli avec nos données et toutes les informations nécessaires, comme une enveloppe remplie et timbrée.


... continuer la lecture ...

Niveau : Star Empty Empty Empty Empty
Résumé : Internet

Qu'est-ce qu'Internet ? Cette question, dont la réponse parait évidente à beaucoup n'est pas facile à expliquer.

Internet expliqué à ma mère

Et plutôt que d'expliquer ce qu'est Internet, je vais plutôt expliquer comment marche Internet, car c'est son fonctionnement qui le définit.

Internet est un ensemble de réseaux (net) interconnectés (inter) grâce au protocole IP (internet protocol) aussi appelé IPv4. Ce protocole ne fait qu'une seule chose (et le fait bien :-), transférer des informations (mail, télévision ...) sous forme de petits paquet d'un appareil à un autre.

Internet est caractérisé par le fait que tout internet est accessible par tout internet. Si mon téléphone est connecté à internet alors internet est connecté à mon téléphone. S'il peut envoyer un paquet sur internet (par exemple 1s de musique), on peut aussi lui envoyer un paquet depuis internet.

Donc pour que mon appareil soit sur internet il lui faut seulement 2 choses :

  • parler le protocole IP
  • être connecté à internet

Internet ce n'est que ça. Mais il y a beaucoup d'autres choses à dire sur internet.

Internet expliqué à mon père

Sur internet on trouve énormément de choses. Malheureusement la plupart des gens n'en connaissent qu'une, le web, j'y reviendrai.

Sur internet il on trouve :

  • les emails : un email est découpé en petits paquets qui sont envoyés par IP à une autre machine qui va les stocker dans un coin en attendant que l'utilisateur vienne les chercher
  • le téléphone : les applications comme skype ou ekiga découpent votre voix en petits paquets et les envoient à un autre appareil sur internet
  • le peer to peer : ce sont les applications qui profitent le plus du concept d'internet, tout ce qu'on y trouve y est découpé en petits paquets qui sont transférés à de multiples personnes, ces personnes peuvent alors enregistrer ces paquets et les retransmettre à d'autres personnes, le nombre de personnes connectées en permanence fait que la plupart de ces paquets sont toujours disponibles
  • la messagerie instantanée : chaque message est mis dans un paquet et envoyé au destinataire

... continuer la lecture ...

^--- billet invité

Niveau : Star Star Star Empty Empty
Résumé : proxy ndp

Aujourd'hui nous allons parler d'IPv6. Pas du troll sur son arrivée imminente (ou pas), mais de situations qui nécessitent l'utilisation d'une fonctionnalité du noyau linux appelée proxy NDP.

Rappels sur IPv6 et NDP (les habitués d'IPv6 peuvent passer)

En IPv4, on dispose du protocole ARP pour trouver, à partir de l'adresse IP, l'adresse MAC à laquelle envoyer le paquet Ethernet sur le même réseau. Si c'est sur un autre réseau, il suffit d'avoir une table de routage et de connaître le routeur (la passerelle) pour cette destination, à qui on envoie le paquet.

En IPv6, on fait fi d'ARP pour utiliser ICMPv6. Vous me direz, on ne fait que reporter le problème, on n'a toujours pas l'adresse MAC : c'est là qu'intervient la notion de lien local. En effet vous avez déjà du remarquer qu'à peine votre interface réseau montée, vous disposez d'une adresse de lien local (obtenue à partir de votre adresse MAC).

# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:19:66:8c:b0:d9
          inet6 addr: fe80::219:66ff:fe8c:b0d9/64 Scope:Link
[...]

De la même manière, vos voisins sur le même lien Ethernet ont leur adresse de lien local, et c'est en utilisant celle-ci combinée au protocole ICMPv6 qu'on voit passer les requêtes NDP (Neighbor Discovery Protocol) de découverte de voisinage. On y retrouve exactement le principe de l'ARP d'IPv4 (who has/target is at), avec un nouveau vocabulaire (neighbor solicitation/neighbor advertisement).

# tcpdump -ni eth0 ip6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

16:06:29.756895 IP6 2a01:e35:3e93:68c0:4d0a:f82b:3678:aaac > ff02::1:ff8c:b0d9: ICMP6, neighbor solicitation, who has 2a01:e35:3e93:68c0:219:66ff:fe8c:b0d9, length 32

16:06:29.757294 IP6 2a01:e35:3e93:68c0:219:66ff:fe8c:b0d9 > 2a01:e35:3e93:68c0:4d0a:f82b:3678:aaac: ICMP6, neighbor advertisement, tgt is 2a01:e35:3e93:68c0:219:66ff:fe8c:b0d9, length 32

... continuer la lecture ...

Niveau : Star Star Empty Empty Empty
Résumé :lo ; 127.0.0.1

L'interface de loopback se retrouve sur toutes les machines ou presque. pensez à l'activer si ce n'est pas fait par défaut car un certain nombre d'applications en dépendent et son absence peut parfois mener à des bugs inexplicables (à ce propos évitez de mettre un firewall bloquant 127.0.0.1 ...). Mais comment fonctionne-t-elle ?

Localhost

Tout d'abord l'adresse de loopback (127.0.0.1) permet par convention de contacter la machine locale sans passer par une interface qui serait accessible de l'extérieur. Cette fonctionnalité est en soit disponible sur n'importe quelle interface réseau. Il faut juste ajouter une entrée de firewall pour éviter l'accès depuis l'extérieur. Exemple pour prouver que c'est une ip comme une autre :

# on enlève le range d'ip de l'interface lo
$ ip addr del 127.0.0.1/8 dev lo
# on l'ajoute à une interface physique
$ ip addr add 127.0.0.1/8 dev eth0
# on teste
$ ping 127.0.0.1

En pratique, rien n'empêche cette ip d'être accessible publiquement si ce n'est que ce n'est pas recommandé et que linux ne répondra pas (je n'ai pas vraiment cherché à savoir pourquoi).

Device lo

Lo est l'interface de loopback. Celle sur laquelle on met habituellement l'adresse de localhost. Mais cela n'empêche de mettre d'autres ip sur cette interface. Dans un contexte de routeur c'est même très fréquent. Le routeur dispose d'un ip publique qui n'est sur aucune de ses interfaces.

Exemple :

$ ip addr add 172.16.20.1 dev lo
$ ping 172.16.20.1

Le but n'est pas de contacter localhost, mais de contacter le routeur depuis n'importe où, à travers n'importe quelle interface, cette ip est indépendante de l'état des différentes cartes réseaux.

Exemple dans lequel m1 serait un routeur ayant une interface 10.0.0.1 connectée à m2 directement sur le même réseau :

# Première machine
m1$ ip addr add 172.16.20.1 dev lo
m1$ echo 1 > /proc/sys/net/ipv4/ip_forward

# Deuxième machine, on contacte le loopback de m1
m2$ ip route add 172.16.20.1 via 10.0.0.1
m2$ ping 172.16.20.1

L'interface de m1 agit comme un routeur pour son ip de loopback.

Un autre usage particulier de cette adresse est d'autoriser plusieurs machines à disposer de la même ip, sans les annoncer sur le réseau (puisqu'elles ne sont sur aucune interface publique). On peut ainsi éviter les conflits (arp ...). C'est par exemple la solution retenue pour faire de la répartition de charge avec keepalived entre plusieurs serveurs ayant la même ip publique.