쉘을 사용하여 MAC 주소에서 IPv6 주소를 내보내는 방법은 무엇입니까?

쉘을 사용하여 MAC 주소에서 IPv6 주소를 내보내는 방법은 무엇입니까?

우리는 MAC 주소를 사용하여 네트워크에서 고유해야 하는 링크 로컬 IPv6 주소와 같은 인터페이스 식별자를 생성할 수 있다는 것을 알고 있습니다.

이 다이어그램은 이를 수행하는 방법을 보여줍니다.

MAC 주소에서 인터페이스 식별자 생성

내 질문은 다음과 같습니다

  • awkMAC에서 IPv6 주소를 사용하거나 생성하는 방법은 무엇입니까 sed?
  • 아니면 특정 MAC에 대한 링크-로컬 IPv6 주소(이와 유사한 것 createIPv6 myMAC)를 제공할 수 있는 명령이 있습니까?

답변1

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기본 저장소에 있습니다.

답변2

~에서IPv6 위키피디아추가 텍스트 설명을 입력하세요.

64비트 인터페이스 식별자는 일반적으로 48비트 MAC 주소에서 파생됩니다.

MAC 주소 00:0C:29:0C:47:D5는 중간에 FF:FE를 삽입하여 64비트 EUI-64:00:0C:29:FF:FE:0C:47:D5로 변환됩니다.

따라서 세 번째 것을 이것 :으로 바꾸면 :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만 남게 됩니다 .

답변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:])

답변4

위에서 찾고 있는 순수한 쉘(printf를 계산하지 않는 한) 답변을 얻으려면 위의 @rubo77에 모자를 써야 합니다.

이것은 일부 sed를 추가합니다.

(a) 각 16비트 블록에서 선행 0을 제거합니다.

(b) IID로 시작하는 다른 모든 0 블록을 제거합니다.

...주소 간결성에 대한 일반적인 규칙을 따르세요.

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 시작 부분에 인접한 세 개의 0 블록이 포함되어 있기 때문입니다 (이중 콜론은 생략됨). 따라서 IID의 첫 번째 블록이 모두 0이더라도(즉, MAC이 로 시작하는 경우 02:00) 무시됩니다. EUI-64 형식은 모두 0일 수 있는 블록을 하나 더(마지막 블록) 남겨두고 위의 스크립트는 이를 다시 단일 0으로 추가합니다. 다른 접두사에서는 두 콜론 사이에 0을 남겨두어야 할 수도 있습니다.

관련 정보