Как использовать оболочку для получения 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инструмент Питера Биерингера.

Следующая команда создает локальный IPv6-адрес ( 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находится в основном хранилище.

Dubu
источник
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.

HBruijn
источник
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
rubo77
источник
0

Я должен отдать дань уважения @ rubo77 выше за чистый ответ (если не считать printf) выше, который я искал.

Это добавляет немного sed к:

(а) исключить любые начальные нули в каждом 16-битном фрагменте; и

(б) исключить любые дополнительные нулевые фрагменты в начале 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 оставляет только один дополнительный фрагмент, который может быть полностью нулевым, - последний - который сценарий выше добавляет обратно в качестве единого нуля. Для других префиксов может потребоваться оставить один ноль между двумя двоеточиями.

Headbank
источник
Вы правы, спасибо - я вернулся и оставил штрафа @ rubo77 в printfодиночестве и вместо этого сделал дополнительные вещи в sed.
Headbank