NetKubeLab EN

VLAN — สี่ไบต์ที่แบ่งสวิตช์ตัวเดียวให้เป็นหลายวง

VLAN ทำงานอย่างไรในระดับบิต ทำไมแท็กถึงยาวแค่ 4 ไบต์ ความต่างระหว่างพอร์ตแบบ access กับ trunk และเหตุผลที่ native VLAN เป็นความผิดพลาดที่เงียบที่สุด

บทความ Ethernet จบลงด้วยตารางค่า EtherType และมีค่าหนึ่ง ที่ทิ้งไว้โดยยังไม่อธิบาย

  0x8100   มี VLAN tag ต่อท้าย

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

หน้านี้อธิบายว่ามันทำงานอย่างไร ทำไมถึงออกแบบมาแบบนั้น และจุดที่มันพลาดแบบ เงียบที่สุด

ปัญหาที่ต้องแก้ — ขอบเขตของการกระจายเสียง

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

บทความ MAC address อธิบายไว้ว่าสวิตช์ส่งเฟรมที่ไม่รู้ ปลายทางออกทุกพอร์ต และการกระจายเสียงไปถึงทุกเครื่องบนสายเส้นเดียวกัน

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

ปัญหาที่ตามมามีสองข้อ

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

ข้อที่สองคือการแยกส่วน ฝ่ายบัญชีกับเครื่องของแขกไม่ควรอยู่วงเดียวกัน

ก่อนปี 1998 ทางแก้มีทางเดียวคือซื้อสวิตช์เพิ่ม อยากได้สี่วงก็ซื้อสี่ตัว เดินสายสี่ชุด และย้ายคนข้ามฝ่ายทีต้องเดินสายใหม่

1998 — IEEE 802.1Q

มาตรฐานที่แก้เรื่องนี้คือ IEEE 802.1Q เผยแพร่ปี 1998

ก่อนหน้านั้นแต่ละเจ้าทำของตัวเอง ของ Cisco ชื่อ ISL ซึ่งใช้วิธีห่อเฟรม เดิมทั้งเฟรมไว้ในหัวขนาด 26 ไบต์

802.1Q เลือกวิธีต่างออกไปคือ แทรกแท็กขนาด 4 ไบต์เข้าไปกลางเฟรม แล้วปล่อย ที่เหลือไว้ตามเดิม

  ISL      หัว 26 ไบต์ ห่อทั้งเฟรม     คิดเป็น 1.7% ของ payload 1500
  802.1Q   แท็ก 4 ไบต์ แทรกกลางเฟรม    คิดเป็น 0.3%

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

ISL เลิกใช้ไปแล้ว ส่วน 802.1Q อยู่ในสวิตช์ทุกตัวที่ขายอยู่ทุกวันนี้

แท็กสี่ไบต์นั้นมีอะไร

แท็ก 802.1Q ถูกแทรกระหว่างที่อยู่ต้นทางกับฟิลด์ type ประกอบด้วย TPID 16 บิต PCP 3 บิต DEI 1 บิต และ VID 12 บิต

ตำแหน่งสำคัญ — แท็กอยู่ระหว่างที่อยู่ต้นทางกับฟิลด์ type

  ปลายทาง 6  ต้นทาง 6  [ แท็ก 4 ]  type 2  payload  FCS 4

ข้างในแท็กแบ่งเป็นสี่ส่วน

  TPID   16 บิต   0x8100 บอกว่านี่คือแท็ก ไม่ใช่ฟิลด์ type
  PCP     3 บิต   ลำดับความสำคัญ 8 ระดับ
  DEI     1 บิต   ทิ้งได้ก่อนถ้าคับคั่ง เดิมชื่อ CFI
  VID    12 บิต   หมายเลข VLAN

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

VID มี 12 บิต ซึ่งเป็นตัวเลขที่กำหนดขอบเขตของทุกอย่าง

  2^12  =  4,096 ค่า
  0     =  ไม่ระบุ VLAN บอกแค่ลำดับความสำคัญ
  4095  =  สงวนไว้ ห้ามตั้งและห้ามส่ง
          -------
  ใช้ได้จริง 4,094 VLAN

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

และแท็กทำให้เฟรมยาวขึ้น

  เฟรมปกติ        64 ถึง 1518 ไบต์
  เฟรมมีแท็ก      68 ถึง 1522 ไบต์

1522 เกิน 1518 ที่บทความ Ethernet บอกว่าเป็นเพดาน คนจึงเรียกมันว่า baby giant และอุปกรณ์เก่าที่ไม่รู้จักแท็กจะทิ้งเฟรมนี้ ว่าใหญ่เกิน ซึ่งเป็นอาการที่เจอตอนเอาสวิตช์เก่ามาต่อกับเครือข่ายที่ใช้ VLAN

พอร์ตสองแบบ

พอร์ตแบบ access อยู่ VLAN เดียวและส่งเฟรมออกโดยไม่มีแท็ก ส่วน trunk ขนหลาย VLAN บนสายเส้นเดียวโดยติดแท็กทุกเฟรม

access คือพอร์ตที่เสียบเครื่อง อยู่ VLAN เดียวที่ตั้งไว้ตายตัว เฟรมที่ออกจากพอร์ตนี้ไม่มีแท็ก

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

trunk คือสายระหว่างสวิตช์ ขนหลาย VLAN บนสายเส้นเดียว ทุกเฟรมติดแท็กบอกว่า เป็นของ VLAN ไหน

  เครื่อง  ->  สวิตช์ A   ไม่มีแท็ก
  สวิตช์ A ->  สวิตช์ B   ติดแท็ก VLAN 10
  สวิตช์ B ->  เครื่อง    ถอดแท็กออก

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

ขอบเขตที่ VLAN สร้างขึ้น

การกระจายเสียงจากเครื่องใน VLAN 10 ไปถึงเฉพาะเครื่องใน VLAN 10 ด้วยกัน เครื่องใน VLAN 20 ไม่ได้ยินอะไรเลย

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

เส้นแบ่งนี้ไม่ใช่สายที่ขาด แต่คือกฎในซอฟต์แวร์ของสวิตช์

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

native VLAN — ความผิดพลาดที่เงียบที่สุด

บน trunk มี VLAN เดียวที่ไม่ติดแท็ก เรียกว่า native และถ้าสองฝั่งตั้งไม่ตรงกัน เฟรมจะข้ามวงโดยไม่มีใครแจ้งเตือน

บน trunk มี VLAN หนึ่งที่ไม่ติดแท็ก เรียกว่า native VLAN

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

และตรงนี้คือจุดที่อันตราย ถ้าสวิตช์สองฝั่งตั้ง native ไม่ตรงกัน

  สวิตช์ A   native = VLAN 1     ส่งเฟรม VLAN 1 ออกไปโดยไม่ติดแท็ก
  สวิตช์ B   native = VLAN 99    เห็นเฟรมไม่มีแท็ก จึงถือว่าเป็น VLAN 99

เฟรมข้ามจาก VLAN 1 ไป VLAN 99 โดยไม่มีใครแจ้งเตือนอะไรเลย ไม่มีข้อความ ผิดพลาด ไม่มีล็อก ไม่มีอะไรบอกว่าขอบเขตที่คุณตั้งใจสร้างขึ้นมีรูอยู่

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

การโจมตีที่อาศัย native VLAN

ผู้โจมตีส่งเฟรมที่มีแท็กสองชั้น สวิตช์ตัวแรกถอดชั้นนอกที่ตรงกับ native ออก สวิตช์ตัวที่สองจึงเห็นแท็กชั้นในและส่งเข้า VLAN นั้น

ผู้โจมตีที่อยู่ใน VLAN เดียวกับ native ส่งเฟรมที่ติดแท็กสองชั้นซ้อนกัน

  ชั้นนอก  VLAN 1   ตรงกับ native ของ trunk
  ชั้นใน   VLAN 20  VLAN ที่ผู้โจมตีอยากเข้าไป

สวิตช์ตัวแรกเห็นแท็กชั้นนอกเป็น 1 ซึ่งตรงกับ native จึงถอดออกตามปกติแล้วส่งต่อ ไปตาม trunk

สวิตช์ตัวที่สองรับเฟรมมา เห็นแท็กชั้นในเป็น 20 ก็เชื่อตามนั้น เฟรมเข้าไปอยู่ ใน VLAN 20 เรียบร้อย โดยผู้โจมตีไม่ต้องเจาะอะไรเลยสักอย่าง

การป้องกันมีสองข้อและทั้งคู่เป็นการตั้งค่าธรรมดา

  • ตั้ง native VLAN ให้เป็นเลขที่ไม่มีใครใช้ เช่น 999
  • ไม่ให้พอร์ตของผู้ใช้อยู่ VLAN เดียวกับ native

สังเกตว่าการโจมตีนี้ส่งได้ทางเดียว — คำตอบกลับมาไม่ได้ เพราะขากลับไม่มีกลไก แบบเดียวกัน แต่ทางเดียวก็พอสำหรับหลายอย่าง

แยกแล้วก็คุยกันไม่ได้

VLAN สองวงข้ามหากันตรง ๆ ไม่ได้ ต้องมีเราเตอร์หรือสวิตช์ชั้นสามที่มีขาอยู่ในทั้งสองวง

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

ตามธรรมเนียมแล้ว หนึ่ง VLAN จะจับคู่กับหนึ่งวง IP

  VLAN 10  ->  192.168.10.0/24
  VLAN 20  ->  192.168.20.0/24

เมื่อเป็นแบบนั้น การข้าม VLAN ก็คือการข้ามวง IP ซึ่งบทความ Internet Protocol บอกไว้แล้วว่าเป็นงานของเราเตอร์เสมอ

จึงต้องมีอุปกรณ์ที่มีขาอยู่ในทั้งสอง VLAN — เราเตอร์ที่ต่อผ่าน trunk เส้นเดียว แล้วมีอินเทอร์เฟซย่อยต่อ VLAN หรือสวิตช์ชั้นสามที่ทำหน้าที่เราเตอร์ในตัว

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

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

"VLAN คือความปลอดภัย" — VLAN สร้างขอบเขต ส่วนความปลอดภัยมาจากกฎที่วางไว้ ตรงจุดข้าม VLAN แยกกันแล้วไม่วางกฎอะไรเลยที่เราเตอร์ ก็เท่ากับไม่ได้กันอะไร

"อยู่คนละ VLAN แล้วปลอดภัยจากกันแน่นอน" — native VLAN ที่ตั้งผิดทำให้เฟรม ข้ามได้ และการโจมตีแบบติดแท็กสองชั้นก็อาศัยช่องนั้น

"VLAN 1 ใช้ได้ปกติ" — ใช้ได้ทางเทคนิค แต่มันเป็นค่าเริ่มต้นของทุกพอร์ตจาก โรงงาน พอร์ตที่ยังไม่ได้ตั้งค่าจึงอยู่ใน VLAN 1 ทั้งหมด รวมถึงพอร์ตที่ลืมตั้ง

"มี 4,096 VLAN ให้ใช้" — ใช้ได้จริง 4,094 และในเครือข่ายผู้ให้บริการที่ต้อง แยกลูกค้าหลายพันราย ตัวเลขนี้ไม่พอ จึงมี 802.1ad ที่ติดแท็กสองชั้นอย่างถูกกฎหมาย โดยชั้นนอกใช้ TPID เป็น 0x88a8

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

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

กรณีที่ 1 — เครื่องได้เลข IP ผิดวง

ย้ายเครื่องไปเสียบพอร์ตใหม่ แล้วได้เลข IP จากวงที่ไม่ควรได้

อ่านอย่างไร พอร์ตนั้นอยู่คนละ VLAN กับที่ตั้งใจ DHCP ที่ตอบจึงเป็นตัวของ VLAN นั้น ไม่ใช่ตัวที่ควรตอบ

  switch# show interface Gi1/0/14 switchport
    Administrative Mode: static access
    Access Mode VLAN: 1 (default)

VLAN 1 (default) คือสัญญาณว่าพอร์ตนี้ไม่เคยถูกตั้งค่า

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

กรณีที่ 2 — บาง VLAN ข้ามสวิตช์ได้ บางอันไม่ได้

อ่านอย่างไร trunk อนุญาต VLAN ได้เป็นรายการ ไม่ใช่ปล่อยทุกอันโดยอัตโนมัติ

  switch# show interface Gi1/0/24 trunk
    Port      Vlans allowed on trunk
    Gi1/0/24  1,10,20

VLAN 30 ไม่อยู่ในรายการ เฟรมของมันจึงถูกทิ้งที่ trunk อย่างเงียบ ๆ

บทเรียน เพิ่ม VLAN ใหม่แล้วต้องไล่เพิ่มในทุก trunk บนเส้นทางด้วย ไม่ใช่แค่สร้างที่ปลายทั้งสองข้าง

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

กรณีที่ 3 — สวิตช์เก่าที่ทิ้งเฟรมเงียบ ๆ

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

อ่านอย่างไร เฟรมที่มีแท็กยาว 1522 ไบต์ อุปกรณ์เก่าที่ไม่รู้จัก 802.1Q จะถือว่าใหญ่เกิน 1518 แล้วทิ้ง

อาการจึงเป็นแบบเลือกทิ้ง — เฟรมเล็กผ่าน เฟรมใหญ่ไม่ผ่าน ซึ่งทำให้เปิดหน้าเว็บ เล็กได้แต่โหลดไฟล์ใหญ่ค้าง

  switch# show interface Gi0/1 | include giants|errors
    0 runts, 1247 giants, 0 throttles

ตัวนับ giants ที่ไม่เป็นศูนย์บนอุปกรณ์เก่าคือหลักฐานตรง

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

กรณีที่ 4 — ตรวจว่า native ตรงกันหรือเปล่า

  switchA# show interface Gi1/0/24 trunk
    Port      Native vlan
    Gi1/0/24  1

  switchB# show interface Gi1/0/24 trunk
    Port      Native vlan
    Gi1/0/24  99

อ่านอย่างไร สองฝั่งไม่ตรงกัน เฟรมที่ A ส่งออกโดยไม่ติดแท็กในฐานะ VLAN 1 จะถูก B รับเข้าเป็น VLAN 99 ขอบเขตที่ตั้งใจสร้างมีรูอยู่ตรงนี้

นี่เป็นสิ่งที่ควรตรวจทุกครั้งหลังเพิ่ม trunk เส้นใหม่ เพราะไม่มีอะไรจะเตือน

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

อ้างอิง

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

  • IEEE 802.1Q เผยแพร่ครั้งแรกปี 1998 — นิยามแท็ก 4 ไบต์ โครงสร้าง TPID PCP DEI VID ตำแหน่งที่แทรกเข้าไปในเฟรม และการขยายเฟรมสูงสุดจาก 1518 เป็น 1522
  • IEEE 802.1ad — การติดแท็กสองชั้นอย่างเป็นทางการ โดยชั้นนอกใช้ TPID 0x88a8 สำหรับเครือข่ายผู้ให้บริการที่ 4,094 VLAN ไม่พอ
  • Inter-Switch Link and IEEE 802.1Q Frame Format เอกสารของ Cisco ที่เทียบ ISL ซึ่งใช้หัว 26 ไบต์ห่อทั้งเฟรม กับ 802.1Q ที่แทรกแท็ก 4 ไบต์

อ่านประกอบบนเว็บนี้

  • Ethernet — ที่มาของเลข 1518 และของค่า 0x8100 ในตาราง EtherType
  • MAC address — สวิตช์ทำงานอย่างไร และทำไมการกระจาย เสียงถึงไปถึงทุกเครื่องบนสายเดียวกัน
  • IPv4 Subnet — วง IP ที่มักจับคู่หนึ่งต่อหนึ่งกับ VLAN

คู่มือ

  • show vlan brief · show interface switchport · show interface trunk บนสวิตช์ ซึ่งเป็นสามคำสั่งที่ตอบคำถามเกือบทั้งหมดเวลาไล่ปัญหา VLAN

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

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