Je suis sur un Mac exécutant une machine virtuelle Windows dans Parallels, j'aimerais - depuis mon Mac - pouvoir accéder à http://localhost:44300
et que cette requête soit traitée par une application s'exécutant à l'intérieur de la machine virtuelle.
Je sais que c'est possible car lorsque j'exécute docker, c'est en effet ce qu'il fait, je peux créer une application, l'exécuter dans le conteneur docker sur le port 44300
, puis accéder à localhost:44300
depuis la machine hôte. Je ne sais simplement pas comment configurer mon Windows + VM pour le faire.
J'ai donc créé un simple serveur web en nodejs qui répond simplement avec un horodatage. Cela fonctionne lorsqu'on y accède depuis la machine virtuelle :
À ce stade, mon netstat
affiche
TCP 127.0.0.1:44300 :0 ÉCOUTE
À ce stade, essayer de faire un curl
depuis l'hôte ne fonctionne bien sûr pas
$ curl http://localhost:44300
curl: (7) Échec de la connexion à localhost sur le port 44300 : Connexion refusée
Donc pour ouvrir cela à la machine hôte, je redirige le port dans Parallels dans ma configuration NAT
J'ai également créé une règle urlacl :
PS C:\Users\gmauer> netsh http show urlacl | select-string 44300 -Context 1,5
> URL réservée : http://*:44300/
Utilisateur : \Everyone
Écoute : Oui
Délégué : Non
SDDL : D:(A;;GX;;;WD)
Maintenant, lorsque je fais un curl
j'obtiens quelque chose de différent
$ curl http://localhost:44300 --max-time 3
curl: (28) Le délai d'opération a expiré après 3004 millisecondes sans réception de données
Cela semble être dû à mon pare-feu Windows. Je le désactive (temporairement) :
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
et maintenant j'obtiens quelque chose de différent une fois de plus
$ curl http://localhost:44300 --max-time 3
curl: (56) Échec de la réception : Réinitialisation de la connexion par le correspondant
Cela me semble indiquer que la requête pénètre dans la VM mais est bloquée par quelque chose à l'intérieur de la VM (à mon avis, c'est le correspondant).
Pour confirmer cela, j'ouvre Wireshark où je vois ce qui suit :
Ainsi, la VM reçoit la requête, puis quelque chose la Réinitialise avec un RST... Et là, je ne sais plus quoi faire d'autre.
On m'a suggéré que le problème vient du fait que localhost
est spécial (ce qui est évident), mais je pense avoir démontré ci-dessus que la requête pénètre dans la VM, elle passe le pare-feu, elle n'arrive tout simplement pas plus loin. Que puis-je vérifier/faire d'autre ?
Édition 1: Comme cela semble fou mais je vais essayer, j'ai essayé de mapper les localhosts vers l'IP de ma machine invitée dans le fichier hosts de mon Windows - rien ne fonctionne.
Édition 2: J'ai essayé d'exécuter netcat pour configurer un serveur de socket et je peux me connecter en telnet depuis l'hôte et envoyer des messages au serveur de socket. Cela prouve sans aucun doute que les requêtes arrivent dans la VM. Un indice intéressant est que bien que Wireshark montre la requête, Fiddler ne le montre pas.