web-dev-qa-db-fra.com

iptables équivalent pour mac os x

Je souhaite transmettre 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 commandes ipfw sans grand succès:

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

(Pour moi, le succès pointe vers un navigateur sur http://192.168.99.100 et obtenir une réponse d'un serveur de développement sur lequel j'exécute localhost:8000)

60
nafe

J'ai donc découvert a moyen de le faire. Je ne sais pas si c'est la voie préférée mais ça marche! À votre Shell préféré:

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 de lo0 semble être la partie manquante)

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

10.0.0.1 www.your-domain.com
35
nafe

J'ai pu faire fonctionner cela en utilisant les commandes ifconfig et pfctl sur Mac 10.10.2. Avec l'approche suivante, je mappe avec succès 127.0.0.1:3000 à mydomain.com localement sur ma machine.

Dans votre ligne de commande, entrez les deux commandes suivantes pour transférer les connexions vers 127.0.0.1:3000 à 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 -

Modifiez ensuite votre /etc/hosts ou /private/etc/hosts fichier et ajoutez la ligne suivante pour mapper votre domaine à 10.0.0.1.

10.0.0.1 mydomain.com

Après avoir enregistré votre fichier d'hôtes, videz votre DNS local:

Sudo discoveryutil udnsflushcaches

Ouvert mydomain.com dans 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> vers un nouveau <ip> afin que vous puissiez ensuite mapper un hôte sur cette IP.

28
Kevin Leary

Moi aussi, j'ai dû faire une chose similaire récemment, et en cherchant cette réponse. Malheureusement, la réponse de Nafe utilise ipfw qui est maintenant obsolète et indisponible dans OSX; et la réponse de Kevin Leary est en effet un peu hackish. 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 largement basée sur l'approche mentionnée à this Gist .

Comme OP le mentionne, le fait de pointer un navigateur sur 192.168.99.100 devrait obtenir une réponse d'un serveur sur localhost: 8000. L'ajout d'un alias à ifconfig n'est pas vraiment nécessaire, pfctl seul suffit: pour y parvenir, le pf.conf fichier sur /etc/pf.conf doit être modifié.

Nous créons d'abord (avec Sudo) un nouveau fichier d'ancrage (appelons-le redirection) à: /etc/pf.anchors/redirection. Il s'agit essentiellement d'un fichier texte normal 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 le nouveau fichier d'ancrage créé, il doit être référencé dans le pf.conf fichier. Ouvrez le pf.conf fichier avec Sudo et ajoutez rdr-anchor "redirection" après la dernière ligne d'ancrage rdr (qui est rdr-anchor "com.Apple/*") et ajouter 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. Redémarrez simplement pfctl en émettant Sudo pfctl -d pour le désactiver d'abord, puis Sudo pfctl -fe /etc/pf.conf pour le redémarrer.

Maintenant, si vous avez besoin que cela se produise automatiquement après chaque redémarrage, un autre petit travail doit être fait: le démon de lancement pour pfctl doit être mis à jour (le Gist référencé mentionne que pf est activé automatiquement au démarrage, cependant cela ne semble pas être le cas en regardant le code). Ouvert (avec Sudo) System/Library/LaunchDaemons/com.Apple.pfctl.plist et recherchez ceci:

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

et ajoutez la ligne <string>-e</string> pour finalement faire comme ça:

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

Ça devrait le faire.

Avertissement : Apple ne permet plus de modifier les fichiers de démon de lancement comme ça (pas avec Sudo, ni chmod, ni rien d'autre.) La seule manière est de bricoler avec les paramètres System Integrity Protection : démarrer en mode de récupération et lancer le terminal . Vérifiez l'état SIP avec csrutil status, il doit généralement être activé. Désactivez-le avec csrutil disable et redémarrez en mode normal, puis apportez les modifications au fichier plist comme indiqué ci-dessus. Une fois cela fait, revenez au mode de récupération et réactivez la protection (elle est en place pour une bonne raison) en émettant csrutil enable.

Explication: On peut vérifier en émettant la commande ifconfig que 127.0.0.1 est 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 pour simplement utiliser l'adresse par défaut dans le pf.conf fichier.

MISE À JOUR: 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à, exécutez Sudo pfctl -f /etc/pf.conf après le démarrage fait l'affaire.

6
Yogesch

Cela a bien fonctionné pour moi:

4
Colin Sullivan

À partir de la version 10.5, OS X est fourni 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 comme WaterRoof ou Flying Buttress.

HTH, PEra

1
PEra

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

1
monomyth

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 ne lancez pas en tant que root, vous devrez le préfixer avec 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é), allumez-le avec:

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

... et faites en sorte qu'il soit réactivé au redémarrage de l'ordinateur. La façon "correcte" de le faire est probablement de créer un élément launchd ( Lingon rend cela assez facile). Ou utilisez simplement l'un des outils GUI mentionnés par PEra et laissez-le s'occuper des détails.

1
Gordon Davisson