如何使用Shell从MAC地址派生IPv6地址?


11

我们知道我们可以使用MAC地址来创建接口标识符,例如,对于本地链路的IPv6地址,该标识符在网络中应该是唯一的。

该图显示了执行此操作的方法:

从MAC地址创建接口标识符

我的问题是:

  • 如何使用awk或从MAC创建IPv6地址sed
  • 或者是否有任何命令可以为我提供特定MAC的链接本地IPv6地址(类似createIPv6 myMAC)?

我对您的问题作了一些表述(有待审核)。IPv6地址不是从MAC地址提取的,而是创建的。在这里,您仅处理IPv6地址的接口标识符部分(最后64位)。但是我不确定:您只想要接口标识符还是整个IPv6地址?如果我对您的理解不正确,请重新编辑。
Dubu 2014年

@Dubu,感谢您的编辑,我想要整个IPv6地址。
Nidal

Answers:


10

如果要从MAC(和给定前缀)创建整个IPv6地址,则可以使用ipv6calcPeter Bieringer 出色的工具。

以下命令fe80::从MAC地址创建一个本地链接的IPv6地址(前缀):

$ 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 Wikipedia条目中,提供了更多文字说明:

64位接口标识符最通常是从其48位MAC地址派生的。

通过在中间的00:0C:29:FF:FE:0C:47:D5中插入FF:FE,将MAC地址00:0C:29:0C:47:D5转换为64位EUI-64。

因此,在更换第三::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位呢!
Nidal

啊,U / L位,好点!
HBruijn 2014年

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

我必须对上面的@ 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,因为EUI-64可以在任何范围内使用(尽管出于隐私原因,建议不要将其用于全局地址),但您需要更复杂的sed脚本。这是因为该fe80::前缀已经包含三个零块(消除到双冒号),这些零块与IID的开头相邻。因此,即使IID的第一个块为全零(即,MAC以开头02:00),也将被忽略。EUI-64格式仅剩下一个可能为全零的块-最后一个-上面的脚本将其加回为单个零。其他前缀可能需要一个在两个冒号之间留下单个零。


你是对的,谢谢-我回去了,printf独自离开了@ rubo77的罚款,而是在sed中做了其他工作。
总行
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.