Як використовувати оболонку для отримання адреси IPv6 з MAC-адреси?


11

Ми знаємо, що ми можемо використовувати MAC-адресу для створення ідентифікатора інтерфейсу, наприклад, для локальної IPv6-адреси посилання, яка повинна бути унікальною у Мережі.

На зображенні показаний спосіб зробити це:

Створіть ідентифікатор інтерфейсу з MAC-адреси

Мої запитання:

  • Як я можу створити IPv6 адресу з MAC за допомогою awkабо sed?
  • АЛЕ чи є якась команда, яка дає мені локальну IPv6 адресу посилання для певного MAC (щось подібне createIPv6 myMAC)?

Я трохи перефразував ваше запитання (очікуємо на розгляд). IPv6 адреси не витягуються з MAC-адрес, а створюються. І тут ви маєте справу лише з частиною ідентифікатора інтерфейсу (останній 64 біт) адреси IPv6. Але я не впевнений: Ви хочете лише ідентифікатор інтерфейсу або цілу IPv6 адресу? Відредагуйте, якщо я вас правильно не зрозумів.
Дубу

@Dubu, Дякую за редагування, я хочу всю IPv6 адресу.
Нідаль

Відповіді:


10

Якщо ви хочете створити цілу IPv6 адресу з MAC (і заданого префікса), ви можете скористатися чудовим ipv6calcінструментом Пітера Бірінгера.

Наступна команда створює локальну IP-адресу ( fe80::префікс) локальної посилання з MAC-адреси:

$ ipv6calc --action prefixmac2ipv6 --in prefix+mac --out ipv6addr fe80:: 00:21:5b:f7:25:1b
fe80::221:5bff:fef7:251b

Ви можете залишити більшість опцій далеко і дозволити команді здогадуватися, що робити:

$ ipv6calc --in prefix+mac fe80:: 00:21:5b:f7:25:1b
No action type specified, try autodetection...found type: prefixmac2ipv6
fe80::221:5bff:fef7:251b

Для дистрибутивів Debian ipv6calcзнаходиться в головному сховищі.


4

З IPv6 Вікіпедії запис більш текстовий опис:

64-розрядний ідентифікатор інтерфейсу найчастіше отримується з 48-бітної MAC-адреси.

MAC-адреса 00: 0C: 29: 0C: 47: D5 перетворюється на 64-розрядний EUI-64, вставляючи FF: FE посередині: 00: 0C: 29: FF: FE: 0C: 47: D5.

Таким чином , замінивши третину :з :FF:FE:слід зробити трюк:

echo  00:0C:29:0C:47:D5 | sed s/:/:FF:FE:/3
00:0C:29:FF:FE:0C:47:D5

Не маю уявлення, чи властивий цей синтаксис GNU sed.


В роботі:

Перетворіть це в біти:

for HEX in $(tr ":" " " <<< 00:0C:29:FF:FE:0C:47:D5) 
  do 
    printf "%08d " $(bc <<< "ibase=16;obase=2;$HEX") 
  done

має призвести до того, що біти 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101залишають лише гортання біта №7.


1
як щодо зворотного 7-го біта!
Нідаль

Ах U / L біт, хороший пункт!
HBruijn

3
#! /usr/bin/env python
import sys
n=[int(x, 16) for x in sys.argv[1].split(":")]
print "fe80::%02x%02x:%02xff:fe%02x:%02x%02x" % tuple([n[0]^2]+n[1:])

0

Ви можете створити функцію bash (і помістити її у свою ~/.bashrc), яка використовує IFSдля розділення MAC-адреси на 6 груп, розділених двокрапкою, та їх збирання. Вам також знадобиться перевернути 7-й найзначніший біт, тобто біт 1 першого байти:

mac_to_ipv6_ll() {
    IFS=':'; set $1; unset IFS
    echo "fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}

Приклад використання:

$ mac_to_ipv6_ll 12:34:56:78:90:12
fe80::1034:56ff:fe78:9012

0

Я повинен дати kudos на @ rubo77 вище для чистої оболонки (якщо ви не рахуєте printf) відповіді вище, яку я шукав.

Це додає трохи sed до:

(a) вилучити будь-які провідні нулі у кожному 16-бітовому фрагменті; і

(b) ухиляються від будь-яких подальших цілих нульових фрагментів на початку IID

... згідно з загальними умовами щодо стислості адрес.

mac_to_eui64() {
 IFS=':'; set $1; unset IFS
 echo "fe80::$(printf %x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" |
  sed -E 's/:0+/:/g; s/:{3,}/::/; s/:$/:0/'
}

Зауважте, що якщо ви хочете змінити це на інші (довільні) префікси, які ви могли б використовувати, оскільки EUI-64 можна використовувати в будь-якому обсязі (хоча радимо не використовувати його для глобальних адрес з міркувань конфіденційності), вам знадобиться трохи більш складний сценарій sed. Це тому, що fe80::префікс вже містить три нульові відрізки (пронесені до подвійної двокрапки), що примикають до початку IID. Таким чином, навіть якщо перший шматок IID - це цілі нулі (тобто, якщо MAC почався з 02:00), він також буде пропущений. Формат EUI-64 залишає лише ще один шматок, який міг би бути абсолютно нульовим - останній - який сценарій вище додає як єдиний нуль. Іншим префіксам може знадобитися один, щоб залишити один нуль між двома двокрапками.


Ви маєте рацію, дякую - я пішов назад і залишив @ rubo77 чудово printfі зробив додаткові речі в sed.
Headbank
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.