จะใช้เชลล์เพื่อรับที่อยู่ IPv6 จากที่อยู่ MAC ได้อย่างไร


11

เรารู้ว่าเราสามารถใช้ที่อยู่ MAC เพื่อสร้างตัวระบุอินเทอร์เฟซเช่นสำหรับที่อยู่ IPv6 ลิงก์ท้องถิ่นซึ่งควรจะไม่ซ้ำกันในเครือข่าย

ภาพแสดงวิธีการทำสิ่งนี้:

สร้างตัวระบุส่วนต่อประสานจากที่อยู่ MAC

คำถามของฉันคือ:

  • ฉันจะสร้างที่อยู่ IPv6 จาก MAC โดยใช้awkหรือsedอย่างไร
  • หรือมีคำสั่งใดบ้างที่ให้ที่อยู่ IPv6 สำหรับการเชื่อมโยงท้องถิ่นสำหรับ MAC เฉพาะ (เช่นนั้นcreateIPv6 myMAC)

ฉัน rephrased คำถามของคุณเล็กน้อย (รอการตรวจสอบ) ที่อยู่ IPv6 ไม่ได้ถูกดึงมาจากที่อยู่ MAC แต่สร้างขึ้น และที่นี่คุณจะจัดการเฉพาะกับส่วนของตัวระบุส่วนต่อประสาน (64 บิตสุดท้าย) ของที่อยู่ IPv6 แต่ฉันไม่แน่ใจ: คุณต้องการเพียงตัวระบุส่วนติดต่อหรือที่อยู่ IPv6 ทั้งหมดหรือไม่ โปรดแก้ไขอีกครั้งหากฉันไม่เข้าใจคุณอย่างถูกต้อง
Dubu

@Dubu ขอบคุณสำหรับการแก้ไขฉันต้องการที่อยู่ IPv6 ทั้งหมด
Nidal

คำตอบ:


10

หากคุณต้องการสร้างที่อยู่ IPv6 ทั้งหมดจาก MAC (และคำนำหน้า) คุณสามารถใช้ipv6calcเครื่องมือที่ยอดเยี่ยมโดย Peter Bieringer

คำสั่งต่อไปนี้สร้างที่อยู่ IPv6 ของ link-local ( fe80::คำนำหน้า) จากที่อยู่ MAC:

$ 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 distros ipv6calcอยู่ในที่เก็บหลัก


4

จากรายการIPv6 Wikipediaรายละเอียดเพิ่มเติมเกี่ยวกับใจ:

ตัวระบุอินเตอร์เฟสแบบ 64 บิตส่วนใหญ่ได้มาจากที่อยู่ MAC 48 บิต

ที่อยู่ MAC 00: 0C: 29: 0C: 47: D5 เปลี่ยนเป็น EUI-64 บิต 64 โดยการใส่ FF: FE ตรงกลาง: 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 หรือไม่


กำลังดำเนินการ:

แปลงเป็นบิต:

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


0

คุณสามารถสร้างฟังก์ชั่นทุบตี (และวางไว้ในของคุณ~/.bashrc) ที่ใช้IFSเพื่อแยกที่อยู่ MAC ออกเป็น 6 กลุ่มที่คั่นด้วยโคลอนและประกอบเข้าด้วยกัน คุณจะต้องพลิกบิตที่สำคัญที่สุดลำดับที่ 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

ฉันต้องให้ความรุ่งโรจน์แก่ @ rubo77 ด้านบนเพื่อหาคำตอบของ shell-pure (เว้นแต่คุณจะนับ printf) ซึ่งฉันได้ค้นหา

นี่เป็นการเพิ่มความน่าสนใจให้กับ:

(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::คำนำหน้ามีสามส่วนศูนย์ (elided ไปยังลำไส้คู่) ที่อยู่ติดกับจุดเริ่มต้นของ IID ดังนั้นแม้ว่าก้อนแรกของ IID จะเป็นศูนย์ทั้งหมด (นั่นคือถ้า MAC เริ่มต้นด้วย02:00) ก็จะถูกลบออกเช่นกัน รูปแบบ EUI-64 เหลือเพียงหนึ่งอันเพิ่มเติมที่อาจเป็นศูนย์ทั้งหมดซึ่งเป็นรูปแบบสุดท้ายซึ่งสคริปต์ด้านบนจะรวมกลับเป็นศูนย์เดียว คำนำหน้าอื่น ๆ อาจต้องการให้เหลือศูนย์เดียวระหว่างสองโคลอน


ถูกต้องแล้วขอบคุณ - ฉันกลับไปแล้วทิ้ง @ rubo77 ให้ดีprintfคนเดียวและทำสิ่งเพิ่มเติมในความสบายใจแทน
Headbank
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.