C'est une question très basique d'Amazon EC2, mais je suis perplexe, alors voilà.
Je souhaite lancer une instance Amazon EC2 et autoriser l'accès à HTTP sur les ports 80 et 8888 De n'importe où. Jusqu'à présent, je ne peux même pas permettre à l'instance de se connecter à ces ports en utilisant Sa propre adresse IP (mais elle se connectera à localhost).
J'ai configuré le groupe de sécurité "par défaut" pour HTTP à l'aide de l'option HTTP standard de la console de gestion (et de SSH).
J'ai lancé mon instance dans le groupe de sécurité par défaut.
Je me suis connecté deux fois à l'instance sur le port SSH 22 et, dans une fenêtre, j'ai lancé un serveur HTTP Sur le port 80. Dans l'autre fenêtre, j'ai vérifié que je pouvais me connecter à HTTP à l'aide de "localhost".
Cependant, lorsque j'essaie d'accéder à HTTP à partir de l'instance (ou de tout autre endroit) à l'aide du DNS public ou de l'adresse IP privée, j'ai "connexion refusée".
Qu'est-ce que je fais mal, s'il vous plaît?
Ci-dessous se trouve un fragment de console montrant le wget qui réussit et les deux qui échouent s’exécutant à partir de l’instance elle-même.
--2012-03-07 15:43:31-- http://localhost/
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: /__whiff_directory_listing__ [following]
--2012-03-07 15:43:31-- http://localhost/__whiff_directory_listing__
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: “__whiff_directory_listing__”
[ <=>
] 7,512 --.-K/s in 0.03s
2012-03-07 15:43:31 (263 KB/s) - “__whiff_directory_listing__” saved [7512]
[ec2-user@ip-10-195-205-30 tmp]$ wget http://ec2-50-17-2-174.compute-1.amazonaws.com/
--2012-03-07 15:44:17-- http://ec2-50-17-2-174.compute-1.amazonaws.com/
Resolving ec2-50-17-2-174.compute-1.amazonaws.com... 10.195.205.30
Connecting to ec2-50-17-2-174.compute-1.amazonaws.com|10.195.205.30|:80... failed:
Connection refused.
[ec2-user@ip-10-195-205-30 tmp]$ wget http://10.195.205.30/
--2012-03-07 15:46:08-- http://10.195.205.30/
Connecting to 10.195.205.30:80... failed: Connection refused.
[ec2-user@ip-10-195-205-30 tmp]$
L’interface standard des sockets TCP exige que vous vous connectiez à une adresse IP particulière lorsque vous envoyez ou écoutez. Il y a quelques adresses un peu spéciales: localhost (que vous connaissez probablement) qui est 127.0.0.1. Il existe également une adresse spéciale, 0.0.0.0 ou INADDR_ANY (protocole Internet, raccourci spécial pour TOUT ADRESSE). C'est un moyen d'écouter TOUT ou plus généralement TOUTES les adresses de l'hôte. C'est une façon de dire au noyau/à la pile que vous n'êtes pas intéressé par une adresse IP particulière.
Ainsi, lorsque vous configurez un serveur qui écoute "localhost", vous indiquez au service que vous souhaitez utiliser l'adresse réservée spéciale uniquement accessible aux utilisateurs de cet hôte, et tant qu'elle existe sur chaque hôte, établir une connexion avec localhost n’atteindra que l’hôte à partir duquel vous faites la demande.
Si vous souhaitez qu'un service soit accessible partout (sur un hôte local, sur toutes les interfaces, etc.), vous pouvez spécifier 0.0.0.0.
(0) C'est idiot, mais la première chose à faire est de vous assurer que votre serveur Web est en cours d'exécution.
(1) Vous devez modifier votre groupe de sécurité pour permettre aux paquets HTTP entrants d'accéder à votre site Web. Si votre site Web écoute sur le port 80, vous devez modifier le groupe de sécurité pour ouvrir l'accès au port 80 comme indiqué ci-dessus. Si votre site Web écoute sur un autre port, vous devez modifier le groupe de sécurité pour accéder à cet autre port.
(2) Si vous exécutez une instance Linux, le pare-feu iptables s'exécute peut-être par défaut. Vous pouvez vérifier que ce pare-feu est actif en lançant
Statut iptables du service Sudo
sur la ligne de commande. Si vous obtenez une sortie, le pare-feu iptables est en cours d'exécution. Si vous obtenez un message "Le pare-feu ne fonctionne pas", c'est assez explicite. En général, le pare-feu iptables s'exécute par défaut.
Vous avez deux options: désactiver le pare-feu ou modifier la configuration du pare-feu pour laisser passer le trafic HTTP. J'ai choisi de désactiver le pare-feu en tant qu'option la plus simple (pour moi).
Sudo service iptables stop
Arrêter iptables ne présente aucun risque réel pour la sécurité, car iptables, s'il est actif, ne fait que dupliquer la fonctionnalité du pare-feu d'Amazon, qui utilise le groupe de sécurité pour générer son fichier de configuration. Nous supposons ici qu'Amazon AWS ne configure pas de manière incorrecte ses pare-feu, une hypothèse très sûre.
(3) Vous pouvez maintenant accéder à l'URL depuis votre navigateur.
(4) Les serveurs Microsoft Windows exécutent également leurs pare-feu personnels par défaut et vous devrez également réparer le pare-feu personnel de Windows Server.
Correction: par défaut, AWS ne déclenche pas les pare-feu de serveur tels que iptables (Centos) ou UAF (Ubuntu) lorsque vous ordonnez la création de nouvelles instances EC2 - C’est pourquoi les instances EC2 qui se trouvent dans le même VPC peuvent se connecter vous pouvez "voir" le serveur Web que vous avez lancé depuis une autre instance EC2 dans le même VPC.
Assurez-vous simplement que votre API RESTful écoute sur toutes les interfaces, c'est-à-dire 0.0.0.0:portID
Comme votre connexion est refusée (les paquets sont rejetés), je parie que c'est iptables qui cause le problème. Essayer de courir
iptables -I INPUT -p tcp --dport 80 -j ACCEPTER
iptables -I INPUT -p tcp --dport 8888 -j ACCEPTER
et tester la connexion.
Vous devrez également ajouter ces règles de manière permanente, ce que vous pourrez faire en ajoutant les lignes ci-dessus, par exemple./etc/sysconfig/iptables si vous utilisez Red Hat.
Apparemment, je me liais à localhost alors que je devais me lier à 0.0.0.0 pour répondre au port 80 de toutes les interfaces TCP entrantes (?). C’est une subtilité de TCP/IP que je ne comprends pas encore tout à fait, mais cela a résolu le problème.
Le support Amazon a répondu et cela a fonctionné instantanément:
J'ai répliqué le problème de mon côté sur une instance de test Ubuntu et j'ai pu le résoudre. Le problème était que pour exécuter Tomcat sur un port inférieur à 1024 sous Ubuntu/Unix, le service avait besoin de privilèges root, ce qui n'est généralement pas recommandé, car l'exécution d'un processus sur le port 80 avec des privilèges root constitue un risque de sécurité inutile.
Nous recommandons d’utiliser une redirection de port via iptables: -
iptables -t nat -A PREROUTING -i eth0 -p tcp --port 80 - j REDIRECT - vers-port 8080
J'espère que l'information ci-dessus aide.
Devait faire ce qui suit:
1) Activer l’accès HTTP sur la configuration d’instance, il n’était pas activé par défaut uniquement sur SSH 2) J’ai essayé de faire le serveur nodejs, le port a donc été lié à 80 -> 3000 a exécuté les commandes suivantes
iptables -F
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
Sudo service iptables-persistent flush