IPv6 MAC 轉換成 Link-local IP


支援IPv6的介面都會有一個位址稱為link-local位址,也就是以FE80開頭的IP,該IP只能在同網段內活動,不能跨網段。

link-local是由網卡的MAC去換算出來的,千萬不要像我這樣傻傻的,沒有先了解,就手動指定IP,還怪Linux怎麼會無法修改。

[oracle@oel62 ~]$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 08:00:27:9A:A8:28
          inet addr:192.168.56.200  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fec0::a00:27ff:fe9a:a828/64 Scope:Site
          inet6 addr: fe80::a00:27ff:fe9a:a828/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6270 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4327 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:606953 (592.7 KiB)  TX bytes:900914 (879.7 KiB)
         
由上面的Scope可以知道,link-local IP是 fe80::a00:27ff:fe9a:a828,下面是換算的過程:
         
MAC             08:00:27:9A:A8:28
Step1           08:00:27:FF:FE:9A:A8:28
Setp2           0A:00:27:FF:FE:9A:A8:28 
Setp3           fe:80:00:00:00:00:00:00:0A:00:27:FF:FE:9A:A8:28
Setp4           fe80:0000:0000:0000:0A00:27FF:FE9A:A828    --> Link_local IP

Step1:
  將十六進位值 FF:FE 插入MAC位址的中間,也就是第三位元組與第四位元組中間。

Step2:
  將MAC用來識別Universal或Local的那個位元做補數(complement)的動作,也就是將"08"這個byte由左到右的倒數第二個 bit 從原來的"0"轉成 "1"。
  08(16) => 0000 1000(2) => 0000 1010(2) => 0A(16)

Setp3:
  在最前面加上fe:80:00:00:00:00:00:00。

Setp4:
  依照IPv6的格式重新排列,就可以得到fe80::a00:27ff:fe9a:a828的IP位址。