Comment se connecter à une machine virtuelle invitée à partir du système hôte?

15

J'ai une configuration de serveur Web VM et j'ai installé et démarré Apache. La machine virtuelle a une interface réseau pontée et peut être envoyée depuis l'hôte à l'aide de 192.168.0.2.

Cependant, si je tape cette même adresse IP dans le navigateur de la machine hôte, je m'attendais à voir la page apache par défaut générée sur la machine virtuelle, mais à la place, j'arrive can't connect to 192.168.0.2dans le navigateur des machines hôtes.

J'ai clairement manqué quelque chose. Quelqu'un sait ce que j'ai raté ou fait de mal?

Sortie de VM netstat -tnlp

tcp     0     0 0.0.0.0:22        0.0.0.0:*     LISTEN     950/sshd
tcp     0     0 127.0.0.1:25      0.0.0.0:*     LISTEN    1026/master
tcp     0     0 :::22                  :::*     LISTEN     904/sshd
tcp     0     0 ::1:25                 :::*     LISTEN     980/master

Dessin approximatif de ce à quoi je pense que l'activité / la connectivité du réseau devrait ressembler.

                               entrez la description de l'image ici

oshirowanen
la source
Si vous voyez seulement :::80, alors Apache écoute uniquement les connexions IPv6. Avez-vous essayé de vérifier vos Listendirectives?
Lekensteyn
Essayez d'ajouter l' -pindicateur à netstatpour vérifier que vous Apache écoute réellement sur le port 80, et non sur un autre service. Pouvez-vous fuir curl localhostl'invité? Que grep -C3 -rni Listen /etc/httpd/montre-t-on?
Lekensteyn
Rendez-moi service, si ces instructions fonctionnent, notez-le comme réponse, car vous aurez accès aux captures d'écran. Cette question revient assez souvent, je ne pense pas que sa solution ait été correctement saisie.
slm

Réponses:

14

Problème n ° 1 - Types de réseaux VM

Il existe 3 modes de mise en réseau:

  1. NAT
  2. Hôte uniquement
  3. Ponté

Détails sur leur configuration

Quand utiliser chacun?

  • # 1 : Pour le développement d'applications Facebook / Web qui se trouvent sur d'autres serveurs
  • # 2 : Si vous souhaitez créer votre propre application et la tester à partir de l'hôte VirtualBox (et pas seulement de la machine virtuelle invitée)
  • # 3 : Si vous souhaitez créer une application et la tester à partir d'autres systèmes sur LAN

Problème n ° 2 - blocage du pare-feu?

Selon la distribution que vous utilisez, le pare-feu peut empêcher votre navigateur Web d'accéder à votre instance Apache. Cela aurait du sens étant donné que vous pouvez envoyer une requête ping au système, mais pas y accéder via le port 80, qui est le port sur lequel Apache écoute.

le désactiver temporairement

Sur CentOS, vous utilisez cette commande pour la désactiver.

$ /etc/init.d/iptables stop

vérifier que l'écoute d'Apache

Vous pouvez également confirmer qu'il écoute sur ce port.

$ netstat -antp | grep :80 | head -1 | column -t
tcp  0  0  :::80  :::*  LISTEN  3790/httpd

confirmer que le pare-feu est désactivé

Le pare-feu peut être confirmé qu'il est grand ouvert.

$ iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination      

Si cela résout votre problème, vous pouvez ajouter de manière permanente une règle qui autorise le trafic via le port TCP 80.

ajout d'une règle pour le port TCP 80

$ /etc/init.d/iptables restart
$ iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$ /etc/init.d/iptables save

REMARQUE: cela rendra la règle persistante entre les redémarrages.

le pare-feu accepte le port TCP 80

Un système qui a le port 80 ouvert ressemblerait à ceci:

$ iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:https 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:8834 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Issue # 3 - Apache écoute?

Dans le problème ci-dessus, nous avons vu qu'Apache écoutait, mais parfois il est mal configuré de sorte qu'il n'écoute que sur 1 adresse IP, ou qu'il écoute sur une interface réseau différente. La commande netstatpeut être utilisée pour revérifier cela ainsi que pour examiner les fichiers de configuration Apache.

$ netstat -anpt | grep :80 | column -t
tcp  0  0  0.0.0.0:80  0.0.0.0:*  LISTEN  1750/httpd

Cela montre qu'Apache écoute sur toutes les interfaces (IP 0.0.0.0).

Je ne répéterai pas la réponse de @ Lekensteyn qui couvre cette question particulière plus en détail ici.

Les références

slm
la source
maintenant je suis complètement confus. J'ai déjà la machine virtuelle en mode ponté, je peux envoyer une requête ping à la machine virtuelle à partir de l'hôte, mais je ne peux pas obtenir la même adresse IP à partir du navigateur Web sur l'hôte, même si la machine virtuelle a installé et démarré apache, je devrais voir la it worked!page apache.
oshirowanen
@oshirowanen - merci de ne pas être frustré alors que nous essayons de résoudre le problème 8-). Assurez-vous qu'Apache est en cours d'exécution sur CentOS /etc/init.d/httpd status, devrait montrer en cours d'exécution.
slm
1
J'ai arrêté le pare-feu sur la machine virtuelle et je peux maintenant voir la page IP par défaut lorsque j'utilise un navigateur Web sur la machine hôte pour accéder à l'url de la machine virtuelle !!!
oshirowanen
1
@oshirowanen - WOOHOO! OK si la question était que le pare - feu, je vais ajouter une commande pour ajouter la règle à votre pare - feu, vous pouvez également le rendre permanent w / cette commande, /sbin/service iptables save.
slm
Oui! J'ai fait une installation minimale de CentOS et je n'aurais pas dû supposer que le pare-feu était désactivé par défaut ... Pour être honnête, le pare-feu ne m'est même pas venu à l'esprit. Merci d'avoir passé votre temps à aider.
oshirowanen
2

Votre installation Apache est probablement configurée pour écouter uniquement sur l'hôte local. Vous pouvez le vérifier en exécutant votre invité:

$ netstat -tnl | grep :80
Proto Recv-Q Send-Q Local Address      Foreign Address  State
tcp        0      0 0.0.0.0:80         0.0.0.0:*        LISTEN
tcp6       0      0 :::80              :::*             LISTEN

S'il le dit 0.0.0.0:80, il écoute sur toutes les interfaces. Dans votre cas, je m'attendrais à la 127.0.0.1:80place. Pour résoudre ce problème, modifiez votre configuration Apache (quelque part /etc/httpd/conf/) et modifiez:

Listen 127.0.0.1:80

à:

Listen 80

Vous pouvez également utiliser nmappour vérifier les services disponibles sur votre machine. Cela devrait ressembler à:

$ nmap 192.168.0.2

Starting Nmap 6.40 ( http://nmap.org ) at 2014-01-11 15:22 CET
Nmap scan report for localhost (192.168.0.2)
Host is up (0.0036s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 0.21 seconds
Lekensteyn
la source