Порт, здається, відкритий, але зв’язок відмовився


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

Будь-яка ідея, що я повинен спробувати далі ???

EDIT

Ось що дає 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

Вимкнути ufw, спробуйте ще раз. Якщо це не працює, між віддаленим комп'ютером та вашим сервером є ще один брандмауер / пристрій.
Останній

Я вже спробував .. не вирішив :(
sebpiq

"між віддаленим комп'ютером та вашим сервером є ще один брандмауер / пристрій." : це дуже малоймовірно. Я спробував другий wget з сервера, щоб він здійснив зворотну поїздку по мережі.
sebpiq

так? Ви не можете набрати wget serverseb.com від serverseb і змусити його здійснити зворотну поїздку без магічних магій маршрутизації iptables. Будь ласка, вставте вихід traceroute mydomain.comз віддаленого комп'ютера. Ви можете ** вилучити останні два октети останнього (серверного) IP для конфіденційності.
Останній

відредаговано за допомогою traceroute
sebpiq

Відповіді:


24

Якщо ваш сервер слухає лише інтерфейс localhost, ви не зможете отримати доступ до нього з віддаленого комп'ютера. Це, як видається, є вашою основною проблемою, оскільки у вашому неттостаті виведено лише 127.0.0.1:3000.

Вам також потрібно буде переконатися, що "mydomain.com" відповідає правильній IP-адресі для вашої машини, так що підключення до неї призведе до зв'язку з зовнішнім інтерфейсом цієї машини.


Я можу сш на машину, використовуючи її ім'я, тому я думаю, що роздільна здатність імені тут не є проблемою. Як зробити так, щоб сервер слухав з будь-якого місця?
sebpiq

1
@sebpiq Ця роздільна здатність залежить від програми. Вам потрібно прив’язати слухача програми до потрібного інтерфейсу на ім'я { eth0, або щось подібне), IP-адресу (192.168.1.99 чи щось подібне) або MAC-адресу. Це залежить від програми.
Відновіть Моніку - ζ--

uugh ... звучить божевільно: S Я спробую з цього приводу гугл. Мій сервер node.js, тому я перевірю, чи є інформація про те, до якого інтерфейсу потрібно підключитися.
sebpiq

Yeepee !!! @ObsessiveFOSS і добей спасибі ТАКОЖ! Мій сервер node.js насправді слухав лише у localhost. Я не знав, що це робиться так, і жоден підручник не згадував про це.
sebpiq

@sebpiq Немає проблем. :-)
Відновіть Моніку - ζ--

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 Добре в моєму випадку я створив веб-сервер на основі вузла. Мені довелося змінити: }).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-ти. останній випадок!)
Пол Стеліан

3

Чи є шанс, що ви використовуєте AWS або будь-які інші хмарні сервіси? У цьому випадку порт повинен бути відкритий на рівні конфігурації (OS) або після нього. Зокрема, в AWS вам слід шукати "Групи безпеки", де вам слід відкрити доступ до порту 3000

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.