MAC adresinden bir IPv6 adresi türetmek için kabuk nasıl kullanılır?


11

MAC adresini, örneğin Ağda benzersiz olması gereken bir bağlantı yerel IPv6 adresi gibi bir arayüz tanımlayıcısı oluşturmak için kullanabileceğimizi biliyoruz.

Görüntü bunu yapmanın yolunu göstermektedir:

MAC adresinden arayüz tanımlayıcısı oluşturma

Sorularım:

  • awkVeya kullanarak MAC'den nasıl IPv6 adresi oluşturabilirim sed?
  • VEYA bana belirli bir MAC (bunun gibi bir şey createIPv6 myMAC) için bağlantı yerel IPv6 adresini veren herhangi bir komut var mı?

Sorunuzu biraz yeniden ifade ettim (incelenmeyi bekliyor). IPv6 adresleri değildir çıkarılan MAC adreslerinden ama yarattı. Ve burada sadece bir IPv6 adresinin arayüz tanımlayıcı kısmı (son 64 bit) ile ilgilenirsiniz. Ama emin değilim: Sadece arayüz tanımlayıcısını mı yoksa tam bir IPv6 adresi mi istiyorsunuz? Sizi doğru anlamadıysam lütfen yeniden düzenleyin.
Dubu

@Dubu, Düzenlediğiniz için teşekkürler, IPv6 adresinin tamamını istiyorum.
Nidal

Yanıtlar:


10

Bir ipv6calcMAC'den (ve belirli bir önekten) tam bir IPv6 adresi oluşturmak istiyorsanız, Peter Bieringer'in mükemmel aracını kullanabilirsiniz .

Aşağıdaki komut fe80::bir MAC adresinden yerel bağlantı IPv6 adresi ( önek) oluşturur:

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

Seçeneklerin çoğunu uzakta bırakabilir ve komutun ne yapacağını tahmin etmesine izin verebilirsiniz:

$ 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 dağıtımları ipv6calciçin ana depodadır.


4

Gönderen IPv6 Vikipedi girişi daha metinsel açıklaması:

64 bit arabirim tanımlayıcısı en çok 48 bit MAC adresinden türetilir.

MAC adresi 00: 0C: 29: 0C: 47: D5, ortada FF: FE eklenerek 64 bit EUI-64'e dönüştürülür: 00: 0C: 29: FF: FE: 0C: 47: D5.

Üçte değiştirilmesi Yani :ile :FF:FE:hile yapmak gerekir:

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

Bu sözdiziminin GNU sed'e özgü olup olmadığı hakkında hiçbir fikrim yok.


Devam eden çalışma:

Bunu bitlere dönüştür:

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

bitlerin 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101sadece 7 numaralı bitin çevrilmesi ile sonuçlanması gerekir .


1
7. biti tersine çevirmeye ne dersiniz?
Nidal

Ah U / L biraz, iyi bir nokta!
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

MAC adresini iki nokta üstüste ayrılmış gruba bölmek ve birleştirmek için kullanılan bir bash işlevi oluşturabilir (ve bunu kendinize yerleştirebilirsiniz ~/.bashrc) IFS. Ayrıca en önemli 7. biti, yani ilk baytın 1. bitini çevirmeniz gerekir:

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

Kullanım örneği:

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

0

Ben aradığım bir saf kabuk (printf saymak sürece) yukarıdaki cevap için @ rubo77 kudos vermek gerekir, hangi aradığını.

Bu, aşağıdakilere biraz sed ekler:

(a) her 16 bitlik öbekte herhangi bir önde gelen sıfırın elide edilmesi; ve

(b) IID'nin başlangıcında sıfırdan başka bir parça daha elid

... adres kısalığı için ortak sözleşmelere göre.

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/'
}

Bunu, EUI-64'ün herhangi bir kapsamda kullanılabileceğinden (gizlilik nedenleriyle global adresler için kullanmamanız önerilmesine rağmen) diğer (keyfi) önekler için yeniden kullanmak isterseniz, biraz ihtiyacınız olacaktır daha kıvrımlı sed komut dosyası. Çünkü fe80::önek zaten IID'nin başlangıcına bitişik üç çift parça (iki nokta üst üste işaretli) içerir. Böylece, IID'nin ilk yığını tamamen sıfır olsa bile (yani MAC ile 02:00başlasaydı), o da elid olurdu. EUI-64 formatı, yukarıdaki komut dosyasının tek bir sıfır olarak eklediği, yalnızca sıfır olan bir son yığın bırakır - sonuncusu -. Diğer önekler, iki kolon arasında tek bir sıfır bırakmayı gerektirebilir.


Haklısın, teşekkürler printf.
Headbank
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.