Порт, кажется, открыт, но соединение отказано

21

Я пытаюсь открыть порт 3000 на Ubuntu 12.04, потому что у меня там прослушивает веб-сервер. Я немного не в своей зоне конфорт и провел много часов, пытаясь решить проблему без успеха.

Кажется, порт открыт в брандмауэре:

$> sudo ufw status
Status: active

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

Сервер слушает нормально на этом порту:

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

И я могу даже wgetхорошо индексировать страницу:

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

И полученный файл содержит то, что я ожидаю («Привет, мир» :).

Тем не менее, при попытке с другого компьютера, или если я wget mydomain.com:3000получаю "connection refused", и Nmap говорит мне, что порт не открыт:

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

Любая идея, что я должен попробовать дальше ???

РЕДАКТИРОВАТЬ

Вот что дает 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
источник
Отключить UFW, попробуйте еще раз. Если это не работает, между удаленным компьютером и вашим сервером есть другой брандмауэр / устройство.
Иш
Я уже пробовал .. не решил :(
sebpiq
«Между удаленным компьютером и вашим сервером есть еще один брандмауэр / устройство». Это очень маловероятно. Я попробовал второй wget с сервера, чтобы он совершал обход по сети.
Себпик,
да? Вы не можете набрать wget serverseb.com с serverseb и заставить его совершить поездку в оба конца без какой-либо изворотливой магии маршрутизации iptables. Пожалуйста, вставьте вывод traceroute mydomain.comс удаленного компьютера. Вы можете ** из последних двух октетов последнего (серверного) IP для конфиденциальности.
Иш
отредактировано с помощью traceroute
sebpiq

Ответы:

24

Если ваш сервер прослушивает только интерфейс localhost, вы не сможете получить к нему доступ с удаленного компьютера. Похоже, это ваша основная проблема, поскольку в выводе netstat указан только 127.0.0.1:3000.

Вам также необходимо убедиться, что mydomain.com разрешает правильный IP-адрес для вашей машины, так что подключение к нему приведет к обмену данными с внешним интерфейсом этой машины.

Добей
источник
Я могу подключиться к машине по ее имени, так что я думаю, что разрешение имени здесь не проблема. Как я могу сделать так, чтобы сервер слушал откуда угодно?
Себпик
1
@sebpiq Это разрешение зависит от программы. Вам необходимо привязать слушателя программы к нужному интерфейсу по имени { eth0или что-то в этом роде), IP-адресу (192.168.1.99 или что-то в этом роде) или MAC-адресу. Это зависит от программы.
Восстановить Монику - Jul--
тьфу ... звучит безумно: S Я постараюсь гуглить об этом. Мой сервер - это node.js, поэтому я проверю, есть ли информация о том, к какому интерфейсу мне нужно подключиться.
Sebpiq
Дааааа !!! @ObsessiveFOSS и dobey большое спасибо! Мой сервер node.js фактически только слушал на localhost. Я не знал, что это так, и ни в одном учебнике об этом не говорилось.
Себпик,
@sebpiq Нет проблем. :-)
Восстановить Монику - Jul--
13

У меня недавно была эта проблема с HTTPS-сервером nodejs, и ее решением было не использовать «localhost», «127.0.0.1» или даже доменное имя. Это было использовать "0.0.0.0"

Я считаю, что это действует как подстановочный знак, теперь позволяет публичное разрешение через доменное имя, и это также работает с "localhost"

Изменить: Вот ссылка на страницу о сбое сервера на тему 0.0.0.0: /server/78048/whats-the-difference-between-ip-address-0-0-0-0-and- 127-0-0-1

Сами Фуад
источник
Используйте "0.0.0.0", где именно?
Adaephon
@Adaephon В моем случае я создал веб-сервер на базе Node. Я должен был изменить: }).listen(3000, '127.0.0.1'); чтобы }).listen(3000, '0.0.0.0'); в моем коде.
Сами Фуад
@Adaephon Так что я не уверен, какая это была помощь, но везде, где вы определяете IP / имя хоста, попробуйте вместо этого 0.0.0.0.
Сами Фуад
Можете ли вы посетить мой пост? stackoverflow.com/questions/37922804/…
Kar19
1
0.0.0.0 (или, вернее, двоичное представление 0) рассматривается как прослушивание каждого с точки зрения интерфейса сокета. Вы можете указать другой IP-адрес, и он будет прослушивать только интерфейс, на котором у вас есть этот IP-адрес. Например, если вы дадите 127.0.0.1, вы можете получать соединения только с 127. *. *. * IP-адресов (действительно localhost) или с других компьютеров с серьезно испорченными таблицами маршрутизации, которые будут иметь доступ к вашим для 127.0.0.1 (чтобы проверить это). последний случай!)
Пол Стелиан
3

Есть ли вероятность того, что вы используете AWS или другие облачные сервисы? В этом случае порт должен быть открыт на уровне конфигурации Inctance (OS) или после. В частности, в AWS вы должны искать «Группы безопасности», где вы должны открыть доступ к порту 3000

Гдето Якутский
источник