La connexion à l'IP 0.0.0.0 réussit. Comment? Pourquoi?

41

Nous desservons un port sur localhost et souhaitons enregistrer un autre processus si le port est disponible. En raison d'un bogue dans notre code, il essaie en réalité de se connecter à l'IP 0.0.0.0:<port>, et pour une raison quelconque, il réussit - comme le prouve strace:

[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]

Qu'est-ce que ça veut dire? Pourquoi ça marche?

erikbwork
la source

Réponses:

68

0.0.0.0 en tant qu'adresse cible fait référence à un hôte non routable ou à «cet hôte» . En pratique, se connecter à 0.0.0.0 équivaut à se connecter à localhost. (À proprement parler, cette adresse n'est pas valide en tant qu'adresse de destination, mais uniquement en tant qu'adresse source, mais la pratique ne correspond pas à la théorie.)

Lors de la liaison, «cet hôte» se développe en «toute adresse sur cet hôte» - les applications acceptent donc généralement les connexions en se liant à 0.0.0.0, ce qui signifie qu'elles recevront des paquets adressés à n'importe quelle adresse IPv4 du système.

Stephen Kitt
la source
7
Pour prolonger un peu cette réponse, cela signifie "toute adresse IP sur ce système, y compris les adresses IP qui ont été ajoutées après le début du processus d'écoute"
Criggie
5
localhost est une adresse unique, principalement 127.0.0.1, tandis que 0.0.0.0 désigne toutes les adresses de cet hôte.
rexkogitans
@rexkogitans localhost est pas une adresse unique, mais une adresse dans la gamme 127.0.0.0/8 - à savoir une adresse de 127.0.0.0 à 127.255.255.255
Dezza
6
@Dezza Non, l'hôte local est 127.0.0.1. 127.0.0.0/8 (comme vous le dites, à savoir 127.0.0.0 à 127.255.255.255) est un bouclage avec la plupart des équipements, par exemple documenté par RFC 5735 page 4 . (Il est intéressant de noter que certains équipements Cisco peuvent attribuer un bouclage à n’importe quelle adresse, mais ne prennent pas par défaut en charge le bouclage. Cela n’affectera probablement pas les autres équipements du réseau.) Cependant, localhost est un nom, désignant généralement un seul adresse qui est 127.0.0.1, et généralement implémenté en utilisant un fichier "hôtes". Je ne suis donc pas d'accord avec votre tentative de correction.
TOOGAM
Pourriez-vous préciser ce que vous entendez par "ce n'est pas valide en tant qu'adresse de destination, mais en tant qu'adresse source"? Lorsque mysql server écoute à 0.0.0.0, la destination ou la source de l'adresse est-elle? N'est-ce pas la destination d'une demande envoyée par un client mysql?
Tim