우리는 MAC 주소를 사용하여 네트워크에서 고유해야 하는 링크 로컬 IPv6 주소와 같은 인터페이스 식별자를 생성할 수 있다는 것을 알고 있습니다.
이 다이어그램은 이를 수행하는 방법을 보여줍니다.
내 질문은 다음과 같습니다
awk
MAC에서 IPv6 주소를 사용하거나 생성하는 방법은 무엇입니까sed
?- 아니면 특정 MAC에 대한 링크-로컬 IPv6 주소(이와 유사한 것
createIPv6 myMAC
)를 제공할 수 있는 명령이 있습니까?
답변1
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
기본 저장소에 있습니다.
답변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을 남겨두어야 할 수도 있습니다.