Как конвертировать 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 или их комбинацию. Вы не сможете узнать это, посмотрев на адрес.