La porta sembra essere aperta, ma la connessione è stata rifiutata


21

Sto cercando di aprire la porta 3000 su Ubuntu 12.04, perché ho un server web che ascolta lì. Sono un po 'fuori dalla mia zona di confort qui, e ho trascorso molte ore cercando di risolvere il problema senza successo.

La porta sembra essere aperta nel firewall:

$> sudo ufw status
Status: active

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

Il server sta ascoltando bene su quella porta:

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

E posso anche wgetandare bene alla pagina dell'indice:

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

E il file ricevuto contiene ciò che mi aspetto ("ciao mondo" :).

Tuttavia, quando provo da un altro computer, o se wget mydomain.com:3000ottengo "connection refused", e nmap mi dice che la porta non è aperta:

$> 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

Qualche idea su cosa dovrei provare dopo ???

MODIFICARE

Ecco cosa offre 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

Disabilita ufw, riprova. Se il problema persiste, esiste un altro firewall / dispositivo tra il computer remoto e il server.
Ish,

Ho già provato .. non l'ho risolto :(
sebpiq

"esiste un altro firewall / dispositivo tra il computer remoto e il server." : è molto improbabile. Ho provato il secondo wget dal server in modo che faccia un giro circolare attraverso la rete.
sebpiq,

eh? Non è possibile digitare wget servereb.com da servereb e farlo fare un giro senza un po 'di magia di routing iptables. Incollare l'output di traceroute mydomain.comdal computer remoto. È possibile ** escludere gli ultimi due ottetti dell'ultimo IP (server) per motivi di privacy.
Ish,

modificato con un traceroute
sebpiq

Risposte:


24

Se il tuo server è in ascolto solo sull'interfaccia localhost, non sarai in grado di accedervi da un computer remoto. Questo sembra essere il tuo problema principale, poiché solo 127.0.0.1:3000 è elencato nell'output di netstat.

Dovrai inoltre assicurarti che "mydomain.com" si risolva nell'indirizzo IP corretto per il tuo computer, in modo tale che il collegamento ad esso comporti una comunicazione con l'interfaccia esterna di quel computer.


Posso usare ssh sulla macchina usando il suo nome, quindi immagino che la risoluzione dei nomi non sia il problema qui. Come posso fare in modo che il server ascolti da qualsiasi luogo?
sebpiq,

1
@sebpiq Questa risoluzione è specifica del programma. Devi associare l'ascoltatore del programma all'interfaccia corretta per nome { eth0, o qualcosa del genere), indirizzo IP (192.168.1.99 o qualcosa del genere) o indirizzo MAC. Questo dipende dal programma.
Ripristina Monica - ζ--

uugh ... sembra folle: S proverò a cercarlo su Google. Il mio server è node.js, quindi controllerò se ci sono informazioni su quale interfaccia devo connettermi.
sebpiq,

Yeepee !!! @ObsessiveFOSS e dobey grazie mille! Il mio server node.js era in realtà solo in ascolto su localhost. Non sapevo che stesse facendo così, e nessuno dei tutorial lo ha menzionato.
sebpiq,

@sebpiq Nessun problema. :-)
Ripristina Monica - ζ--

13

Di recente ho riscontrato questo problema con un server HTTPS nodejs e la soluzione non era utilizzare "localhost", "127.0.0.1" o persino il nome di dominio. Doveva usare "0.0.0.0"

Credo che questo funzioni come un jolly, ora consente la risoluzione pubblica tramite il nome di dominio e funziona anche con "localhost"

Modifica: ecco un link a una pagina serverfault sull'argomento 0.0.0.0: /server/78048/whats-the-difference-b Between-ip-address-0-0-0-0- and- 127-0-0-1


Utilizzare "0.0.0.0" dove esattamente?
Adaephon,

@Adaephon Beh, nel mio caso, ho creato un server web basato su nodo. Ho dovuto cambiare: }).listen(3000, '127.0.0.1'); a }).listen(3000, '0.0.0.0'); nel mio codice.
Sami Fouad,

@Adaephon Quindi non sono sicuro di quanto aiuto fosse, ma ovunque tu stia definendo l'IP / nome host, prova invece 0.0.0.0.
Sami Fouad,

puoi per favore visitare il mio post? stackoverflow.com/questions/37922804/...
Kar19

1
0.0.0.0 (o piuttosto la rappresentazione binaria 0) è considerato come l'ascolto di tutti dal punto di vista dell'interfaccia socket. Puoi fornire un altro IP e ascolterà solo l'interfaccia in cui hai quell'IP. Ad esempio, se si fornisce 127.0.0.1, è possibile ricevere connessioni solo dagli IP 127. *. *. * (Localhost in realtà) o da altri computer con tabelle di routing gravemente compromesse che accederanno alle proprie per 127.0.0.1 (per testarlo ultimo caso!)
Paul Stelian,

3

C'è qualche possibilità che tu stia utilizzando AWS o altri servizi cloud? In tal caso, la porta deve essere aperta a livello di configurazione (OS) o successiva. In particolare in AWS dovresti cercare "Gruppi di sicurezza" in cui dovresti aprire l'accesso alla porta 3000

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.