Port wydaje się być otwarty, ale połączenie odmówiono


21

Próbuję otworzyć port 3000 w systemie Ubuntu 12.04, ponieważ mam tam serwer sieci Web, który nasłuchuje. Jestem trochę poza strefą komfortu i spędziłem wiele godzin, próbując rozwiązać problem bez powodzenia.

Port wydaje się być otwarty w zaporze:

$> sudo ufw status
Status: active

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

Serwer nasłuchuje na tym porcie:

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

I mogę nawet wgetpoprawić stronę indeksu:

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

A otrzymany plik zawiera to, czego oczekuję („witaj świecie” :).

Jednak, gdy próbuję z innego komputera, lub jeśli wget mydomain.com:3000dostaję "connection refused", a nmap mówi mi, że port nie jest otwarty:

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

Masz pomysł, co powinienem wypróbować?

EDYTOWAĆ

Oto, co daje 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

Wyłącz ufw, spróbuj ponownie. Jeśli to nie zadziała, istnieje inna zapora ogniowa / urządzenie między komputerem zdalnym a serwerem.
ish

Próbowałem już ... nie rozwiązałem tego :(
sebpiq

„istnieje inna zapora ogniowa / urządzenie między komputerem zdalnym a serwerem”. : jest to bardzo mało prawdopodobne. Spróbowałem drugiego wgeta z serwera, aby odbył podróż w obie strony przez sieć.
sebpiq

co? Nie można wpisać wget serverseb.com z serverseb i zmusić go do podróży w obie strony bez wymyślnej magii routingu iptables. Proszę wkleić dane wyjściowe traceroute mydomain.comz komputera zdalnego. Możesz ** wykorzystać dwa ostatnie oktety ostatniego adresu IP (serwera) dla zachowania prywatności.
ish

edytowane za pomocą traceroute
sebpiq

Odpowiedzi:


24

Jeśli twój serwer nasłuchuje tylko na interfejsie localhost, nie będziesz mógł uzyskać do niego dostępu ze zdalnego komputera. Wydaje się, że jest to twój główny problem, ponieważ tylko 127.0.0.1:3000 jest wymienione w wynikach netstat.

Musisz także upewnić się, że „mydomain.com” rozpoznaje poprawny adres IP komputera, tak że połączenie z nim spowoduje komunikację z zewnętrznym interfejsem tego komputera.


Mogę ssh do komputera przy użyciu jego nazwy, więc myślę, że rozpoznawanie nazw nie jest tutaj problemem. Jak mogę to zrobić, aby serwer nasłuchiwał z dowolnego miejsca?
sebpiq

1
@sebpiq Ta rozdzielczość jest specyficzna dla programu. Musisz powiązać program nasłuchujący z odpowiednim interfejsem poprzez nazwę { eth0lub coś w tym rodzaju), adres IP (192.168.1.99 lub coś w tym rodzaju) lub adres MAC. To zależy od programu.
Przywróć Monikę - ζ--

uugh ... brzmi niesamowicie: S Spróbuję o tym napisać w Google. Mój serwer to node.js, więc sprawdzę, czy są informacje na temat interfejsu, z którym muszę się połączyć.
sebpiq

Yeepee !!! @ObsessiveFOSS i dobey dziękuję TAK DUŻO! Mój serwer node.js nasłuchiwał tylko na localhost. Nie wiedziałem, że tak się dzieje i żaden z samouczków o tym nie wspominał.
sebpiq

@sebpiq Nie ma problemu. :-)
Przywróć Monikę - ζ--

13

Ostatnio miałem ten problem z serwerem HTTPS firmy nodejs, a rozwiązaniem tego problemu nie było użycie „localhost”, „127.0.0.1” ani nawet nazwy domeny. Miało to być „0.0.0.0”

Uważam, że działa to jak symbol wieloznaczny, pozwalając teraz na publiczne rozpoznawanie za pomocą nazwy domeny i działa również z „localhost”

Edycja: Oto link do strony błędu serwera na temat 0.0.0.0: /server/78048/whats-the-difference-between-ip-address-0-0-0-0-and- 127–0–0–1


Gdzie dokładnie użyć „0.0.0.0”?
Adaephon

@Adaephon W moim przypadku stworzyłem serwer internetowy oparty na Węzłach. Musiałem zmienić: }).listen(3000, '127.0.0.1'); aby }).listen(3000, '0.0.0.0'); w moim kodu.
Sami Fouad

@Adaephon Więc nie jestem pewien, ile to była pomoc, ale gdziekolwiek definiujesz adres IP / nazwę hosta, spróbuj zamiast tego 0.0.0.0.
Sami Fouad

czy możesz odwiedzić mój post? stackoverflow.com/questions/37922804/…
Kar19

1
0.0.0.0 (a raczej reprezentacja binarna 0) jest uważana za słuchającą wszystkich z punktu widzenia interfejsu gniazda. Możesz podać inny adres IP, a on będzie nasłuchiwał tylko interfejsu, w którym masz ten adres IP. Na przykład, jeśli podasz 127.0.0.1, możesz odbierać połączenia tylko z 127. *. *. * Adresy IP (naprawdę localhost) lub z innych komputerów z poważnie spartaczonymi tabelami routingu, które miałyby dostęp do twojego dla 127.0.0.1 (aby to przetestować ostatnia sprawa!)
Paul Stelian,

3

Czy jest jakaś szansa, że ​​korzystasz z AWS lub innej usługi w chmurze? W takim przypadku port powinien zostać otwarty na poziomie konfiguracji systemu operacyjnego lub później. W szczególności w AWS powinieneś szukać „grup bezpieczeństwa”, w których powinieneś otworzyć dostęp do portu 3000

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.