iptables équivalent pour mac os x

56

Je souhaite transférer les demandes de 192.168.99.100:80à 127.0.0.1:8000. Voici comment je le ferais sous Linux en utilisant iptables:

iptables -t nat -A OUTPUT -p tcp --dport 80 -d 192.168.99.100 -j DNAT --to-destination 127.0.0.1:8000

Comment faire la même chose sous MacOS X? J'ai essayé une combinaison de ipfwcommandes sans grand succès:

ipfw add fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(Pour moi, réussir consiste à pointer un navigateur http://192.168.99.100et à obtenir une réponse du serveur de développement sur lequel je suis en cours d'exécution localhost:8000)

nafe
la source
Parlons-nous du client ou du serveur OSX?
Scott Pack
1
C'est un léopard des neiges.
Nafe
Y a-t-il une raison pour laquelle vous ne pouvez pas configurer votre serveur Web pour qu'il écoute également sur 192.168.99.100:80?
Zoredache
1
@Zoredache L'écoute sur le port 80 nécessite sudo et certains serveurs Web n'abandonnent pas les privilèges assez rapidement pour les exécuter en toute sécurité avec sudo.
Navin

Réponses:

33

Alors j'ai trouvé un moyen de faire ça. Je ne suis pas sûr que ce soit la méthode préférée, mais ça marche! À votre coquille préférée:

sudo ifconfig lo0 10.0.0.1 alias
sudo ipfw add fwd 127.0.0.1,9090 tcp from me to 10.0.0.1 dst-port 80

(L'alias lo0semble être la partie manquante)

Si vous souhaitez qu'un (faux) domaine pointe vers ce nouvel alias, assurez-vous que / etc / hosts contient la ligne suivante:

10.0.0.1 www.your-domain.com
nafe
la source
4
ipfw ne fonctionnera pas sur Yosemite (MAC) et semble un peu obsolète
Vadorequest
25

J'ai pu le faire fonctionner avec les commandes ifconfiget pfctldu Mac 10.10.2. Avec l'approche suivante je cartographie avec succès 127.0.0.1:3000à mydomain.comlocalement sur ma machine.

Dans votre ligne de commande , entrez les deux commandes suivantes pour transférer des connexions à 127.0.0.1:3000la 10.0.0.1:

sudo ifconfig lo0 10.0.0.1 alias
echo "rdr pass on lo0 inet proto tcp from any to 10.0.0.1 port 80 -> 127.0.0.1 port 3000" | sudo pfctl -ef -

Puis modifiez votre fichier /etc/hostsou /private/etc/hostset ajoutez la ligne suivante pour mapper votre domaine 10.0.0.1.

10.0.0.1 mydomain.com

Après avoir enregistré votre fichier hosts, rincez votre DNS local:

sudo discoveryutil udnsflushcaches

Ouvrez maintenant mydomain.comdans un navigateur et vous verrez le serveur hébergé sur votre port localhost (c'est-à-dire 127.0.0.1:3000). Fondamentalement, ce processus mappe un <ip>:<port>à un nouveau <ip>afin que vous puissiez ensuite mapper un hôte avec cette adresse IP.

Kevin Leary
la source
1
Juste un peu hacky, mais fait le travail. Bon spectacle.
Joey Carson
6
Je vous remercie. Comment voulez-vous annuler l'alias et le transfert?
Carlos Nuñez
1
Salut sudo discoveryutil udnsflushcachesme donne command not foundmais il correspond toujours l'entrée correctement. Mais comment puis-je cartographier un deuxième port? J'ai essayé de faire les étapes 1 + 2 avec id: 10.0.0.2et un autre port, mais cela ne prend toujours que la dernière connexion. Donc, si je fais en dernier 10.0.0.1et port 3000en avant 3000, si je le fais en dernier 10.0.0.2et le porter 4000en avant 4000. Dans mon /private/etc/hostsj'ai écrit les deux entrées avec l'identifiant différent (selon).
Andi Giga
Fonctionne, mais j’en ai besoin à nouveau lorsque je redémarre OSX .... Vous voulez enregistrer cela de manière permanente?
Kasper
1
Veuillez mettre à jour avecsudo dscacheutil -flushcache
northtree
5

J'ai moi aussi dû faire la même chose récemment, et cette réponse a été recherchée. Malheureusement, la réponse de Nafe utilise ipfwce qui est maintenant déconseillé et indisponible dans OSX; et la réponse de Kevin Leary est en effet un peu féroce. J'ai donc dû faire quelque chose de mieux (plus propre) et j'ai décidé de le partager ici pour la postérité. Cette réponse est en grande partie basée sur l’approche évoquée ici .

Comme OP le mentionne, pointer un navigateur sur 192.168.99.100 devrait obtenir une réponse d'un serveur situé sur localhost: 8000. L'ajout d'un alias à ifconfign'est pas vraiment nécessaire, cela pfctlsuffit à lui seul: pour cela, le pf.conffichier /etc/pf.confdoit être modifié.

Tout d' abord , nous créons (avec sudo) un nouveau fichier d'ancrage (laisser l' appelle de redirection) à: /etc/pf.anchors/redirection. Ceci est essentiellement un fichier texte régulier et contient la ligne suivante (comme dans la réponse de Kevin Leary): rdr pass on lo0 inet proto tcp from any to 192.168.99.100 port = 80 -> 127.0.0.1 port 8000. Une fois que le nouveau fichier d'ancrage a été créé, il doit être référencé dans le pf.conffichier. Ouvrez le pf.conffichier avec sudo et ajoutez rdr-anchor "redirection"après la dernière ligne rdr-anchor (qui est rdr-anchor "com.apple/*") et ajoutez load anchor "redirection" from "/etc/pf.anchors/redirection"à la fin.

En fin de compte, voici à quoi devrait ressembler le fichier pf.conf:

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr-anchor "redirection"  #added for redirection/port forwarding
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "pow" from "/etc/pf.anchors/redirection"  #added for redirection/port forwarding

Et c'est presque ça. Il suffit de redémarrer pfctlen émettant sudo pfctl -dpour le désactiver en premier, puis sudo pfctl -fe /etc/pf.confpour le redémarrer.

Maintenant, si vous avez besoin que cela se produise automatiquement après chaque redémarrage, un autre petit travail doit être effectué: le démon de lancement de pfctldoit être mis à jour (l'explication référencée indique que pf est activé automatiquement au démarrage, mais cela ne semble pas être le cas. le cas de regarder le code). Ouvrez (avec sudo) System/Library/LaunchDaemons/com.apple.pfctl.plistet cherchez ceci:

<array>
          <string>pfctl</string>
          <string>-f</string>
          <string>/etc/pf.conf</string>
</array>

et ajoutez la ligne <string>-e</string>pour le rendre finalement comme ceci:

<array>
         <string>pfctl</string>
         <string>-e</string>
         <string>-f</string>
         <string>/etc/pf.conf</string>
</array>

Ça devrait le faire.

Mise en garde : Apple ne permet plus de modifier les fichiers de démon de lancement de cette façon (pas avec sudo, ni chmod, ni rien d'autre). Le seul moyen est de bricoler les paramètres de System Integrity Protection : démarrez en mode de récupération et lancez le terminal. Vérifiez l'état SIP avec csrutil status, il devrait généralement être activé. Désactivez-le avec csrutil disableet redémarrez en mode normal, puis apportez les modifications au fichier plist comme indiqué ci-dessus. Une fois cela fait, revenez en mode de récupération et réactivez la protection (en place pour une bonne raison) en émettant csrutil enable.

Explication: Il est possible de vérifier en lançant la ifconfigcommande qui 127.0.0.1est déjà l'alias (par défaut) pour localhost lo0. Ce fait est utilisé pour éviter d'avoir à ajouter un alias supplémentaire pour localhost et d'utiliser simplement l'adresse par défaut dans le pf.conffichier.

UPDATE: Malheureusement, il semble que le chargement du fichier au démarrage ne fonctionne pas. J'essaie toujours d'obtenir de l'aide pour le faire trier. Jusque-là, courir sudo pfctl -f /etc/pf.confaprès le démarrage fait l'affaire.

Yogesch
la source
Merci pour cela, cela a fonctionné pour moi sous OS X Sierra. Il est cependant très important que le fichier de redirection se termine par une nouvelle ligne.
Kadrian
Il ne semble pas prudent d’écraser des fichiers système tels que System/Library/LaunchDaemons/com.apple.pfctl.plist; cela ne survivrait probablement pas à une mise à jour du système d'exploitation?
Tom
1

À partir de 10.5, OS X est livré avec un nouveau pare-feu orienté application, au lieu de ipfw. Mais ipfw est toujours installé. Si vous avez des problèmes avec sa syntaxe, consultez les interfaces graphiques telles que WaterRoofou Flying Buttress.

HTH, PEra

PEra
la source
1

L'ordre des règles est important, assurez-vous qu'il n'y a pas de "tout refuser" avant que vos règles permettent, ou quelque chose comme ça.

monomyth
la source
Merci pour le conseil mais je ne pense pas avoir ce problème particulier (la liste d'ipfw ne montre que ma règle et 65535 allow ip from any to any).
vendredi
1

Votre commande semble manquer un numéro de règle; essayer:

ipfw add 100 fwd 127.0.0.1,8000 tcp from any to 192.168.99.100 80

(Si vous n’exécutez pas en tant que root, vous devrez le préfixer par sudo). Une autre chose à vérifier est que le pare-feu est activé:

sysctl net.inet.ip.fw.enable

S'il revient avec la valeur 0 (désactivé), activez-le avec:

sysctl -w sysctl net.inet.ip.fw.enable=1

... et organisez-le pour qu'il soit réactivé au redémarrage de l'ordinateur. La "bonne" façon de faire est probablement de créer un élément lancé ( Lingon rend cela assez facile). Ou utilisez simplement l’un des outils graphiques cités par PEra et laissez-le s’occuper des détails.

Gordon Davisson
la source