쉘을 사용하여 MAC 주소에서 IPv6 주소를 파생시키는 방법은 무엇입니까?


11

MAC 주소를 사용하여 인터페이스 식별자 (예 : 네트워크에서 고유해야하는 링크 로컬 IPv6 주소)를 만들 수 있습니다.

이미지는이를 수행하는 방법을 보여줍니다.

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

내 질문은 :

  • 어떻게 사용하여 MAC에서 IPv6 주소를 생성 할 수 있습니다 awk또는 sed?
  • 또는 특정 MAC에 대한 링크 로컬 IPv6 주소를 제공하는 명령이 createIPv6 myMAC있습니까?

귀하의 질문에 약간의 답을주었습니다 (검토 보류 중). IPv6 주소는 MAC 주소에서 추출 되지 않고 생성됩니다. 그리고 여기서는 IPv6 주소의 인터페이스 식별자 부분 (마지막 64 비트) 만 처리합니다. 그러나 확실하지 않습니다 : 인터페이스 식별자 또는 전체 IPv6 주소 만 원하십니까? 내가 당신을 올바르게 이해하지 못하면 다시 편집하십시오.
Dubu

@Dubu, 편집 해 주셔서 감사합니다. 전체 IPv6 주소를 원합니다.
Nidal

답변:


10

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

데비안 배포판의 ipv6calc경우 기본 저장소에 있습니다.


4

로부터 의 IPv6 위키 백과의 항목 더 텍스트 설명 :

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

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

따라서 세 번째 :로 바꾸면 :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

아 U / L 비트, 좋은 지적!
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

당신은 만들 수 있습니다 bash는 기능을 (그리고에 배치 ~/.bashrc)가 사용하는 것을 IFS6 콜론으로 구분 된 그룹과 조립을에 MAC 주소를 분리 할 수 있습니다. 또한 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에 kudos를 제공해야합니다.

이것은 약간의 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의 시작 부분에 인접한 3 개의 제로 청크 (더블 콜론 필요)가 포함되어 있기 때문 입니다. 따라서 IID의 첫 번째 청크가 모두 0 인 경우에도 (즉, MAC 02:00이로 시작된 경우 ) 역시 제거됩니다. EUI-64 형식은 위의 스크립트가 단일 0으로 다시 추가하는 0이 될 수있는 하나의 청크 만 남습니다. 다른 접두사에는 두 개의 콜론 사이에 하나의 0을 남겨 두어야 할 수도 있습니다.


당신이 옳습니다, 고마워요-나는 돌아가서 @ rubo77의 벌금을 printf내버려두고 대신 sed로 추가 작업을했습니다.
헤드 뱅크
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.