Bagaimana cara menggunakan shell untuk mendapatkan alamat IPv6 dari alamat MAC?

11

Kami tahu bahwa kami dapat menggunakan alamat MAC untuk membuat pengenal antarmuka, misalnya untuk alamat IPv6 tautan lokal yang harus unik di Jaringan.

Gambar menunjukkan cara untuk melakukan ini:

Buat pengenal antarmuka dari alamat MAC

Pertanyaan saya adalah:

  • Bagaimana saya bisa membuat alamat IPv6 dari MAC menggunakan awkatau sed?
  • ATAU adakah perintah yang memberi saya alamat IPv6 link-lokal untuk MAC tertentu (seperti itu createIPv6 myMAC)?
Nidal
sumber
Saya sedikit mengulangi pertanyaan Anda (menunggu tinjauan). Alamat IPv6 tidak diekstraksi dari alamat MAC, tetapi dibuat. Dan di sini Anda hanya berurusan dengan bagian pengenal antarmuka (64 bit terakhir) dari alamat IPv6. Tapi saya tidak yakin: Apakah Anda hanya ingin pengidentifikasi antarmuka atau alamat IPv6 keseluruhan? Harap edit kembali, jika saya tidak mengerti Anda dengan benar.
Dubu
@ Dubu, Terima kasih sudah mengedit, saya ingin seluruh alamat IPv6.
Nidal

Jawaban:

10

Jika Anda ingin membuat alamat IPv6 keseluruhan dari MAC (dan awalan yang diberikan), Anda bisa menggunakan ipv6calcalat yang sangat baik oleh Peter Bieringer.

Perintah berikut membuat alamat IPv6 tautan lokal ( fe80::awalan) dari alamat MAC:

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

Anda dapat meninggalkan sebagian besar opsi dan membiarkan perintah menebak apa yang harus dilakukan:

$ 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

Untuk distro Debian, ipv6calcada di repositori utama.

Dubu
sumber
4

Dari entri Wikipedia IPv6, deskripsi yang lebih tekstual:

Pengidentifikasi antarmuka 64-bit paling umum berasal dari alamat MAC 48-bitnya.

Alamat MAC 00: 0C: 29: 0C: 47: D5 diubah menjadi EUI-64 64-bit dengan memasukkan FF: FE di tengah: 00: 0C: 29: FF: FE: 0C: 47: D5.

Jadi mengganti yang ketiga :dengan :FF:FE:harus melakukan trik:

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

Tidak tahu apakah sintaks itu khusus untuk GNU sed.


Pekerjaan dalam proses:

Ubah itu menjadi bit:

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

seharusnya menghasilkan bit yang 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101hanya menyisakan bit nomor 7.

HBruijn
sumber
1
bagaimana dengan membalikkan bit ke-7!
Nidal
Ah sedikit U / L, poin bagus!
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:])
Martin Wilck
sumber
0

Anda dapat membuat fungsi bash (dan menempatkannya di Anda ~/.bashrc) yang digunakan IFSuntuk membagi alamat MAC menjadi 6 kelompok yang dipisahkan dengan titik dua dan merakitnya. Anda juga perlu membalik bit ke-7 yang paling signifikan, yaitu bit 1 dari byte pertama:

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

Contoh penggunaan:

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

Saya harus memberikan pujian kepada @ rubo77 di atas untuk jawaban murni-shell (kecuali Anda menghitung printf) di atas, yang saya cari.

Ini menambahkan sedikit sed ke:

(a) hilangkan setiap nol terkemuka di setiap potongan 16-bit; dan

(B) hilangkan lebih lanjut semua-nol potongan pada awal IID

... sesuai konvensi umum untuk singkatnya alamat.

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

Perhatikan bahwa jika Anda ingin menggunakan kembali ini untuk awalan lain (sewenang-wenang), yang mungkin Anda miliki sejak EUI-64 dapat digunakan dalam lingkup apa pun (meskipun disarankan untuk tidak menggunakannya untuk alamat global karena alasan privasi), Anda akan memerlukan sedikit skrip sed yang lebih berbelit-belit. Itu karena fe80::awalannya sudah berisi tiga nol-potongan (elided ke double-colon) yang berdekatan dengan awal IID. Jadi, bahkan jika potongan pertama IID adalah semua-nol (yaitu, jika MAC mulai dengan 02:00), itu akan hilang juga. Format EUI-64 hanya menyisakan satu potongan lebih lanjut yang bisa menjadi nol - yang terakhir - yang ditambahkan skrip di atas sebagai nol tunggal. Awalan lain mungkin mengharuskan satu untuk meninggalkan nol tunggal antara dua titik dua.

Headbank
sumber
Anda benar, terima kasih - saya kembali dan meninggalkan @ rubo77 baik-baik printfsaja dan melakukan hal-hal tambahan sebagai gantinya.
Headbank