Как конвертировать IPv6-адрес в IPV4-адрес в nodejs Expressjs?

Объект запроса NODEJS предоставляет этот метод req.connection.remoteAddres для получения IP-адреса клиента, но он дает адрес в формате IPV6, как мне преобразовать его в формат IPV4, который является более читабельным?

2 ответа

Проблема в том, что по умолчанию NodeJS прослушивает IPv6, поэтому возвращает адреса IPv6. Если вы скажете ему слушать только IPv4, вы получите только IPv4-адреса, и они будут в ожидаемом вами формате (нет ::ffff: приставка).

Как вы это делаете, зависит от библиотеки, которую вы используете, но обычно, когда вы указываете порт для прослушивания, вы также можете указать хост / интерфейс / IP, и здесь вы должны ввести 0.0.0.0 сказать "только IPv4" вместо значения по умолчанию :: что означает IPv6+IPv4.

Например, с библиотекой сокетов NodeJS:

      server.listen({
    port: 80,
    host: '0.0.0.0',
})

Для WebSockets:

      ...listen(80, '0.0.0.0');

Если адрес IPv6 начинается с ::ffff: затем клиент связывается с IPv4 с приложением IPv6. В этом случае оставшаяся часть адреса является адресом IPv4. Это может быть написано как ::ffff:10.11.12.13, в этом случае вы можете легко увидеть адрес IPv4. Это также можно записать как ::ffff:0a0b:0c0d или же ::ffff:a0b:c0d, в этом случае вам нужно преобразовать последнюю часть адреса из шестнадцатеричной в десятичную.

Если адрес IPv6 не начинается с ::ffff: тогда клиент действительно обменивается данными с IPv6, и преобразование невозможно, поскольку IPv4 и IPv6 - это разные протоколы с разными адресами. Системы могут иметь только IPv4, только IPv6 или их комбинацию. Вы не сможете узнать это, посмотрев на адрес.

Другие вопросы по тегам