NetKubeLab EN

MAC address — ไว้ทำอะไรกันแน่

MAC address มีหน้าที่เดียวคือพาเฟรมข้ามสายเส้นเดียว มันไม่เดินทางข้ามเราเตอร์ ไม่ใช่ตัวระบุอุปกรณ์ที่เชื่อถือได้อีกต่อไป และไม่เคยเป็นมาตรการความปลอดภัย

ถ้าเครื่องมีเลข IP อยู่แล้ว ทำไมต้องมีเลขอีกชุดหนึ่ง

คำถามนี้ตอบได้ในประโยคเดียว และประโยคนั้นทำให้ทุกอย่างที่เหลือเข้าที่ทันที — MAC address มีไว้พาข้อมูลข้ามสายเส้นเดียว ไม่ใช่พาข้ามอินเทอร์เน็ต

มันไม่เดินทางข้ามเราเตอร์ เว็บที่คุณเปิดไม่มีทางเห็นมัน และทุกวันนี้มันไม่ใช่ ตัวระบุอุปกรณ์ที่เชื่อถือได้แล้วด้วย

หน้านี้อธิบายว่ามันทำอะไร ทำไมถึงต้องมี และอะไรที่คนเชื่อกันแต่ไม่จริง

ถ้ายังไม่ได้อ่าน Internet Protocol กับ IPv4 Subnet แนะนำให้อ่านก่อน เพราะเรื่องนี้อยู่ชั้นล่าง ของทั้งสองเรื่องนั้น

ถ้ายังไม่เคยดู เริ่มตรงนี้

ดูเลขของเครื่องตัวเอง

ifconfig en0 | grep ether      # macOS และ BSD
ip link show                   # Linux

แล้วดูรายชื่อเพื่อนบ้านที่เครื่องคุณรู้จัก

$ arp -an
? (192.168.1.1) at 00:1b:21:3a:5c:9e on en0 [ethernet]
? (224.0.0.251) at 1:0:5e:00:00:fb on en0 ifscope permanent [ethernet]

สองบรรทัดนี้มีเรื่องให้เล่าเยอะกว่าที่เห็น — บรรทัดแรกคือเราเตอร์ในบ้าน บรรทัดที่สองไม่ใช่เครื่องไหนเลยแต่เป็นกลุ่ม และเราจะกลับมาที่มันตอนท้าย

ตารางนี้มีแต่เพื่อนบ้านบนสายเส้นเดียวกัน ไม่มีเครื่องไหนบนอินเทอร์เน็ต อยู่ในนั้นเลย ซึ่งเป็นเบาะแสแรกของคำตอบทั้งหมด

48 บิตนั้นประกอบด้วยอะไร

MAC 48 บิตแบ่งเป็น OUI 24 บิตของผู้ผลิตและอีก 24 บิตที่ผู้ผลิตกำหนดเอง โดยสองบิตขวาสุดของไบต์แรกบอกว่าเป็นการส่งหาเครื่องเดียวหรือหลายเครื่อง และเป็นเลขจริงหรือเลขที่ตั้งขึ้นเอง

ครึ่งแรกคือ OUI ซึ่งเป็นหมายเลขที่ IEEE ขายให้ผู้ผลิต ครึ่งหลังผู้ผลิต กำหนดเองโดยรับผิดชอบไม่ให้ซ้ำกันเอง

แต่ของจริงที่ต้องรู้อยู่ที่สองบิตขวาสุดของไบต์แรก

  บิตขวาสุด    I/G   0 = ส่งหาเครื่องเดียว   1 = ส่งหาหลายเครื่อง
  บิตถัดมา     U/L   0 = ผู้ผลิตกำหนด        1 = ตั้งขึ้นเอง

อ่านสองบิตนี้แล้วรู้ทันทีว่ากำลังดูอะไรอยู่

  00:1b:21:...  0000 0000  ทั้งสองบิตเป็น 0  เลขจริงของฮาร์ดแวร์
  b2:14:7f:...  1011 0010  U/L = 1           ซอฟต์แวร์ตั้งขึ้น
  01:00:5e:...  0000 0001  I/G = 1           ส่งหากลุ่ม
  ff:ff:ff:...  1111 1111  ทั้งสองเป็น 1     ส่งหาทุกเครื่อง

ลองเปิด arp -an ของตัวเองแล้วดูไบต์แรกของแต่ละรายการ จะเห็นทันทีว่า อุปกรณ์ตัวไหนใช้เลขจริงและตัวไหนสุ่มขึ้นมา — ซึ่งจะกลับมาเป็นประเด็นใหญ่ ในหัวข้อท้าย ๆ

พฤศจิกายน 1982 — ปัญหาที่ต้องมีสองเลข

ตอนนั้น IP เพิ่งนิยามได้ปีเศษ และมีปัญหาที่ต้องแก้ก่อนจะใช้งานจริงบน อีเทอร์เน็ตได้ RFC 826 เขียนโดย David C. Plummer จาก MIT เผยแพร่พฤศจิกายน 1982 อธิบายปัญหาไว้ตรง ๆ ว่า

อีเทอร์เน็ต 10 เมกะบิตต้องการที่อยู่ขนาด 48 บิตบนสายจริง แต่ที่อยู่ของ โพรโทคอลส่วนใหญ่ไม่ได้ยาว 48 บิต และไม่จำเป็นต้องมีความสัมพันธ์ใด ๆ กับที่อยู่อีเทอร์เน็ต 48 บิตของฮาร์ดแวร์เลย

พูดง่าย ๆ คือ ฮาร์ดแวร์มีระบบเลขของมันเองมาก่อนแล้ว และ IP มาทีหลัง สองระบบนี้ไม่รู้จักกัน จึงต้องมีวิธีถามหากันแบบสด ๆ

วิธีนั้นคือ ARP

ARP — สะพานระหว่างสองระบบเลข

เครื่อง A ตะโกนถามทั้งสายว่าใครถือเลข IP นี้ ทุกเครื่องได้ยินแต่มีเครื่องเดียวตอบกลับมาพร้อมบอก MAC ของตัวเอง

เมื่อเครื่องจะส่งข้อมูลไปหาเลข IP หนึ่งบนสายเดียวกัน มันรู้เลข IP แต่ยังส่งไม่ได้ เพราะการ์ดเน็ตกับสวิตช์อ่านแต่ MAC

มันจึงตะโกนถามทั้งสายว่า "ใครถือ 192.168.1.20 ตอบมาที่ MAC ของฉัน" ทุกเครื่องได้ยิน แต่มีเครื่องเดียวตอบ แล้วคำตอบถูกจำไว้ในตาราง

ตารางนั้นคือสิ่งที่ arp -an แสดง และ RFC 826 กำหนดขอบเขตไว้ตั้งแต่ต้นว่า เป็นเรื่องของ "สายอีเทอร์เน็ตเส้นเดียว"

IPv6 ไม่ใช้ ARP แต่ใช้ Neighbor Discovery ซึ่งทำงานบน ICMPv6 หลักการ เดียวกันแต่ใช้ multicast แทน broadcast จึงรบกวนเครื่องที่ไม่เกี่ยวข้องน้อยกว่า

หัวใจของเรื่อง — MAC ไม่ข้ามเราเตอร์

เลข IP ต้นทางและปลายทางคงเดิมตลอดเส้นทาง ส่วน MAC ถูกเขียนใหม่ทุกช่วงระหว่างอุปกรณ์

นี่คือข้อที่ต้องเข้าใจให้ได้ ที่เหลือเป็นรายละเอียด

เมื่อคุณเปิดเว็บ แพ็กเก็ตของคุณเดินทางผ่านเราเตอร์หลายตัว ระหว่างทางนั้น

  • เลข IP ต้นทางและปลายทาง คงเดิมตลอด เขียนครั้งเดียวตอนส่ง
  • MAC ต้นทางและปลายทาง เปลี่ยนใหม่ทุกช่วง

ทุกครั้งที่เราเตอร์รับเฟรมเข้ามา มันทิ้งหัวเฟรมเดิมทั้งหมด แล้วเขียนใหม่ ด้วย MAC ของตัวเองเป็นต้นทาง และ MAC ของอุปกรณ์ถัดไปเป็นปลายทาง

ผลที่ตามมามีสามข้อที่ตอบคำถามที่คนถามกันบ่อยที่สุด

เว็บที่คุณเปิดไม่มีทางรู้ MAC ของเครื่องคุณ มันเห็นแค่ MAC ของเราเตอร์ ตัวสุดท้ายก่อนถึงตัวมันเอง ใครบอกว่าเว็บเก็บ MAC ของคุณไปคือเข้าใจผิด

MAC ไม่มีประโยชน์ในการติดตามข้ามอินเทอร์เน็ต เพราะมันไปไม่ถึงไหนเลย สิ่งที่ตามรอยได้จริงคือเลข IP คุกกี้ และลายนิ้วมือของเบราว์เซอร์

การเปลี่ยน MAC ไม่ได้ทำให้ "ปลอมตัว" บนอินเทอร์เน็ต มันเปลี่ยนแค่วิธีที่ อุปกรณ์ในบ้านหรือในออฟฟิศมองเห็นคุณเท่านั้น

สวิตช์กับเราเตอร์อ่านคนละฟิลด์

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

สวิตช์ จำว่า MAC ไหนอยู่พอร์ตไหน มันเรียนรู้เอาเองจากเฟรมที่วิ่งผ่าน — เห็นเฟรมมาจาก MAC หนึ่งเข้าพอร์ตสาม ก็จดไว้ว่า MAC นั้นอยู่พอร์ตสาม เจอปลายทางที่ไม่รู้จักก็ส่งออกทุกพอร์ตแล้วเรียนรู้จากคำตอบ

สวิตช์ไม่แตะหัว IP ไม่ลด TTL และไม่จำเป็นต้องรู้ด้วยซ้ำว่ามี IP อยู่ในโลก

เราเตอร์ จำว่าวงไหนออกทางไหน อ่านเลข IP ปลายทาง ลด TTL ลงหนึ่ง แล้วเขียนหัวเฟรมใหม่ทั้งหมด

สองอุปกรณ์นี้อ่านคนละฟิลด์ในแพ็กเก็ตเดียวกัน และไม่สนใจฟิลด์ของอีกฝ่าย นั่นคือเหตุผลที่ MAC ไม่ข้ามเราเตอร์ — ไม่ใช่เพราะถูกห้าม แต่เพราะเราเตอร์เขียนทับมันทุกครั้ง

เลขที่ไม่ใช่ของเครื่องไหนเลย

บาง MAC ไม่ได้หมายถึงอุปกรณ์ตัวใดตัวหนึ่ง

ff:ff:ff:ff:ff:ff คือ broadcast แปลว่าทุกเครื่องบนสายเส้นนี้ ARP request ใช้ที่อยู่นี้ และนั่นคือเหตุผลที่วงใหญ่เกินไปทำให้เครือข่ายช้า — ทุกเครื่องต้องรับและประมวลผลทุกครั้งที่มีใครถามหาใคร

ที่อยู่ multicast ของ IPv4 ถูกแมปลง MAC โดยเก็บแค่ 23 บิตล่าง ทำให้กลุ่มที่ต่างกัน 32 กลุ่มได้ MAC เดียวกัน

01:00:5e:... คือ multicast ของ IPv4 บรรทัดที่เห็นในตาราง arp ตอนต้น คือ 224.0.0.251 ซึ่งเป็น mDNS ที่อุปกรณ์ใช้ประกาศตัวเองในบ้าน

การแมปทำโดยเอา 23 บิตล่าง ของที่อยู่ multicast ต่อท้าย 01:00:5e และตรงนี้มีข้อจำกัดที่น่าสนใจ — ที่อยู่ multicast ของ IPv4 มี 28 บิต ที่ใช้ระบุกลุ่ม แต่แมปลงได้แค่ 23

  224.0.0.251     ->  01:00:5e:00:00:fb
  225.0.0.251     ->  01:00:5e:00:00:fb     คนละกลุ่ม MAC เดียวกัน
  239.128.0.251   ->  01:00:5e:00:00:fb     ก็ยังเดียวกันอีก

ทุกที่อยู่ multicast จึงมีอีก 31 กลุ่มที่ได้ MAC เดียวกัน การ์ดเน็ตต้องรับ เข้ามาก่อนแล้วให้ซอฟต์แวร์คัดทิ้งทีหลัง IPv6 แก้ปัญหานี้ ด้วยการใช้ 33:33 แล้วตามด้วย 32 บิตล่างเต็ม ๆ จึงไม่มีการชนกัน

เมื่อ MAC เลิกเป็นตัวระบุอุปกรณ์

อ่านบิต U/L ก็แยกออกว่าเลขไหนเป็นของฮาร์ดแวร์จริงและเลขไหนซอฟต์แวร์สุ่มขึ้นมา

สมัยก่อน MAC เป็นเลขที่ติดมากับการ์ดและไม่เปลี่ยน จึงถูกใช้เป็นตัวระบุอุปกรณ์ ในหลายเรื่อง

แล้วมันก็ถูกใช้ตามรอยคน ห้างสรรพสินค้าและสนามบินวางจุดรับสัญญาณเพื่อ เก็บ MAC ของโทรศัพท์ที่เดินผ่าน แล้วประกอบเป็นเส้นทางการเดินของแต่ละคน โดยเจ้าตัวไม่รู้และไม่ได้ยินยอม

ระบบปฏิบัติการจึงตอบโต้ด้วย MAC randomization — โทรศัพท์และโน้ตบุ๊ก สมัยใหม่สุ่มเลขใหม่ให้แต่ละเครือข่ายที่ต่อ และบางระบบเปลี่ยนเป็นระยะ ๆ ด้วยซ้ำ เลขที่สุ่มขึ้นจะมีบิต U/L เป็น 1 เสมอ

ลองดูตาราง arp -an ของเครือข่ายที่บ้านคุณเอง แล้วนับว่ามีกี่รายการ ที่ไบต์แรกมีบิต U/L เป็น 1 ในบ้านทั่วไปวันนี้มักได้ประมาณครึ่งหนึ่ง

สิ่งที่พังไปพร้อมกันคือทุกอย่างที่เคยใช้ MAC เป็นตัวระบุ

  • การจอง IP ตายตัวตาม MAC ในเราเตอร์ ซึ่งจะหลุดเมื่ออุปกรณ์สุ่มเลขใหม่
  • การนับจำนวนอุปกรณ์ในเครือข่าย ซึ่งจะนับเกินจริง
  • การกรองด้วยรายชื่อ MAC ซึ่งไม่เคยเป็นความปลอดภัยอยู่แล้ว

ความเชื่อที่ผิด

รายชื่อ MAC ที่ได้รับอนุญาตเดินทางในเฟรมแบบไม่เข้ารหัส ใครนั่งฟังอยู่ก็เห็นแล้วตั้งเลขของตัวเองให้ตรงได้

"MAC filtering ทำให้ Wi-Fi ปลอดภัยขึ้น" — ไม่จริงเลย MAC เดินทาง ในเฟรมแบบไม่เข้ารหัสเสมอ แม้เครือข่ายจะเข้ารหัสข้อมูลอยู่ก็ตาม ใครนั่งฟังอยู่ก็เห็นรายชื่อที่ได้รับอนุญาตทั้งหมด แล้วตั้ง MAC ของตัวเอง ให้ตรงด้วยคำสั่งเดียว มันเป็นป้ายชื่อ ไม่ใช่กุญแจ

"MAC ไม่ซ้ำกันทั้งโลก" — ตั้งใจให้เป็นแบบนั้น แต่ในทางปฏิบัติมีทั้ง ผู้ผลิตที่พลาดจนออกเลขซ้ำ อุปกรณ์ราคาถูกที่ใช้เลขเดียวกันทั้งล็อต และเลขที่ตั้งขึ้นเองซึ่งไม่มีใครรับประกันอะไรเลย

"เปลี่ยน MAC แล้วปลอมตัวบนอินเทอร์เน็ตได้" — เปลี่ยนได้เฉพาะสิ่งที่ อุปกรณ์บนสายเส้นเดียวกันเห็น พ้นเราเตอร์ตัวแรกไปแล้วไม่มีใครเห็นมันอีก

"MAC บอกยี่ห้ออุปกรณ์ได้" — ได้เฉพาะเลขที่ผู้ผลิตกำหนด และวันนี้ อุปกรณ์จำนวนมากสุ่มเลขซึ่งค้น OUI แล้วไม่เจออะไร

"เห็น MAC ในล็อกแปลว่ารู้ว่าเครื่องไหน" — เฉพาะเมื่อ log นั้นมาจาก อุปกรณ์ที่อยู่บนสายเส้นเดียวกับเครื่องนั้น log ของเว็บเซิร์ฟเวอร์ ไม่มี MAC ของผู้ใช้อยู่เลย

ตัวอย่างจริงจากงานจริง

กรณีที่ 1 — IP ซ้ำ ที่ MAC เป็นตัวชี้ขาด

บทความ ping มีกรณีที่ ping แล้วได้คำตอบซ้ำพร้อมคำว่า (DUP!) และ TTL ไม่เท่ากัน ตัวยืนยันขั้นสุดท้ายอยู่ที่นี่

$ arp -an 192.168.10.50
? (192.168.10.50) at 00:1b:21:3a:5c:9e on en0 [ethernet]
$ arp -an 192.168.10.50
? (192.168.10.50) at 4c:52:62:11:07:d3 on en0 [ethernet]

อ่านอย่างไร เลข IP เดียวแต่ MAC สลับไปมาสองค่า แปลว่ามีสองเครื่อง ตอบ ARP สำหรับเลขเดียวกัน ปิดคดี

สิ่งที่ยังไม่ได้พิสูจน์ ยังไม่รู้ว่าเครื่องไหนตั้งผิด ต้องค้น OUI ของทั้งสองเพื่อเดายี่ห้อ หรือไล่หาว่าอยู่พอร์ตไหนบนสวิตช์

กรณีที่ 2 — หาว่าเครื่องหนึ่งเสียบอยู่พอร์ตไหน

switch# show mac address-table | include 001b.2138
  10    001b.2138.5c9e    DYNAMIC     Gi1/0/14

อ่านอย่างไร สวิตช์บอกว่าเห็น MAC นี้เข้ามาทางพอร์ต Gi1/0/14 ในวงหมายเลข 10 นี่คือวิธีตามหาเครื่องจริงในห้องที่มีสายเป็นร้อยเส้นโดยไม่ต้องเดินไล่ดู

สิ่งที่ยังไม่ได้พิสูจน์ พอร์ตนั้นอาจต่อไปยังสวิตช์ตัวถัดไป ไม่ใช่ต่อ เครื่องโดยตรง ถ้าเห็นหลาย MAC บนพอร์ตเดียวแปลว่ามีอุปกรณ์คั่นอยู่

กรณีที่ 3 — การจอง IP ที่หลุดเอง

ผู้ใช้แจ้งว่าเครื่องเคยได้เลข IP เดิมทุกครั้ง แล้วจู่ ๆ ก็เปลี่ยนไปเรื่อย

อ่านอย่างไร ดูว่า MAC ที่เห็นตอนนี้มีบิต U/L เป็น 1 หรือไม่

  ไบต์แรก 0x00 = 0000 0000  ->  U/L = 0  เลขจริง
  ไบต์แรก 0xb2 = 1011 0010  ->  U/L = 1  เลขที่สุ่มขึ้น

ถ้าเป็น 1 แปลว่าอุปกรณ์เปิด MAC randomization แล้วสุ่มเลขใหม่ การจองตาม MAC เดิมจึงไม่ตรงอีกต่อไป

ทางแก้ ตั้งให้อุปกรณ์ใช้ MAC จริงเฉพาะกับเครือข่ายนี้ ซึ่งระบบปฏิบัติการ สมัยใหม่มีตัวเลือกให้ต่อเครือข่าย หรือเลิกจองตาม MAC แล้วใช้วิธีอื่นแทน

สิ่งที่ยังไม่ได้พิสูจน์ ยังไม่รู้ว่าอุปกรณ์สุ่มครั้งเดียวต่อเครือข่าย หรือสุ่มเป็นระยะ ซึ่งต่างกันมากเวลาวางแผนแก้

กรณีที่ 4 — ping ในวงเดียวกันไม่ได้ แต่ทุกอย่างตั้งถูก

$ ping -c 2 192.168.1.50
Request timeout for icmp_seq 0
$ arp -an 192.168.1.50
? (192.168.1.50) at (incomplete) on en0 [ethernet]

อ่านอย่างไร คำว่า (incomplete) แปลว่าถาม ARP ออกไปแล้วไม่มีใครตอบ ปัญหาจึงอยู่ต่ำกว่าชั้น IP ลงไป — อาจไม่มีเครื่องนั้นอยู่จริง อาจอยู่คนละ VLAN หรือสายหลุด

นี่คือจุดที่ MAC มีประโยชน์ที่สุดในการไล่ปัญหา เพราะมันแยกได้ว่า ปัญหาอยู่ที่ชั้นเชื่อมต่อหรือชั้น IP

สิ่งที่ยังไม่ได้พิสูจน์ ยังไม่รู้สาเหตุ ต้องดูต่อว่าเครื่องนั้นออนไลน์ไหม และอยู่ VLAN เดียวกันจริงหรือเปล่า

เมื่อ MAC ไม่พอ

  • arp -an หรือ ip neigh — เพื่อนบ้านที่เครื่องรู้จักตอนนี้
  • show mac address-table บนสวิตช์ — MAC ไหนอยู่พอร์ตไหน
  • tcpdump -e — ธง -e แสดงหัวเฟรม ทำให้เห็น MAC ต้นทางปลายทางจริง ซึ่งเป็นวิธีเดียวที่จะเห็นว่ามันถูกเขียนใหม่ทุกฮอปจริง ๆ
  • ค้น OUI จากฐานข้อมูลของ IEEE เพื่อเดายี่ห้อ ซึ่งใช้ได้เฉพาะกับเลขที่ ผู้ผลิตกำหนด

MAC address ไม่ใช่บัตรประชาชนของอุปกรณ์ มันคือป้ายชื่อที่ใช้ในห้องเดียว

พ้นประตูห้องนั้นไปแล้วไม่มีใครรู้จักมันอีก และวันนี้แม้แต่ในห้องนั้น มันก็เป็นชื่อที่เจ้าตัวเปลี่ยนได้ตามใจ

อ้างอิง

เอกสารมาตรฐาน

คู่มือ

  • man arp และ man ip-neighbour บนเครื่องที่คุณนั่งอยู่
  • tcpdump -e ซึ่งเป็นวิธีที่ตรงที่สุดในการเห็นว่าหัวเฟรมถูกเขียนใหม่ทุกฮอป

อ่านหน้านี้เป็นภาษาอังกฤษ

← กลับไปหน้าความรู้พื้นฐาน