Одна адреса, багато способів її записати
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 і каже про це під полем, а не вгадує мовчки, лишаючи вам зʼясовувати це згодом.
Сюди нічого не доходить
Усе переведення відбувається у вашому браузері. Немає ані форми, що надсилається, ані запиту у фоні, ані рядка в наших логах — ми не знаємо, які адреси ви дивилися. Якщо волієте перевірити, а не вірити на слово: відкрийте сторінку, відʼєднайте мережу й користуйтеся далі.