réseau: relier eth1 et eth2

Voici ma config sur le PC hote (debian testing):
eth1 (192.168.0.2, ethernet) relié à un routeur/modem (192.168.0.1)
eth2 (192.168.0.200, usb) relié à mon téléphone sous linux (192.168.0.202)

Lorsque eth2 s’appelait usb0, tout marchait bien, depuis le téléphone j’accédai au net. Suite à un changement coté téléphone (adresse MAC), l’interface s’appelle maintenant eth2, j’ai fait les changement dans la config du PC hote
Dans le fichier interfaces

# freerunner allow-hotplug eth2 auto eth2 iface eth2 inet static address 192.168.0.200 netmask 255.255.255.192 post-up /etc/network/freerunner start pre-down /etc/network/freerunner stop

Le fichier freerunner est issu de http://wiki.openmoko.org/wiki/USB_Networking#Debian.2C_Ubuntu_and_others
avec évidement remplacement de usb0 par eth2.

Je peux me connecter via ssh au téléphone, mais impossible faire un pont vers eth1 pour avoir le net.

Si j’essaie un iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 sysctl -w net.ipv4.ip_forward=1 ip addr add 192.168.0.200/28 dev eth2
ça marche pas mieux, et je perds le réseau coté eth1 (plus de nameserver, et parfois plus de route)

si quelqu’un a une idée …

Il semblerait que le problème vienne que les 2 sous réseaux ont la même plage d’adresse. C’est curieux car cela fonctionnait lorsque l’interface s’appelait usb0.
Mais je ne vois pas de solution simple sans changer la plage d’adresse d’un des sous réseau, ce qui est trés lourd.
Pas d’idée ?

Je continu à me répondre tout seul.
L’interface eth2 n’a pas de route par défaut, et je n’arrive pas à lui en affecter une.

route add default gw 192.168.0.1 If eth2 ne fonctionne pas

Tu as essayé echo '1' > /proc/sys/net/ipv4/ip_forward ?

  1. C’est peut-être udev qui a renommé l’interface usb0 en eth2 suite au changement d’adresse MAC. Voir les règles de nommage réseau persistant d’udev. De toute façon ça ne devrait pas avoir d’influence sur le routage. Certains programmes (comme d’anciennes versions de pppoe il me semble) attendent à tort un nom d’interface ethernet qui commence par “eth”, mais c’est sans objet dans ton cas.

  2. Deux interfaces ne doivent pas partager le même sous-réseau. Mais est-ce le cas ? D’après ton fichier interfaces, eth2 est dans le sous-réseau 192.168.0.192/26 (192.168.0.192-192.168.0.255. Mais tu n’indiques pas la taille du masque du sous-réseau d’eth1. Si c’est /23 (255.255.255.128) ou plus, alors il n’y a pas de problème de recouvrement. Rappel : le masque doit être le même sur toutes les interfaces d’un sous-réseau, donc le modem-routeur doit avoir le même masque qu’eth1 et le téléphone doit avoir le même masque qu’eth2.

  3. Tu parles d’un pont (bridge) mais je n’en vois pas trace dans ta configuration, je ne vois en fais que du routage+NAT.

  4. Le masque /28 de ta commande “ip addr” ne correspond pas avec le masque 255.255.255.192 défini dans le fichier interfaces. De toute façon les deux font double emploi.

  5. Concernant ta commande “route add”, une route par défaut sur eth2 n’a de sens que si le téléphone sert de passerelle par défaut. Il me semble que c’est plutôt le contraire que tu veux faire : accéder à internet depuis le téléphone via le modem-routeur. D’autre part tu indiques l’adresse du modem-routeur qui n’est pas dans le sous-réseau d’eth2 mais dans celui d’eth1. Ça ne peut pas marcher.

Envoie le contenu complet du fichier interfaces, le résultat des commandes “ip addr” et “ip route”, et la configuration IP du modem-routeur et du téléphone, on y verra plus clair.

A Guizmo.7 : oui, ça équivaut à sa commande sysctl.

Merci pour votre réponse. Le forward est bien activé.
Je me mélange un peu dans les termes, merci Pascal de me reprendre!
Je veux effectivement faire du NAT. Je n’ai pas connecté mon tel depuis longtemps sur le host, et celui ci à subit des mises à jour (debian testing). Je ne sais donc pas quelle est la cause. Comme vous avez pu le constaté, je ne suis pas un expert réseau, et je ne maitrise pas toutes les commandes que j’ai tapé (bien que j’en comprenne en gros la fonction)

  1. Oui, l’adresse MAC a changé car j’ai installé un nouveau soft sur le téléphone (mise à jour). Ce problème est connu et identifié (passage de usb0 à ethx).

  2. grâce à tes explications, j’y vois plus clair dans mes sous réseaux. Coté interfaces du host:

[code]allow-hotplug eth1
#iface eth1 inet dhcp
iface eth1 inet static
address 192.168.0.2
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1

freerunner

allow-hotplug eth2
auto eth2
iface eth2 inet static
address 192.168.0.200
netmask 255.255.255.192
post-up /etc/network/freerunner start
pre-down /etc/network/freerunner stop[/code]

coté téléphone

iface usb0 inet static address 192.168.0.202 netmask 255.255.255.0 network 192.168.0.0 up route add default gw 192.168.0.200 metric 8 up echo nameserver 208.67.222.222 > /etc/resolv.conf up echo nameserver 208.67.220.220 >> /etc/resolv.conf down route del default gw 192.168.0.200 metric 8
Pour le modem, je regarderai. J’ai du mal a assimiler le / dans les sous réseau, il faut que je me remette à niveau.

  1. Je veux effectivement faire du NAT

  2. Ok c’est compris, je vais modifier ça

  3. OK, j’ai compris. Je garde ça pour plus tard lorsque je voudrais me servir du téléphone comme modem GPRS :slightly_smiling:

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0e:a6:45:f2:94 brd ff:ff:ff:ff:ff:ff inet 192.168.0.2/24 brd 192.168.0.255 scope global eth1 inet6 fe80::20e:a6ff:fe45:f294/64 scope link valid_lft forever preferred_lft forever 5: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 00:1f:11:01:51:ad brd ff:ff:ff:ff:ff:ff inet 192.168.0.200/26 brd 192.168.0.255 scope global eth2 inet 192.168.0.200/28 scope global eth2 inet 192.168.0.200/24 scope global eth2 inet6 fe80::21f:11ff:fe01:51ad/64 scope link valid_lft forever preferred_lft forever
ip route

192.168.0.202 dev eth2 scope link 192.168.0.200 via 192.168.0.1 dev eth1 192.168.0.192 via 192.168.0.1 dev eth1 192.168.0.192/28 dev eth2 proto kernel scope link src 192.168.0.200 192.168.0.192/26 dev eth2 proto kernel scope link src 192.168.0.200 192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.2 192.168.0.0/24 dev eth2 proto kernel scope link src 192.168.0.200 192.168.10.0/24 via 192.168.0.1 dev eth2 default via 192.168.0.1 dev eth1

J’ai pas mal bricolé ma config depuis 2 jours, ce n’est peux étre pas très propre!

Effectivement c’est un sacré bazar ! Pas étonnant qu’il y ait des choses qui ne marchent pas. En fait, avec toutes ces adresses et routes en trop, je suis presque étonné que quelque chose marche encore…

  1. Mauvaise nouvelle, les sous-réseaux d’eth1 et eth2 se recouvrent.
  • eth1 : 192.168.0.2/24 (masque 255.255.255.0) = plage 192.168.0.0-255
  • eth2 : 192.168.0.200/26 (masque 255.255.255.192) = plage 192.168.0.192-255
    D’autre part, le masque du téléphone 255.255.255.0 ne correspond pas à celui d’eth2.

Mais en faisant attention, ça peut marcher à peu près même si ça reste bancal. L’idéal serait bien sûr deux sous-réseaux sans intersection, ce que je recommande chaudement (ipcalc est ton ami).

Notes sur les options up et down dans la configuration du téléphone :

  • si resolvconf est disponible, il est plus simple d’utiliser l’option dns-nameservers pour mettre les adresses de DNS dans resolv.conf
  • pourquoi crée une route par défaut avec une métrique 8 ? Il est prévu une route par défatu de plus forte priorité ?
  • la commande pour supprimer la route est superflue car toutes les routes attachées à une interface sont automatiquement supprimées quand cette dernière est désactivée.

Les adresses suivantes sont en trop sur eth2 et doivent être supprimées (ip addr del) :

192.168.0.200/28 scope global eth2 192.168.0.200/24 scope global eth2
Les routes suivantes sont en trop et doivent être supprimées (ip route del) :

192.168.0.202 dev eth2 scope link 192.168.0.200 via 192.168.0.1 dev eth1 192.168.0.192 via 192.168.0.1 dev eth1 192.168.0.192/28 dev eth2 proto kernel scope link src 192.168.0.200 192.168.0.0/24 dev eth2 proto kernel scope link src 192.168.0.200 192.168.10.0/24 via 192.168.0.1 dev eth2
Au final il ne doit rester que ce qui est défini par le fichier interfaces.
Et si tu as autant bricolé sur le téléphone, donne aussi les sorties d’ip addr et ip route.

J’ai fait un reboot, avec un fichier interfaces nettoyé:
ip route

192.168.0.192/26 dev eth2 proto kernel scope link src 192.168.0.200 192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.2 default via 192.168.0.1 dev eth1

ip addr

2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0e:a6:45:f2:94 brd ff:ff:ff:ff:ff:ff inet 192.168.0.2/24 brd 192.168.0.255 scope global eth1 inet6 fe80::20e:a6ff:fe45:f294/64 scope link valid_lft forever preferred_lft forever 3: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 link/ether 00:1f:11:01:51:ad brd ff:ff:ff:ff:ff:ff inet 192.168.0.200/26 brd 192.168.0.255 scope global eth2 inet6 fe80::21f:11ff:fe01:51ad/64 scope link valid_lft forever preferred_lft forever
Coté téléphone, c’est sa config standard.

Je regarde en détail ce que tu as posté et je te tiens au courant.

Il y a du mieux. Je peux pinguer internet via le teléphone avec cette config. Mais je ne peux pas pinguer le routeur 192.168.0.1!

Et comme je l’avais mis comme DNS pour le téléphone, ça ne marchait pas! J’ai ajouté un DNS public dans le resolv.conf du tel, et àa marche.
Mais j’aimerai bien comprendre pourquoi je n’arrive pas à pinguer la passerelle depuis le tel.

C’est à cause du recouvrement des sous-réseaux et du mauvais masque dans la configuration du téléphone. J’avais prévenu que c’était bancal.

J’explique. Avec les sous-réseaux que tu as définis,
La machine Debian pense :

  • 192.168.0.192-255 est joignable directement sur eth2. L’adresse du téléphone 192.168.0.202 est dans cette plage donc c’est bon ;
  • 192.168.0.0-255 sauf la plage précédente, donc au final 192.168.0.0-191 est joignable directement sur eth1. L’adresse du routeur 192.168.0.1 est dans cette plage donc c’est bon ;
  • le reste du monde est joignable via la passerelle 192.168.0.1 sur eth1.

Le téléphone pense :

  • 192.168.0.0-255 est joignable directement sur usb0. L’adresse de l’interface eth2 de la machine Debian 192.168.0.200 est dans cette plage, donc c’est bon. En revanche l’adresse du routeur 192.168.0.1 est aussi dans cette plage, or le routeur n’est pas attaché directement à usb0 ;
  • le reste du monde est joignable via la passerelle 192.168.0.200 sur usb0.

Ainsi le téléphone cherche à atteindre l’adresse du routeur directement et non à travers la passerelle 192.168.0.200 comme ce serait le cas si tout était bien configuré. Un contournement pour le DNS consiste à déclarer comme DNS 192.168.0.200 au lieu de 192.168.0.1 et créer sur la machine Debian des règles iptables DNAT qui redirigent le port 53 en TCP et UDP vers 192.168.0.1, o bien installer un proxy/relais/cache DNS comme dnsmasq ou BIND sur la machine. Une autre possibilité à vérifier consiste à activer le proxy ARP sur eth2 (net.ipv4.conf.eth2.proxy_arp=1) mais c’est sale.

Je vois que tu as défini les adresses de DNS d’OpenDNS. Comme à chaque fois je mets en garde les étourdis qui n’auraient pas lu attentivement le site d’OpenDNS sur le fait que ces serveurs ne sont pas techniquement neutres et trafiquent les réponses qu’ils transmettent.

Merci pour ces explications, c’est bien plus clair.
Je vais travailler coté téléphone. C’est dans le fichier interface qu’il faut que je travaille, lors de la déclaration de usb0 ? Je dois lui dire que seule la zone 192.168.0.192-255 est joignable sur ce sous réseau.
Je vais chercher un peu, c’est comme ça qu’on apprend.
Je ne me sers de cette liaison que pour faire les mises à jour. Donc ce n’est pas gave si openDNS fait des choses douteuses (bien que les paquets ne soient pas encore signés).

Il suffit de donner à usb0 le même masque qu’eth2, 255.255.255.192.
Mais ce serait si lourd de modifier l’adresse de sous-réseau d’eth2 et usb0 pour éviter le recouvrement avec le sous-réseau d’eth1 et du routeur ?

édit:
J’ai essayé ça, et 192.168.0.1 pingue!

iface usb0 inet static address 192.168.0.202 netmask 255.255.255.192 network 192.168.0.0 up route add default gw 192.168.0.200 metric 8 up echo nameserver 208.67.222.222 > /etc/resolv.conf up echo nameserver 208.67.220.220 >> /etc/resolv.conf down route del default gw 192.168.0.200 metric 8

Modifier trop profondément la config de usb0 obligerait à reprendre beaucoup de docs sur le net, et casserai la compatibilité avec d’autres distributions.
Je vais proposer cette modif aux devs.
Merci pour tes conseils toujours très formateurs!

Attention, la valeur de l’option network n’est plus cohérente avec le nouveau masque (ipcalc est ton ami (bis)). De toute façon tu peux la supprimer, elle ne sert à rien. Idem pour l’option down, je répète.

oui, j’ai compris comment ça marchait maintenant. J’ai fait un rapport de bugs, je laisse les devs modifier la config standard, de mon coté je simplifie la mienne.
Pour ipcalc, je suis en train de regarder. J’ai trouvé une version en perl et une en C.
Dans les dépots debian, il y a un ipcalc et un sipcalc. Lequel conseilles tu ?

Je ne connaissais pas sipcalc, n’ayant utilisé qu’ipcalc pour IPv4 et ipv6calc pour IPv6.