Конвертер IP-адрес

Усі способи записати ту саму адресу. Працює в обидва боки: вставте число — отримаєте адресу. До нас не потрапляє нічого.

Число, менше за 4 294 967 296, читаємо як IPv4, більше — як IPv6. Префікс після скісної риски приймаємо й ігноруємо: ця сторінка про одну адресу, а не про блок.

Одна адреса, багато способів її записати

IP-адреса — це число. Усе інше: крапки, двокрапки, шістнадцяткові цифри — лише запис, зручний людині, а програмам ця зручність не потрібна. 8.8.8.8, 134744072, 0x08080808 і 00001000.00001000.00001000.00001000 — це ті самі 32 біти, записані чотирма способами. База, яка тримає адреси числами, фаєрвол, який пише їх у лог шістнадцятковими, і таблиця, яка «допомогла» й перетворила їх на числа, говорять про одне й те саме.

Саме для цього сторінка й існує: показати з наявної форми всі решту, і в обидва боки. Вставте адресу — отримаєте число; вставте число — отримаєте адресу. Нікуди нічого не надсилається: переведення робить JavaScript у вкладці, яку ви зараз бачите.

Форми запису й де кожну з них зустрічають

Десяткове
Адреса одним цілим числом. Саме так її зберігає база, коли колонка описана як INT UNSIGNED, а не рядком: числа порівнюються й сортуються правильно, тоді як рядки ставлять 10.0.0.2 після 10.0.0.10. Це ж повертає inet_aton() та його аналоги. Якщо у вигрузці чи в лозі на місці адреси стоїть голе девʼяти- або десятизначне число — причина саме ця.
Шістнадцяткове
Дві цифри на октет для IPv4 і тридцять дві для IPv6. Дампи пакетів, повідомлення ядра й /proc/net/tcp у Linux говорять шістнадцятковими — причому /proc/net/tcp пише байти у зворотному порядку на little-endian машинах, і на цьому легко втратити годину.
Двійкове
Форма, на яку варто подивитися рівно один раз — коли підмережі перестають складатися в голові. Побачити, де межа /26 проходить усередині третього октета, — це те, після чого арифметика префіксів із завченої таблиці стає очевидною.
Вісімкове
Показуємо як застереження, а не як зручність — окремий розділ нижче.
IPv6 повністю і скорочено
Та сама адреса в повному записі (2001:0db8:0000:0000:0000:0000:0000:0001) і в канонічному (2001:db8::1). Скорочена форма — за RFC 5952: нижній регістр, без провідних нулів, :: стискає найдовшу послідовність нульових груп. Програма, яка порівнює адреси як текст, а не як числа, вважатиме ці два рядки різними — тому списки доступу треба будувати з розібраних адрес, а не з рівності рядків.
IPv4-mapped IPv6
::ffff:8.8.8.8. Сокет, відкритий як IPv6, але зʼєднаний з IPv4-клієнтом, віддає адресу співрозмовника саме в цій формі — тому IPv4-адреса раптом зʼявляється в лозі з двокрапками. Якщо ваш білий список звіряється лише з крапковим записом, він цю форму не впізнає. Це справжня й часта причина «правило працює локально й не працює на проді».
Префікс 6to4
Блок 2002::/16, у який IPv4-адреса вбудована в біти 16–47. Сам механізм переходу визнано застарілим у 2015 році, публічні релеї вимкнено, але запис лишився — у старих конфігах і в трафіку від вузлів, до яких давно ніхто не заглядав.
Зона зворотного DNS
Імʼя, за яким реально живе запис PTR: 8.8.8.8.in-addr.arpa для IPv4, а для IPv6 — тридцять два півбайти у зворотному порядку під ip6.arpa. Писати таке імʼя руками — найкоротший шлях до друкарки у файлі зони, і ця друкарка не дає помилки: вона дає запит, який мовчки нічого не повертає.

Навіщо на цій сторінці вісімкова форма

Провідний нуль в октеті — не оформлення. Класична функція inet_aton() і все історично побудоване на ній (а це чимало досі працюючого коду) читає октет, що починається з 0, як вісімкове число. За цим правилом 010.1.1.1 — це 8.1.1.1. Сучасні розбирачі, зокрема ipaddress у Python і net/netip у Go, натомість такий запис відхиляють. Третя частина приймає його і читає як десяткове.

Отже, той самий рядок означає дві різні адреси або жодної — залежно від того, яка бібліотека його бачить. Це не цікавинка, а готовий будівельний блок для атаки. Якщо перевіряч прочитав 010.1.1.1 як «10.1.1.1, все гаразд», а HTTP-клієнт, який працює після нього, прочитав як 8.1.1.1, то перевірка й зʼєднання пішли в різні місця — це рівно форма обходу SSRF-фільтра. Той самий прийом працює проти чорних списків: адресу записують так, як список її не впізнає, а резолвер упізнає.

Ми показуємо вісімкову форму, щоб ви впізнавали її при зустрічі, а провідний нуль читаємо як десяткове число й одразу кажемо про це вголос. Практичне правило коротке: ніколи не пишіть провідний нуль в адресі, а адреси ззовні перевіряйте так — розберіть у число й порівнюйте числа, ніколи не порівнюйте рядки.

Число назад в адресу

Вставте голе ціле число — сторінка переведе у зворотний бік. Числа менші за 4 294 967 296 читаються як IPv4, бо саме це майже завжди має на увазі той, хто вводить число в конвертер IP; більші — як IPv6. Префікс 0x розуміємо, рядок рівно з 32 або 128 двійкових цифр — теж.

Неоднозначність тут справжня, і ми радше назвемо її, ніж сховаємо: 1 — це і 0.0.0.1 за IPv4-прочитанням, і ::1 за IPv6. Обидва законні; сторінка обирає IPv4 і каже про це під полем, а не вгадує мовчки, лишаючи вам зʼясовувати це згодом.

Сюди нічого не доходить

Усе переведення відбувається у вашому браузері. Немає ані форми, що надсилається, ані запиту у фоні, ані рядка в наших логах — ми не знаємо, які адреси ви дивилися. Якщо волієте перевірити, а не вірити на слово: відкрийте сторінку, відʼєднайте мережу й користуйтеся далі.

Часті запитання

Як перевести IP-адресу в десяткове число?

Помножити октети на їхню вагу: перший коштує 16777216, другий 65536, третій 256, останній 1 — отже 8.8.8.8 це 134744072. Вставте адресу вище, і десяткова форма зʼявиться без арифметики. Потрібна вона для зберігання й сортування: колонка бази з адресами-числами порівнює їх правильно, а текстова ставить 10.0.0.10 перед 10.0.0.2.

Чи можна перевести десяткове число назад в адресу?

Так, вставте число замість адреси. Усе менше за 4294967296 читається як IPv4, більше — як IPv6, бо той, хто вводить число в конвертер IP, майже завжди прийшов з IPv4. Шістнадцяткове з префіксом 0x і рядок рівно з 32 або 128 двійкових цифр теж розпізнаються.

Чому 010.1.1.1 не всюди означає 10.1.1.1?

Бо провідний нуль позначає вісімкове число в класичному розбирачі inet_aton() і в усьому, що на ньому побудовано: там 010 це 8, а адреса стає 8.1.1.1. Інші бібліотеки такий запис відхиляють узагалі, а треті читають як десяткове. Отже, той самий рядок означає різні адреси в різних програмах — саме так і обходять фільтри. Ніколи не пишіть провідний нуль в адресі, а перевіряйте адреси розбором у число, а не порівнянням рядків.

Що таке ::ffff:8.8.8.8 і чому воно в моїх логах?

Це форма IPv4-mapped IPv6. Сокет, відкритий як IPv6, приймаючи зʼєднання від IPv4-клієнта, віддає адресу співрозмовника саме так — тому IPv4-адреса приходить із двокрапками. Це важливо, бо білий список, який звіряється лише з крапковим записом, цю форму не впізнає: часта причина того, що правило працює на тесті й мовчки не працює на проді.

Навіщо потрібні обидві форми IPv6 — повна і скорочена?

Це та сама адреса, але не той самий рядок, і програма, яка порівнює адреси текстом, вважатиме 2001:0db8::0001 і 2001:db8::1 різними. Скорочена форма відповідає RFC 5952: нижній регістр, без провідних нулів, :: замінює найдовшу послідовність нульових груп — саме її варто зберігати й публікувати. Порівнювати ж треба розібрані адреси, а не текст.

Для чого потрібне імʼя зони зворотного DNS?

Саме там живе запис PTR: 8.8.8.8.in-addr.arpa для IPv4, а для IPv6 — тридцять два півбайти адреси у зворотному порядку під ip6.arpa. Воно потрібне, коли додаєте або розбираєте зворотні записи у файлі зони. Писати форму для IPv6 руками — надійний спосіб зробити друкарку, і збій буде мовчазний: запит просто нічого не поверне замість того, щоб повідомити помилку.

Чи корисний іще префікс 6to4?

Для побудови чогось нового — ні. Механізм переходу визнано застарілим у 2015 році, публічні релеї вимкнено, і трафік через нього більше не працює надійно. Запис показуємо тому, що він досі трапляється в старих конфігах і в трафіку від вузлів, до яких ніхто не заглядав, а вміння прочитати 2002:0808:0808::/48 як «це 8.8.8.8 у костюмі IPv6» рятує від плутанини.

Чи потрапляють адреси, які я вставляю, на ваш сервер?

Ні. Переведення робить JavaScript у вашому браузері, тож нічого не надсилається й нічого не зʼявляється в наших логах — ми не знаємо, які адреси ви переводили. Сторінка працює далі з відʼєднаною мережею, і це простий спосіб перевірити твердження самому, а не вірити на слово.

Пов'язані перевірки