2 votes

Pourquoi puis-je ouvrir une connexion sur le port 80 pour 0.0.0.0 mais pas pour les autres formulaires ?

D'après ce que je comprends des permissions de port de Linux/MacOS (je pense que ce sont les mêmes à cet égard), les ports 1 à 1024 ne sont disponibles que pour Root, mais au-delà, ils sont disponibles pour tout le monde.

Cependant, j'ai rencontré un comportement inattendu lors de l'ouverture de ports sous MacOS 10.14.2. J'utilise php -S (version 7.3.0) pour expérimenter.

Lorsque je lance la commande avec les cas suivants :

127.0.0.1:80
[::1]:80
mylocalipv4:80
mylocalipv6:80

il retourne Failed to listen on ::1:80 (reason: Permission denied) comme prévu (où l'IP/port donné est indiqué).

Cependant, si je l'exécute avec 0.0.0.0:80 il commence à écouter avec succès, mais je ne peux pas m'y connecter avec curl, que ce soit en utilisant 127.0.0.1 ou l'IP réelle de ma machine.

Si je lance le serveur PHP avec [::0]:80 il commence à écouter avec succès, et je peux le boucler avec curl [::1] et avec mon adresse ipv6 locale.

Je me serais attendu à ce que les deux derniers cas d'échec commencent par une permission refusée. Pourquoi ne le font-ils pas ?

4voto

Jose Chavez Points 645

En testant, je peux voir qu'il est possible pour un utilisateur de MacOS de bureau de lier() des numéros de port TCP inférieurs à 1024 (les ports dits bien connus). Cela fonctionne à la fois sur IPv4 et IPv6, et sur les adresses localhost/non spécifiées.

Le code source du noyau Darwin est librement disponible - à partir de là, je peux voir qu'il a la fonctionnalité intégrée pour vérifier les processus essayant de se lier/écouter sur les ports <1024 et de les refuser. Ceci est similaire à la façon dont Linux fonctionne. Cependant, il est possible de désactiver cette vérification lors de la compilation du noyau en définissant "IPNOPRIVPORTS". Je suppose que c'est ce qui a été fait avec le noyau fourni par Mojave.

Sous Linux, il était autrefois impossible pour les utilisateurs non-Root de se lier à des ports à faible numérotation, mais aujourd'hui vous disposez de plusieurs options pour permettre aux utilisateurs non-Root de se lier à des ports à faible numérotation. Comme par exemple l'utilisation de la capacité NET_BIND_SERVICE.

Sous MacOS, vous disposez également de plusieurs options pour restreindre la liaison des ports à faible numérotation. Par exemple par le biais de kexts qui fait du filtrage de socket, ou par d'autres moyens. Il se peut que vous ayez installé un logiciel, comme par exemple Little Snitch, qui vous a refusé la permission lors de vos tests.

Veuillez noter que les différentes adresses IP que vous avez essayées ont des significations totalement différentes :

 127.0.0.1 = IPv4 address that means the "localhost" (i.e. your own computer basically) - it is not available on the network
 [::1]     = the IPv6 equivalent of 127.0.0.1

 0.0.0.0   = IPv4 "unspecified address" - i.e. this is not an address in itself, rather it is a special value you give to bind() to let it know that you haven't specified a specific address that you want the port bind() on. Essentially this means that the port will be bound on all the IP-addresses you have.
 [::0]     = IPv6 equivalent of 0.0.0.0 (though usually written [::/128])

Cela peut expliquer pourquoi certaines choses ont échoué et d'autres ont réussi. Par exemple, il se peut que vous ne puissiez pas vous lier à 127.0.0.1, mais que 0.0.0.0 fonctionne car il essaie de lier le port non seulement à 127.0.0.1 mais aussi à d'autres adresses IP que vous avez.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X