Network is unreachable
Ce matin, je tente de me connecter à mon serveur MySQL à partir d'une application Java via Netbeans.
Jusque là rien de bien particulier, on fait ça tous les jours ;-) Le soucis, c'est que ce qui fonctionnait hier ne fonctionne plus aujourd'hui. Damned ! Quel est le problème ?
Je ne donne pas tout de suite la solution, je raconte d'abord la petite histoire ... de manière à ce que l'on sache comment on peut perdre quelques heures ... pour (presque) rien.
First at all comme je suis en train de coder un exercice en java, je pense que l'erreur provient de mon code ... que je relis. J'obtiens une erreur
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not receive any packets from the server.
J'essaie alors de me connecter sans succès via l'onglet Services histoire de constater que ce n'est pas mon code qui est la cause du problème mais ... heu ... peut-être bien le driver MySQL. J'essaie mysql-connector-java-5.1.12-bin.jar
en lieu et place de mysql-connector-java-5.1.6-bin.jar
mais rien ni fait, j'obtiens toujours la même erreur; à savoir un Network unreachable.
Bizarre car je travaille en local. Le problème se pose que je sois connecté ou pas. Mon serveur MySQL est lançé et je parviens à m'y connecter. De plus, un telnet localhost 3306
fonctionne très bien .... Je reste perplexe.
Tant pis, je travaillerai avec JavaDB ... et le problème est le même ! Toujours ce Network unreachable
Après avoir compulsé et cherché sur le net, j'obtiens la solution;
echo 0 > /proc/sys/net/ipv6/bindv6only
Il faut savoir que cette solution est temporaire (jusqu'au prochain reboot). Pour la rendre permanente, éditez le fichier /etc/sysctl.d/bindv6only.conf
cat /etc/sysctl.d/bindv6only.conf # (...) comments net.ipv6.bindv6only=0
Une petite explication
(La suite doit être confirmée, ce n'est pour l'instant que suppositions)
Ceci se base sur la cohabitation entre IPv4 et IPv6 [1]. Par défaut le système fait une sorte de mapping entre IPv6 et IPv4.
La mise à jour du noyau que je viens de faire (Debian/Squeeze avr 2010) à changé les paramètres par défaut pour les applications clients/serveurs.
Si j'ai bien compris Java décide de donner l'adresse IPv6 suivie de l'adresse IPv4 lorsque l'on veut faire une connexion client/serveur ... ce qui n'est pas le comportement par défaut du noyau (du moins pour une Debian Squeeze).
Je dois donc dire que mon noyau doit continuer à gérer ses socket en IPv6/IPv' ...
à confirmer/compulser/infirmer/développer/...
Notes
[1] Il faut vraiment que je commence à m'informer sur IPv6