Comment puis-je ouvrir le port 80 pour qu'un processus non root puisse s'y connecter?

46

Je souhaite exécuter un serveur Web sur mon Mac en tant que processus non root. Normalement, seuls les processus racine peuvent être liés au port 80 (ou à tout port inférieur à 1024).

Puis-je ouvrir le port 80 spécifiquement pour que les processus non root puissent l'écouter?

Avner
la source
Connexes: link1 , lien2
Nathan Farrington
ressemble plus à la question unix.stackexchange.com , n'est-ce pas?
Filip Bartuzi
1
pourquoi unix si c'est sur un système macos?
Décédé

Réponses:

28

Cela est difficile à réaliser par conception et, à moins que vous n'ayez un accès root à votre machine, les opérations suivantes ne fonctionneront pas, car elles nécessitent l'installation de root pour configurer les modifications. Une fois modifiés, cependant, les programmes en espace utilisateur auront accès sans avoir la racine.

Il existe deux méthodes courantes pour y parvenir. Le choix de votre choix dépend de la raison pour laquelle vous essayez de contourner la restriction:

Pointez le port 80 sur un autre port, tel que 8080

En reconfigurant votre ordinateur pour qu'il transmette tout le trafic du port 80 au port 8080, ou à l'un des ports de votre choix, vous pouvez autoriser les serveurs d'espace utilisateur à recevoir des ports de privilèges racine dans la zone à laquelle ils ont accès.

Le processus est simple:

Étape 1: Affichez les règles actuelles du pare-feu.

sudo ipfw show

Étape 2: Ajouter une règle de transfert de port (80 à 8080)

sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in

Si vous souhaitez supprimer vos règles de pare-feu, exécutez:

sudo ipfw flush

( source )

Il s’agit d’un changement temporaire, qui sera rétabli une fois que vous aurez redémarré ou sera effacé comme indiqué à la dernière ligne.

Vous pouvez rendre la modification permanente ou ajouter la commande en tant que ligne de démarrage avant de démarrer votre serveur, ce qui est probablement plus sûr du point de vue de la sécurité.

Utiliser Authbind

Authbind a été spécialement conçu pour permettre à un programme d'accéder aux ports de niveau inférieur sans lui donner un accès root complet.

Il y a un port MacOSX:

https://github.com/Castaglia/MacOSX-authbind

Il se peut qu’il reste limité au trafic IPv4, de sorte que vous devrez peut-être effectuer des recherches supplémentaires pour déterminer s’il répond à vos besoins.

Adam Davis
la source
LOVE MacOSX-authbind ... Il vous permet d'exécuter, par exemple, un serveur Web sur le port 80 - en tant qu '"administrateur standard". c'est à dire dans votre launchd .plist... ` "ProgramArguments": [ "path/to/authbind", "/usr/bin/php", "-c", "/www/.router.ini", "-S", "0.0.0.0:80", "-t", "/www", "/www/.router.php"]Woohoo!
Alex Gray
13
OS X Yosemite supprime ipfw. Cet élément essentiel décrit une solution alternative utilisant pf.
lyschoening
Notez que la redirection du trafic vers un port non privilégié peut ne pas être sûre si vous êtes sur un environnement partagé. un autre processus peut se lier à ce port avant votre programme ou si votre programme dissocie le port même momentanément pour un redémarrage rapide.
Lie Ryan
Authbind est vraiment une excellente solution, merci!
Favo
7

Vous pouvez utiliser ncatpour transférer le trafic d'un serveur Web s'exécutant sur un autre port:

sudo ncat -l -p 80 -c ' ncat -l -p 1234'

Cela transférera le trafic sur le port 80 à localhost: 1234. C’est un peu un problème, cependant, je ne l’utiliserais pas ailleurs que dans les tests rapides et certainement pas en production.

Notez que cela ne permettra pas à un processus non-root de s'y lier, mais en choisissant un port auquel le processus peut se lier, 1234 dans cet exemple, il semblera qu'il est lié au port 80. Cela équivaut à transfert du port 80 au port 1234 avec un pare-feu, mais de manière beaucoup plus temporaire.

Mathew Hall
la source
2
C'est une bonne solution de contournement. NB ncatest livré avec nmapqui peut être installé via les ports Mac avec sudo port install nmap. MacPorts lui-même peut être installé à partir de macports.org/install.php .
William Denniss
Cela me donne juste bind: des erreurs d'adresse déjà utilisées.
Matt Joiner
Pareil ici - ça n'a pas marché. Cela a fait l'affaire: unix.stackexchange.com/a/187038
Sebastian J.
2

Vous pouvez également utiliser ssh pour effectuer un transfert de port. Ainsi, si vous avez un serveur fonctionnant sous 8080, vous pouvez transférer le trafic du port 80. Voici un script que j'utilise, qui arrête Apache en natif s'il est en cours d'exécution et transmet le trafic:

forward8080to80.command:

echo "You may close this terminal and the forwarding will continue."
echo "To stop, kill the ssh process found by `sudo lsof -i ':80' | grep LISTEN`"
sudo apachectl stop
sudo ssh [email protected] -L 80:127.0.0.1:8080
Bdombro
la source
La redirection de port Ssh peut avoir des performances assez faibles et les fonctionnalités de sécurité n’ont pas beaucoup de sens dans un environnement local-> local. Mieux vaut utiliser le transfert de port intégré d'osx, ou quelque chose comme ncat.
Shayne
-3

Ce que vous devriez être capable de faire est d’ouvrir le port 80 de votre routeur et de le diriger vers l’adresse IP locale de votre serveur Web. Ensuite, sur votre Mac, activez le partage Web dans le volet de préférences Préférences Système> Partage et pointez-le sur le répertoire de votre choix. Cela a fonctionné pour moi dans le passé jusqu'à ce que je passe à 10.6 Server.

Matt Love
la source
1
Je cherche cela comme une solution pour ma propre machine de développement. Étant donné que je dois travailler dans des endroits où je n'ai pas le contrôle sur le routeur, cette solution ne peut pas fonctionner pour moi. Je pense que cela devrait fonctionner si vous configurez un serveur et que, pour une raison quelconque, vous n’avez pas accès à la racine.
Avner
Donc, pour être clair, vous essayez de configurer un serveur Web sur différents sites clients, mais vous n’avez pas accès au port 80 ouvert? Comment obtiendrez-vous le port ouvert sur le routeur si vous n'y avez pas accès? Est-ce que je comprends bien ou est-ce que je suis hors de la base?
Matt Love
J'essaie simplement d'utiliser le port 80 sur ma propre machine de développement et non sur un serveur de production. Je déploie sur heroku quand même.
Avner