Làm cách nào để sử dụng shell để lấy địa chỉ IPv6 từ địa chỉ MAC?


11

Chúng tôi biết rằng chúng tôi có thể sử dụng địa chỉ MAC để tạo số nhận dạng giao diện, ví dụ: đối với địa chỉ IPv6 liên kết cục bộ phải là duy nhất trong Mạng.

Hình ảnh cho thấy cách để làm điều này:

Tạo định danh giao diện từ địa chỉ MAC

Câu hỏi của tôi là:

  • Làm cách nào tôi có thể tạo địa chỉ IPv6 từ MAC bằng cách sử dụng awkhoặc sed?
  • HOẶC có lệnh nào cung cấp cho tôi địa chỉ IPv6 liên kết cục bộ cho một MAC cụ thể (đại loại như thế không createIPv6 myMAC)?

Tôi đã đọc lại câu hỏi của bạn một chút (chờ xem xét). Địa chỉ IPv6 không được trích xuất từ địa chỉ MAC, nhưng được tạo. Và ở đây bạn chỉ xử lý phần nhận dạng giao diện (64 bit cuối cùng) của một địa chỉ IPv6. Nhưng tôi không chắc chắn: Bạn chỉ muốn số nhận dạng giao diện hoặc toàn bộ địa chỉ IPv6? Vui lòng chỉnh sửa lại, nếu tôi không hiểu chính xác bạn.
Dubu

@Dubu, Cảm ơn bạn đã chỉnh sửa, tôi muốn toàn bộ địa chỉ IPv6.
Nidal

Câu trả lời:


10

Nếu bạn muốn tạo toàn bộ địa chỉ IPv6 từ MAC (và tiền tố đã cho), bạn có thể sử dụng ipv6calccông cụ tuyệt vời của Peter Bieringer.

Lệnh sau tạo địa chỉ IPv6 liên kết cục bộ ( fe80::tiền tố) từ địa chỉ MAC:

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

Bạn có thể bỏ hầu hết các tùy chọn và để lệnh đoán phải làm gì:

$ 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

Đối với các bản phân phối Debian, ipv6calcnằm trong kho lưu trữ chính.


4

Từ mục nhập Wikipedia Wikipedia một mô tả văn bản hơn:

Mã định danh giao diện 64 bit thường được lấy từ địa chỉ MAC 48 bit của nó.

Địa chỉ MAC 00: 0C: 29: 0C: 47: D5 được biến thành EUI-64 64 bit bằng cách chèn FF: FE ở giữa: 00: 0C: 29: FF: FE: 0C: 47: D5.

Vì vậy, thay thế thứ ba :bằng :FF:FE:nên thực hiện các mẹo:

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

Không có ý tưởng nếu cú ​​pháp đó là cụ thể cho GNU sed.


Công việc đang tiến hành:

Chuyển đổi nó thành bit:

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

sẽ dẫn đến các bit 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101chỉ để lại việc lật bit số 7.


1
Điều gì về đảo ngược bit thứ 7!
Nidal

Ah bit U / L, điểm tốt!
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

Bạn có thể tạo một hàm bash (và đặt nó vào trong ~/.bashrc) sử dụng IFSđể chia địa chỉ MAC thành 6 nhóm được phân tách bằng dấu hai chấm và lắp ráp chúng. Bạn cũng cần lật bit đáng kể thứ 7, tức là bit 1 của byte đầu tiên:

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

Ví dụ sử dụng:

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

0

Tôi phải cung cấp danh hiệu cho @ rubo77 ở trên để có câu trả lời thuần túy (trừ khi bạn đếm printf) ở trên mà tôi đang tìm kiếm.

Điều này thêm một chút sed vào:

(a) bỏ qua mọi số 0 đứng đầu trong mỗi đoạn 16 bit; và

(b) bỏ qua bất kỳ khối nào khác hoàn toàn khi bắt đầu IID

... theo các quy ước chung cho địa chỉ ngắn gọn.

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

Lưu ý rằng nếu bạn muốn sử dụng lại tiền tố này cho các tiền tố (tùy ý) khác, mà bạn có thể sử dụng EUI-64 trong bất kỳ phạm vi nào (mặc dù bạn không nên sử dụng nó cho các địa chỉ toàn cầu vì lý do riêng tư), bạn cần một chút kịch bản sed phức tạp hơn. Đó là bởi vì fe80::tiền tố đã chứa ba khối không (được tách ra thành dấu hai chấm) liền kề với điểm bắt đầu của IID. Do đó, ngay cả khi đoạn đầu tiên của IID là toàn bộ số 0 (nghĩa là, nếu MAC bắt đầu 02:00), nó cũng sẽ bị loại bỏ. Định dạng EUI-64 chỉ để lại một đoạn nữa có thể là số không - số cuối cùng - mà tập lệnh ở trên thêm lại dưới dạng một số không. Các tiền tố khác có thể yêu cầu một số để lại một số 0 duy nhất giữa hai dấu hai chấm.


Bạn nói đúng, cảm ơn - Tôi đã quay lại và rời khỏi @ rubo77 printfmột mình và thay vào đó là những thứ bổ sung trong sed.
Headbank
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.