npx http-server возвращает EADDRNOTAVAIL для несуществующего IP-адреса

Вопрос или проблема

Когда я запускаю ip address show, я вижу, что сетевой интерфейс loopback имеет назначенный адрес 127.0.0.1/8.

Это означает, что если я хочу использовать сетевой интерфейс loopback, я могу запустить npx http-server -a 127.X.X.X, потому что суффикс /8 подразумевает, что для использования интерфейса loopback я могу использовать любой IP-адрес, начинающийся с 127. Например: npx http-server -a 127.4.7.1.

ip address show также показывает, что сетевой интерфейс, называемый enp0s3, имеет назначенный адрес 10.0.2.15/24.

Однако, когда я пытаюсь использовать адрес, который не назначен, это приводит к ошибке. Например, npx http-server -a 10.0.2.16 возвращает ошибку:

Error: listen EADDRNOTAVAIL: address not available

Почему адрес 10.0.2.16 “недоступен”?

Что мне нужно сделать, чтобы иметь возможность использовать 10.0.2.16, когда назначен только 10.0.2.15, как в случае с 127.4.7.1?

Вы сильно неправильно понимаете роль сетевой маски.

Вы можете прослушивать адреса, привязанные к локальным интерфейсам. Сетевые маски показывают стеку TCP/IP, какие адреса являются локальными, а какие доступны только через маршрутизатор. Чтобы прослушивать IP-адрес, его нужно назначить интерфейсу.

lo и 127.0.0.0/8 являются особыми, потому что они зарезервированы для использования loopback.

10.2.0.16 “недоступен”, потому что ваша машина не владеет им. Единственные адреса, которые вы можете использовать таким образом, это те, на которые ваша машина настроена отвечать. Вы создаёте сервер, что-то, что прослушивает на определённом адресе; если ваша машина действительно не владеет этим адресом, то какая-то другая машина в вашей сети может им владеть, и если это так, сетевое оборудование может перенаправить эти пакеты прочь от вас, и вы их никогда не увидите… даже если двум машинам в одной сети разрешено иметь один и тот же IP-адрес. Причина, по которой вы можете указывать адрес таким образом, заключается в том, что машины с несколькими сетевыми интерфейсами могут иметь несколько различных IP-адресов, на которые они могут отвечать. И как упоминает vidarlo, 127.x.x.x и lo являются особыми, потому что вы можете владеть всеми этими адресами, так как они никогда не покидают вашу физическую машину.

Ответ или решение

Для решения вашей проблемы важно понять, как работают IP-адреса и интерфейсы в системах с операционной системой на базе Linux, а также почему вы получаете ошибку EADDRNOTAVAIL при попытке использовать IP-адрес, который не назначен вашей машине.

Теория

Когда вы использовали команду ip address show, вы заметили, что интерфейс loopback имеет назначенную подсеть 127.0.0.0/8. Эта подсеть является специальной и зарезервирована для задач, связанных с локальными интерфейсами (loopback). Это значит, что вы можете использовать любой адрес в диапазоне от 127.0.0.0 до 127.255.255.255 для обращения к вашей машине локально. Эти адреса всегда останутся в пределах вашей системы и недоступны извне.

Напротив, интерфейс с именем enp0s3 имеет назначенный адрес 10.0.2.15/24. Это значит, что ваша машина распознает только этот конкретный адрес как принадлежащий ей на этом интерфейсе. Маска /24 (или маска подсети 255.255.255.0) определяет, что все IP-адреса от 10.0.2.1 до 10.0.2.254 являются частью той же подсети, однако лишь 10.0.2.15 назначен вашему интерфейсу. Ваша система не может принимать пакеты, адресованные 10.0.2.16, поскольку этот адрес не назначен ни одному из её интерфейсов.

Пример

Когда вы запускаете команду npx http-server -a 127.4.7.1, сервер успешно слушает на этом адресе, так как он входит в диапазон 127.0.0.0/8, и ваша система полностью управляет этой подсетью. Однако попытка запустить npx http-server -a 10.0.2.16 приводит к ошибке, так как адрес 10.0.2.16 не является частью адресов, которыми владеет ваше устройство на интерфейсе enp0s3.

Применение

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

sudo ip addr add 10.0.2.16/24 dev enp0s3

Эта команда добавляет указанный IP-адрес к вашему интерфейсу. После этого ваш сервер сможет слушать и принимать запросы на 10.0.2.16.

Помните о возможных конфликтах IP-адресов в вашей сети. Убедитесь, что выбранный вами адрес не используется другими устройствами в вашей сети, чтобы избежать сетевых проблем.

Оцените материал
Добавить комментарий

Капча загружается...