перейти к содержанию

Обработка IPv4-адресов, сопоставленных с IPv6, в Node.js: подробное практическое руководство

Привет! Если вы создаете приложения с использованием Node.js, скорее всего, вы в конечном итоге столкнетесь с адресами IPv4, сопоставленными с IPv6. Эти странные на вид адреса вроде ::ffff:192.168.1.1 позволяют хостам IPv4 и IPv6 обмениваться данными, но при неправильном обращении могут возникнуть проблемы.

В этом подробном руководстве я объясню, что это за адреса, почему они существуют, как их обнаружить, а также расскажу о лучших практиках их обработки в Node.js, основанных на моем пятилетнем опыте работы экспертом по парсингу веб-страниц.

К концу у вас будут все знания, необходимые для правильной обработки этих необычных адресов в ваших приложениях Node.js!

История и причины появления адресов IPv4, сопоставленных с IPv6

Во-первых, давайте кратко вспомним историю между IPv4 и IPv6.

Исходная версия Интернет-протокола 4 (IPv4) существует с 1980-х годов. IPv4 использует 32-битные адреса, что дает около 4 миллиардов возможных адресов.

Тогда 4 миллиардов адресов казалось достаточным. Однако с массовым ростом Интернета, смартфонов и устройств IoT мы почти исчерпали адресное пространство IPv4. Большинство адресов IPv4 уже выделено.

Чтобы решить эту проблему, в 6-х годах был создан Интернет-протокол версии 6 (IPv1990). Он использует 128-битные адреса, что позволяет использовать примерно 340 ундециллионов возможных адресов. Это более 340 триллионов триллионов триллионов адресов, что гарантирует, что мы не исчерпаем их снова.

Однако полный переход с IPv4 на IPv6 требует времени. Сети и приложения необходимо обновить. Согласно статистике Google по IPv6, по состоянию на 2024 год только около 30% пользователей получают доступ к Google через IPv6. Остальные по-прежнему используют IPv4.

Вот тут-то и появляются адреса IPv4, сопоставленные с IPv6. Они служат мостом между двумя протоколами во время переходного периода.

Вот несколько примеров того, как адреса IPv4, сопоставленные с IPv6, облегчают связь:

  • Клиент только с IPv6 может подключаться к серверу только с IPv4, используя IPv4-адрес, сопоставленный с IPv6. Пакеты IPv6 от клиента преобразуются в IPv4.

  • Клиент только IPv4 может подключаться к серверу только IPv6 путем преобразования адреса IPv4 в сопоставленный адрес IPv6.

  • Два хоста IPv6 могут использовать адреса, сопоставленные с IPv4, для обеспечения совместимости со старыми приложениями, поддерживающими только IPv4.

По данным отслеживания статистики IPv6 компании Akamai, 25% запросов от клиентов IPv6 используют адреса, сопоставленные с IPv4, для подключения к серверам, поддерживающим только IPv4.

Таким образом, адреса IPv4, сопоставленные с IPv6, обеспечивают обратную совместимость и позволяют двум протоколам взаимодействовать во время перехода.

Теперь, когда мы рассмотрели историю и причины их существования, давайте посмотрим, как обнаружить адреса IPv4, сопоставленные с IPv6, в Node.js.

Обнаружение адресов IPv4, сопоставленных с IPv6, в Node.js

При написании приложений Node.js нам необходимо правильно обнаруживать и обрабатывать адреса IPv4, сопоставленные с IPv6, всякий раз, когда они появляются.

Вот 3 распространенных способа их идентификации:

1. Проверьте формат адреса.

Адреса IPv4, сопоставленные с IPv6, имеют следующий формат:

::ffff:IPv4-address

Например:

::ffff:192.168.1.1

Мы можем проверить, соответствует ли данный IP-адрес этому шаблону, используя регулярное выражение:

const isIPv4MappedIPv6 = (ip) => {
  return /^::ffff:/.test(ip); 
};

isIPv4MappedIPv6(‘::ffff:192.168.1.1‘); // true

Это проверяет, начинается ли адрес с требуемого ::ffff: приставка.

2. Используйте сетевой модуль Node.js.

Node.js net модуль содержит полезные методы для проверки типов IP-адресов:

const net = require(‘net‘);

net.isIPv4(‘192.168.1.1‘); // true 
net.isIPv6(‘::1‘); // true
net.isIPv4MappedIPv6(‘::ffff:192.168.1.1‘); // true

Мы можем использовать net.isIPv4MappedIPv6() для обнаружения адресов IPv4, сопоставленных с IPv6.

3. Используйте сторонние модули IP-адресов.

Существует несколько хороших модулей манипулирования IP-адресами, например ipaddr.js и айпи адрес.

Например, с ipaddr.js:

const ipaddr = require(‘ipaddr.js‘);

const ip = ‘::ffff:192.168.1.1‘; 

ipaddr.parse(ip).kind(); // ‘ipv6‘
ipaddr.parse(ip).isIPv4MappedAddress(); // true

Эти модули обеспечивают полную поддержку работы с IP-адресами.

Подводя итог, мы можем использовать регулярные выражения, встроенные модули Node.js или сторонние библиотеки для обнаружения адресов IPv4, сопоставленных с IPv6.

Далее давайте рассмотрим некоторые способы правильной обработки этих адресов в нашем коде.

Обработка адресов IPv4, сопоставленных с IPv6, в Node.js

Как только мы обнаружили IPv4-адрес, сопоставленный с IPv6, нам необходимо обработать его соответствующим образом.

Вот 4 распространенных метода, которые я использовал для борьбы с ними:

1. Преобразование в адрес IPv4.

Мы можем преобразовать адрес IPv4, сопоставленный с IPv6, в стандартный адрес IPv4 следующим образом:

const getIPv4 = (ip) => {
  if (net.isIPv4MappedIPv6(ip)) { 
    return ip.slice(-7); // remove ‘::ffff:‘ prefix
  }

  return ip;
};

getIPv4(‘::ffff:192.168.1.1‘); // ‘192.168.1.1‘ 

Это упрощает работу с адресом как с обычным IPv4-адресом.

2. Используйте модуль IP-адреса.

Сторонние IP-модули, такие как айпи адрес имеют встроенные утилиты для обработки преобразования:

const IP = require(‘ip-address‘);

const ip = IP ‘::ffff:192.168.1.1‘;

ip.correctForm(); // ‘192.168.1.1‘

3. Сохраните адрес IPv6 и IPv4.

В некоторых случаях нам может потребоваться сохранить как IPv6, так и извлеченные адреса IPv4:

const record = {
  ip6: ‘::ffff:192.168.1.1‘,
  ip4: ‘192.168.1.1‘ 
};

Это делает оба формата удобными.

4. Нормализуйте все на IPv6.

Мы можем нормализовать все адреса до IPv6 для обеспечения согласованности:

const normalized = ‘::ffff:192.168.1.1‘; 

Лучший подход зависит от конкретных требований приложения.

Таким образом, у нас есть несколько хороших вариантов обработки IPv4-адресов, сопоставленных с IPv6, в приложениях Node.js.

Далее мы рассмотрим некоторые распространенные ошибки и проблемы, которые могут возникнуть, если адреса IPv4, сопоставленные с IPv6, не обрабатываются должным образом.

Распространенные проблемы, вызванные адресами IPv4, сопоставленными с IPv6

За прошедшие годы я видел, как многие разработчики сталкивались с проблемами, связанными с неправильной обработкой адресов IPv4, сопоставленных с IPv6.

Вот 5 распространенных проблем, с которыми я столкнулся:

1. Предполагая, что все адреса IPv4.

Одной из ошибок является предположение, что все IP-адреса по умолчанию имеют IPv4. С ростом распространения IPv6 это предположение в конечном итоге сломает ситуацию.

Прежде чем обрабатывать адрес, всегда проверяйте, может ли это быть IPv6, используя методы обнаружения, описанные ранее.

2. Невозможность проверки ввода адреса.

Еще одна проблема, с которой я столкнулся, — это невозможность проверки ввода IP-адреса перед работой с ним. Такой код подвержен ошибкам:

// UNSAFE - No Input Validation!

const ip = request.ip;

console.log(ip.slice(-7)) // likely error!

Ввод мусора передан в .slice() может легко привести к сбою приложения.

Всегда сначала проверяйте, что введенный IP-адрес имеет правильный формат:

const net = require(‘net‘);

const ip = request.ip;

if (!net.isIP(ip)) {
  throw new Error(‘Invalid IP address‘);
}

// Proceed with processing IP...

3. Неправильное преобразование адресов, сопоставленных с IPv4.

Я отладил проблемы, при которых разработчики пытались неправильно преобразовать адреса, сопоставленные с IPv4, в IPv4:

// Problematic Conversion Logic

const ip = ‘::ffff:192.168.1.1‘;
const ipv4 = ip.replace(‘::ffff:‘, ‘‘); // INCORRECT!

ipv4; // ‘:192.168.1.1‘ (invalid ipv4 address)

Вместо слепого манипулирования строками используйте правильную логику синтаксического анализа и преобразования, предоставляемую Node.js или таким модулем, как ipaddr.js.

4. Библиотеки без поддержки IPv6

Многие старые модули Node.js были написаны до внедрения IPv6 и не имеют надлежащей поддержки. Я столкнулся с проблемами при использовании модулей, которые блокировали вход IPv6.

По возможности используйте актуальные версии модулей. Также сначала проверьте поддержку обработки IPv6.

5. Забываем протестировать IPv6

Наконец, ненадлежащее тестирование приложений является обычным явлением. Часто IPv4 тестируется хорошо, но поддержкой IPv6 пренебрегают.

Обязательно протестируйте IPv4, IPv6 и IPv4-адреса, сопоставленные с IPv6, чтобы выявить любые проблемы на ранней стадии.

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

Теперь давайте рассмотрим некоторые рекомендации, позволяющие избежать этих проблем.

Рекомендации по обработке адресов IPv4, сопоставленных с IPv6

Основываясь на моем многолетнем опыте создания и поддержки крупных приложений Node.js, вот 8 лучших практик по работе с IPv4-адресами, сопоставленными с IPv6:

1. Всегда проверяйте введенные данные

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

2. Используйте сетевой модуль Node.js или сторонние библиотеки.

Вместо того, чтобы пытаться вручную анализировать и обрабатывать IP-адреса, воспользуйтесь утилитами Node.js. net или сторонние модули IP-адресов. Они возьмут на себя все тонкости за вас.

3. Имейте четкую стратегию IPv4/IPv6.

Определите четкий подход к обработке адресов IPv4, IPv6 и адресов, сопоставленных с IPv4, в вашем приложении. Не рассматривайте их как особые случаи повсюду.

4. Абстрактный код обработки IP-адреса

Держите код анализа и обработки IP абстрагированным в повторно используемых модулях/функциях. Не распространяйте его по всей своей кодовой базе.

5. Сохраняйте исходное значение адреса до тех пор, пока оно не понадобится.

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

6. Рассмотрите возможность сохранения обеих версий адреса.

В некоторых случаях полезно хранить форматы IPv4 и IPv6. Оцените, имеет ли это смысл для вас.

7. Тщательно протестируйте IPv4 и IPv6.

Обязательно тщательно протестируйте весь код обработки IP-адресов с входными данными, сопоставленными с IPv4, IPv6 и IPv4. Проведите автоматические тесты, чтобы предотвратить проблемы в будущем.

8. Постоянно обновляйте зависимости

Используйте последние версии Node.js и модули, такие как ipaddr.js, чтобы воспользоваться преимуществами улучшенной обработки IPv6.

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

Теперь давайте рассмотрим пример приложения Node.js, демонстрирующий хорошую обработку IPv4-адресов, сопоставленных с IPv6.

Пример приложения Node.js с правильной обработкой IPv4 с сопоставлением IPv6

Вот пример приложения Node.js Express, которое правильно обрабатывает адреса IPv4, сопоставленные с IPv6:

// app.js

const express = require(‘express‘);
const ipaddr = require(‘ipaddr.js‘); 

const app = express();

// Validation middleware
app.use((req, res, next) => {

  if (!net.isIP(req.ip)) {
    return res.status(400).send(‘Invalid IP address‘);
  }

  next();

});

// Normalization middleware
app.use((req, res, next) => {

  let ip = req.ip;

  if (net.isIPv4MappedIPv6(ip)) {
    ip = ipaddr.parse(ip).toIPv4Address(); 
  }

  req.normalizedIp = ip;

  next();

});

app.get(‘/‘, (req, res) => {

  // Use normalized IP address  
  const ip = req.normalizedIp;

  res.send(`Your IP is ${ip}`);

});

app.listen(3000); 

Вот что он делает:

  • Проверяет IP-адреса
  • Нормализует IPv4, сопоставленный с IPv6, в IPv4.
  • Сохраняет нормализованный IP-адрес объекта запроса.
  • Безопасно использует нормализованный IP в обработчиках

Это обеспечивает правильную обработку во всем приложении.

Те же принципы применимы к любому более крупному приложению Node.js. Ключом является последовательная проверка, нормализация и хранение IP-адресов.

Заключение

Переход от IPv4 к IPv6 является неизбежной частью разработки современных приложений.

В течение этого переходного периода адреса IPv4, сопоставленные с IPv6, объединили два протокола.

В своих приложениях Node.js обязательно проверяйте, обнаруживайте и обрабатывайте адреса IPv4, сопоставленные с IPv6. Встроенный net Модуль в сочетании с такой библиотекой, как ipaddr.js, упрощает задачу.

Я надеюсь, что это подробное руководство по IPv4-адресам, сопоставленным с IPv6, поможет вам правильно использовать их в своих приложениях Node.js! Дайте мне знать, если у вас есть еще вопросы.

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *