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
)
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
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.
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.
Cela a bien fonctionné pour moi:
Ajoutez la ligne suivante au fichier de démarrage, comme décrit ici: http://xeiam.com/port-forwarding-80-to-8080-using-ipfw-on-mac-os-x/
add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in
À 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
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.
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.