シェルを使用してMACアドレスからIPv6アドレスを取得する方法


11

MACアドレスを使用して、たとえばネットワーク内で一意である必要があるリンクローカルIPv6アドレスなどのインターフェイス識別子を作成できることはわかっています。

画像はこれを行う方法を示しています:

MACアドレスからインターフェース識別子を作成する

私の質問は:

  • awkまたはを使用してMACからIPv6アドレスを作成するにはどうすればよいsedですか?
  • または、特定のMAC(そのようなものcreateIPv6 myMAC)のリンクローカルIPv6アドレスを取得するコマンドはありますか?

私はあなたの質問を少し言い換えました(レビュー待ち)。IPv6アドレスはMACアドレスから抽出されず、作成されます。ここでは、IPv6アドレスのインターフェース識別子部分(最後の64ビット)のみを扱います。しかし、よくわかりません。インターフェイス識別子だけが必要ですか、それともIPv6アドレス全体が必要ですか。正しく理解できなかった場合は、再編集してください。
Dubu

@Dubu、編集ありがとうございます。IPv6アドレス全体が必要です。
Nidal、2014年

回答:


10

MAC(および特定のプレフィックス)からIPv6アドレス全体を作成する場合はipv6calc、Peter 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アドレスから取得されます。

MACアドレス00:0C:29:0C:47:D5は、中央にFF:FE:00:0C:29:FF:FE:0C:47:D5を挿入することにより、64ビットEUI-64に変換されます。

したがって、3番目:をで置き換えると: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、2014年

ああ、U / Lビット、良い点!
HBruijn 2014年


0

を使用してMACアドレスを6つのコロンで区切られたグループに分割し、それらをアセンブルするbash関数を作成(およびに配置~/.bashrcIFSできます。また、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

私が探していた上記の純粋なシェル(printfを数えない限り)の答えについては、上記の@ rubo77に賞賛を与える必要があります。

これにより、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を任意のスコープで使用できるため(プライバシー上の理由から、グローバルアドレスには使用しないことをお勧めします)、少しだけ必要になることに注意してください。より複雑なsedスクリプト。これは、fe80::プレフィックスには、IIDの先頭に隣接する3つのゼロチャンク(ダブルコロンで省略)が既に含まれているためです。したがって、IIDの最初のチャンクがすべてゼロである場合(つまり、MACがで始まっている場合02:00)でも、それは省略されます。EUI-64形式では、すべてゼロになる可能性のある1つのチャンク(最後のチャンク)のみが残され、上記のスクリプトで単一のゼロとして追加されます。他の接頭辞では、2つのコロンの間に1つのゼロを残す必要があります。


あなたは正しい、ありがとう-私は戻って@ rubo77の罰金をprintf一人にして、代わりにsedで追加のことをしました。
ヘッドバンク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.