Le port semble ouvert, mais la connexion a été refusée

21

J'essaie d'ouvrir le port 3000 sur Ubuntu 12.04, car j'ai un serveur Web à l'écoute. Je suis un peu hors de ma zone de confort ici et j'ai passé de nombreuses heures à essayer de résoudre le problème sans succès.

Le port semble être ouvert dans le pare-feu:

$> sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
...
3000/tcp                   ALLOW       Anywhere
3000/tcp                   ALLOW       Anywhere (v6)

Le serveur écoute bien sur ce port:

$> netstat -an | grep "LISTEN "
...
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN     
...

Et je peux même wgetbien la page d'index:

$> wget localhost:3000
Connecting to localhost (localhost)|127.0.0.1|:3000... connected.
HTTP request sent, awaiting response... 200 OK

Et le fichier reçu contient ce que j'attends ("bonjour le monde" :).

Cependant, lorsque j'essaie depuis un autre ordinateur, ou si je wget mydomain.com:3000reçois "connection refused", et nmap me dit que le port n'est pas ouvert:

$> nmap -A -T4 mydomain.com
Host is up (0.00032s latency).
...
Not shown: 999 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 5.9p1 Debian 5ubuntu1 (protocol 2.0)
...
Service Info: OS: Linux

Une idée de ce que je devrais essayer ensuite ???

MODIFIER

Voici ce que donne traceroute:

$> traceroute mydomain.com
traceroute to mydomain.com (176.31.x.x), 30 hops max, 60 byte packets
 1  mydomain.com (176.31.x.x)  0.034 ms  0.013 ms  0.010 ms
sebpiq
la source
Désactivez ufw, réessayez. Si cela ne fonctionne pas, il existe un autre pare-feu / périphérique entre l'ordinateur distant et votre serveur.
ish
J'ai déjà essayé .. je ne l'ai pas résolu :(
sebpiq
"il existe un autre pare-feu / périphérique entre l'ordinateur distant et votre serveur." : c'est très peu probable. J'ai essayé le deuxième wget du serveur pour qu'il fasse un aller-retour à travers le réseau.
sebpiq
hein? Vous ne pouvez pas taper wget serverseb.com depuis serverseb et le faire faire un aller-retour sans un peu de magie de routage iptables. Veuillez coller la sortie de traceroute mydomain.coml'ordinateur distant. Vous pouvez ** sortir les deux derniers octets de la dernière IP (serveur) pour la confidentialité.
ish
édité avec un traceroute
sebpiq

Réponses:

24

Si votre serveur écoute uniquement sur l'interface localhost, vous ne pourrez pas y accéder à partir d'un ordinateur distant. Cela semble être votre principal problème, car seul 127.0.0.1:3000 est répertorié dans votre sortie netstat.

Vous devrez également vous assurer que «mydomain.com» se résout à l'adresse IP correcte pour votre machine, de telle sorte que la connexion à celle-ci entraînera une communication avec l'interface externe de cette machine.

dobey
la source
Je peux ssh vers la machine en utilisant son nom, donc je suppose que la résolution de nom n'est pas le problème ici. Comment puis-je faire en sorte que le serveur écoute de n'importe où?
sebpiq
1
@sebpiq Cette résolution est spécifique au programme. Vous devez lier l'écouteur du programme à la bonne interface par le nom { eth0, ou quelque chose comme ça), l'adresse IP (192.168.1.99, ou quelque chose comme ça), ou l'adresse MAC. Cela dépend du programme.
Rétablir Monica - ζ--
uugh ... semble fou: S Je vais essayer de google à ce sujet. Mon serveur est node.js, je vais donc vérifier s'il y a des informations sur l'interface à laquelle je dois me connecter.
sebpiq
Ouais !!! @ObsessiveFOSS et dobey merci BEAUCOUP! Mon serveur node.js écoutait uniquement sur localhost. Je ne savais pas que ça fonctionnait comme ça, et aucun des tutoriels ne l'a mentionné.
sebpiq
@sebpiq Pas de problème. :-)
Réintégrer Monica - ζ--
13

J'ai eu ce problème récemment avec un serveur nodejs HTTPS, et la solution n'était pas d'utiliser "localhost", "127.0.0.1" ou même le nom de domaine. C'était d'utiliser "0.0.0.0"

Je crois que cela agit comme un caractère générique, permettant désormais une résolution publique via le nom de domaine et cela fonctionne également avec "localhost"

Modifier: voici un lien vers une page de défaillance du serveur sur le sujet 0.0.0.0: /server/78048/whats-the-difference-between-ip-address-0-0-0-0-and- 127-0-0-1

Sami Fouad
la source
Utilisez "0.0.0.0" où exactement?
Adaephon
@Adaephon Eh bien, dans mon cas, j'ai créé un serveur Web basé sur un nœud. Je devais changer: }).listen(3000, '127.0.0.1'); à }).listen(3000, '0.0.0.0'); mon code.
Sami Fouad
@Adaephon Je ne sais donc pas combien d'aide c'était, mais où que vous définissiez l'IP / le nom d'hôte, essayez plutôt 0.0.0.0.
Sami Fouad
pouvez-vous s'il vous plaît visiter mon poste? stackoverflow.com/questions/37922804/…
Kar19
1
0.0.0.0 (ou plutôt la représentation binaire 0) est considérée comme écoutant tout le monde du point de vue de l'interface socket. Vous pouvez donner une autre IP et elle n'écoutera que l'interface où vous avez cette IP. Par exemple, si vous donnez 127.0.0.1, vous ne pouvez recevoir des connexions que des IP 127. *. *. * (Localhost vraiment), ou d'autres ordinateurs avec des tables de routage sérieusement bâclées qui accèderaient à la vôtre pour 127.0.0.1 (pour tester cela dernier cas!)
Paul Stelian
3

Y a-t-il une chance que vous utilisiez AWS ou tout autre service cloud? Dans ce cas, le port doit être ouvert au niveau de la configuration d'inctance (OS) ou après. En particulier dans AWS, vous devriez rechercher des «groupes de sécurité» où vous devez ouvrir l'accès au port 3000

Гдето Якутский
la source