Назад | Перейти на главную страницу

Невозможно получить доступ к серверу Ubuntu с адреса eth0 на том же компьютере

У меня есть виртуальная машина Ubuntu 16.04, и когда я запускаю curl http://192.168.254.42 (IP-адрес eth0) он быстро отвечает отказом в соединении. Однако сервер определенно слушает 0.0.0.0 и могут быть доступны другим компьютерам в сети, используя тот же адрес в браузере. curl http://192.168.254.1 возвращает html страницы администратора моего маршрутизатора.

Конечно, обычно это не будет блокировщиком, но это также означает, что клиенты VPN, подключенные к серверу, не могут получить доступ к самому серверу, используя IP-адрес eth0 (который используют клиенты в сети). Я никогда раньше не сталкивался с этой проблемой, и Google предлагает очевидное «прослушивание на локальном хосте», что здесь не так.

Я могу пинговать ip-адрес eth0 с терминала (т.е. пинговать сам), и он отвечает правильно. Трассировка от VPN-клиента также выглядит правильно. Но доступ к http://192.168.254.42 немедленно отвечает отказом в соединении.

Вот это netstat -tulpn вывод.

$ netstat -tulpn | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN      5724/index-lib
$ netstat -tulpn | grep :85
tcp6       0      0 :::85                   :::*                    LISTEN      1212/server.js
$ netstat -tulpn | grep :81
tcp6       0      0 :::81                   :::*                    LISTEN      1515/apache2

Установка порта 86 работает. Другой сервер NodeJS также работает на 85-м порту, и к нему можно получить доступ. Так что это не проблема со стороной NodeJS.


Старая информация

Веб-сервер - это единственный экземпляр HTTP-сервера NodeJS v10.16.3, который прослушивает 0.0.0.0.

Слушая 192.168.254.42 тоже не работает.

Что еще более важно, веб-сервис Apache, прослушивающий порт 81, может быть легко доступен.

Chrome говорит ERR_CONNECTION_FAILED, но делает это практически мгновенно.

Правила iptables не установлены.

Процесс NodeJS прослушивает порт 85, и к нему можно получить доступ таким же образом.

Вот это netstat -tulpn вывод.

$ netstat -tulpn | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN      5724/index-lib
$ netstat -tulpn | grep :85
tcp6       0      0 :::85                   :::*                    LISTEN      1212/server.js
$ netstat -tulpn | grep :81
tcp6       0      0 :::81                   :::*                    LISTEN      1515/apache2

Чтобы проверить это, я использую команду

$ curl http://192.168.254.42
curl: (7) Failed to connect to 192.168.254.42 port 80: Connection refused

Порт 81 и 85 возвращают ожидаемый HTML.

Настройка прослушивания порта 86 делает его доступным! Так что это не на стороне NodeJS, я не думаю.

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

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello World!');
  res.end();
}).listen(8080, 0.0.0.0);

И порт, и ip здесь не являются обязательными, поэтому, если вы хотите прослушивать порт 80, просто отключите их оба. Если вы слушаете другой порт, откажитесь от IP и позвольте Node выяснить это.

Вы упомянули сервер Apache на 81, я предполагаю, что вы пытаетесь подключиться к Node напрямую, и вы не проходите через Apache, чтобы добраться до Node.

Если приведенное выше не помогает опубликовать соответствующий код из вашего приложения узла, cat /etc/hosts, и sudo netstat -tulpn. Если вы используете Apache, опубликуйте также соответствующие конфигурации Apache (т.е. запись виртуального хоста в /etc/apache2/sites-enabled/).

Я нашел эту строку в /etc/rc.local.

iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080

Обнаружена проблема!

В этом ответе говорится, почему правило не появилось в iptables -L: https://serverfault.com/a/685948/32875.

Есть 5 таблиц (фильтр, нат, исключение, сырье, безопасность). Ты звонишь iptables -L -t table для каждого.