ยินดีต้อนรับสู่ show running-config ครับ

บล็อก show running-config นี้สร้างไว้เพื่อเป็นแหล่งรวบรวมเทคนิคการตั้งค่าอุปกรณ์เครือข่าย Cisco ไม่ว่าจะเป็น Cisco IOS Router, Cisco Catalyst Swtich, Cisco ASA Firewall, Cisco Mars เป็นต้น รวมทั้งอาจจะมีเทคนิคการตั้งค่าอุปกรณ์ในยี่ห้ออื่น ๆ บ้างเล็กน้อยครับ

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

Saturday, October 29, 2016

MPLS ตอนที่ 3 ทำความรู้จักกับการทำงานของ MPLS ใน Control Plane


จากบทความเรื่อง MPLS ตอนที่ 1 ทำความรู้จักกับการทำงานของ MPLS ใน Dataplane ได้อธิบายวิธีการทำงานของ MPLS ใน dataplane กันไปแล้ว ซึ่งจะเป็นขั้นตอนในการส่งต่อข้อมูลบน dataplane โดยเรียกดูข้อมูลจากสิ่งที่เรียกว่า LFIB แต่ในบทความที่ผ่านมายังไม่ได้มีการอธิบายถึงกระบวนการในการสร้าง LFIB นี้ขึ้นมา ซึ่งกระบวนการในการสร้าง LFIB นี้จะเป็นกระบวนการที่เกิดขึ้นใน control plane ที่จะขอกล่าวถึงในบทความนี้นั่นเองครับ


แต่ก่อนที่จะกล่าวถึงขั้นตอนในการสร้าง LFIB จะขอย้อนไปถึงการทำงานของ cef บนอุปกรณ์ Cisco กันซักนิด (รายละเอียดอยู่ในบทความ ทำความรู้จักกับ Switching Path บน Cisco IOS Router) ในการทำงานของ IP routing โดยปกติที่ใช้ในการส่งต่อแพ็คเก็ต IP นั้น จะทำงานโดยใช้ FIB ในการส่งต่อข้อมูลบน dataplane (คล้าย ๆ กับ LFIB ของ MPLS) ซึ่งขั้นตอนในการสร้าง FIB ขึ้นมา ก็จะใช้โปรโตคอลใน control plane ได้หลากหลายชนิด เช่น routing protocol ต่าง ๆ ในการสร้าง IP routing table ขึ้นมา จากนั้นจึงจะมีกระบวนการในการสร้าง FIB ขึ้นมาอีกทีนึง ส่วนในโลกของ MPLS ก็จะมีลักษณะการทำงานที่คล้าย ๆ กัน โดย MPLS ก็จะใช้โปรโตคอลใน control plane หลากหลายชนิดเพื่อทำการสร้างและแลกเปลี่ยน MPLS label ที่จะใช้งานกับแต่ละ prefix ระหว่างเราเตอร์ LSR เพื่อให้สามารถนำ label นั้นไปยังงานยัง FIB และ LFIB ได้อย่างถูกต้อง

โปรโตคอลใน control plane ของ MPLS มีได้หลายรูปแบบ ในการที่จะเลือกโปรโตคอลใดมาใช้งาน ก็ขึ้นอยู่กับว่าจะใช้งาน MPLS ในรูปแบบใด เช่น ถ้าต้องการใช้งาน MPLS layer 3 VPN ก็อาจจะใช้โปรโตคอล 2 ชนิด คือ LDP และ MP-BGP เป็นต้น แต่ในบทความนี้ เพื่อให้เข้าใจถึงหลักการทำงานของ MPLS ใน control plane กันเสียก่อน จึงจะใช้งาน MPLS ในแบบพื้นฐานที่เรียกว่า MPLS unicast IP forwarding ซึ่งเป็นการใช้งาน MPLS สำหรับการส่งต่อแพ็คเก็ตแบบ unicast IP ทั่วไปเท่านั้น (ยังไม่มีการทำ VPN) โปรโตคอลใน control plane ที่จะใช้งานในบทความนี้ก็จะใช้เพียง IGP อย่างเช่น OSPF กับ LDP ในการทำงานเท่านั้น

ทำความรู้จักกับ MPLS LDP


ในโลกของ IP routing การแลกเปลี่ยนข้อมูลเส้นทางกับเราเตอร์เพื่อนบ้าน เราเตอร์ก็จะใช้งาน routing protocol ชนิดต่าง ๆ ยกตัวอย่างเช่น EIGRP, OSPF, BGP เป็นต้น เพื่อแลกเปลี่ยนข้อมูลเส้นทางระหว่างเราเตอร์แต่ละตัว ในการทำงานของ MPLS ที่จะทำการส่งต่อแพ็คเก็ตโดยใช้ label เป็นหลัก ก็จะมีการแลกเปลี่ยนข้อมูล label ระหว่างเราเตอร์แต่ละตัวเช่นกัน เราเตอร์ก็จะมีการใช้งานโปรโตคอลในการแลกเปลี่ยนข้อมูล label ระหว่างกัน โดยโปรโตคอลที่ว่าก็คือ LDP นั่นเอง (ที่จริงมีอีกโปรโตคอลคือ TDP แต่จะเป็น cisco proprietary protocol และไม่ค่อยได้รับความนิยมในการใช้งาน) ข้อความที่โปรโตคอลทำการแลกเปลี่ยนกับเราเตอร์ LSR เพื่อนบ้านนี้ ภายในก็จะประกอบไปด้วย IP prefix และข้อมูล label ที่ใช้งานกับแต่ละ prefix เสมือนเป็นการส่งข้อมูลไปบอกเราเตอร์ LSR เพื่อนบ้านว่า "ถ้าคุณต้องการจะส่งแพ็คเก็ตไปยัง IP prefix ปลายทางนี้ ให้ทำการส่งแพ็คเก็ตมาด้วย MPLS label ตามรายการนี้" นั่นเอง



เมื่อมีการเรียนรู้เส้นทางใหม่เข้ามาใน IP routing table เราเตอร์ LSR ก็จะทำการจัดสรร label ที่เรียกว่า local label ขึ้นมา โดยค่า local label นี้ จะเป็น label ที่เชื่อมโยงกับแต่ละ prefix บนเราเตอร์ตัวปัจจุบันเท่านั้น เช่น เราเตอร์ PE2 ได้เรียนรู้ prefix 10.8.8.0/24 เข้ามา ก็จะทำการจัดสรร label หมายเลข 84 ให้กับ prefix 10.8.8.0/24 นี้ จากนั้นก็จะทำการประกาศข้อมูล local label และ prefix ที่เชื่อมโยงกันนี้ไปให้กับเราเตอร์ P1 และ P2 ผ่านทางโปรโตคอล LDP เสมือนเป็นการบอกเราเตอร์ P1 และ P2 ว่า "ถ้าจะทำการส่งแพ็คเก็ตไปยัง prefix 10.8.8.0/24 เข้ามายังเราเตอร์ PE2 ให้ทำการส่งแพ็คเก็ตมาด้วย MPLS label เป็น 84"  และเมื่อเราเตอร์ P1 และ P2 ได้รับข้อมูล local label ที่เราเตอร์ PE2 ส่งมาแล้ว จะเรียก label ที่ได้เรียนรู้เข้ามานี้ว่า remote label ซึ่งจะหมายถึงข้อมูล label ของเราเตอร์เพื่อนบ้านที่ได้เรียนรู้เข้ามานั่นเอง ดังนั้นก่อนที่เราเตอร์ P1 และ P2 จะทำการส่งแพ็คเก็ต MPLS ที่มีปลายทางเป็น 10.8.8.0/24 ไปให้กับเราเตอร์ PE2 ก็จะต้องทำการ swap label เป็น 84 มาให้ก่อนจึงจะทำการส่งต่อแพ็คเก็ตได้อย่างถูกต้อง

ด้วยการทำงานของ LDP ในรูปแบบด้านบน ก็จะทำการแลกเปลี่ยนข้อมูล label ในทุก ๆ IP prefix บนเราเตอร์ภายในเครือข่าย MPLS ทุกตัว โดยเมื่อทำการแลกเปลี่ยนข้อมูล label กันเสร็จสิ้นแล้ว เส้นทางที่จะใช้งานไปยังแต่ละปลายทางบนเครือข่าย MPLS นี้ จะถูกเรียกว่า LSP (Label Switched Paths) โดยเราเตอร์ต้นทางของ LSP จะเรียกว่า ingress LSR และเราเตอร์ตัวสุดท้ายใน LSP ของแต่ละเส้นทางก็จะถูกเรียกว่า egress LSR โดย LSP ที่ใช้ไปยังแต่ละปลายทางอาจจะมีได้มากกว่าหนึ่งเส้นทาง เพื่อใช้เป็นเส้นทางสำรองหรือเพื่อใช้งานในกรณีอื่น ๆ ก็ได้ โดย LSP ในเครือข่าย MPLS นี้จะใช้งานในลักษณะที่เรียกว่า unidirectional โดยจะหมายถึงเป็นเส้นทางที่สร้างขึ้นเพียงทิศทางเดียวเท่านั้น แต่ด้วยการติดต่อสื่อสารโดยทั่วไปจะมีการใช้งานในลักษณะ bidirectional จึงจะต้องใช้งานอีก LSP นึงเป็นเส้นทางในฝั่งขากลับด้วยนั่นเอง (เส้นทางขาไปและขากลับอาจจะเป็นคนละเส้นทางกันก็ได้) ทั้งนี้ในการสร้างข้อมูลบน LIB จะสร้างจากปลายทางย้อนไปยังแต่ละต้นทาง แต่ในการสร้าง LSP จะทำการสร้างจากต้นทางไปยังปลายทาง (LSP จะถูกสร้างย้อนทางกับการสร้างรายการบน LIB)

ในการสร้างความสัมพันธ์กับเพื่อนบ้าน LDP จะทำการส่งข้อความ hello ผ่านทางที่อยู่แบบมัลติคาสต์หมายเลข 224.0.0.2 ด้วย UDP พอร์ต 646 และหลังจากสร้างความสัมพันธ์กับเพื่อนบ้านผ่านทางข้อความ hello แล้ว จะทำการสร้าง TCP connection ไปยังเพื่อนบ้านแต่ละตัว ผ่านทาง TCP พอร์ต 646 และหลังจากสร้าง TCP connection เสร็จเรียบร้อยแล้วจึงจะเริ่มทำการส่งข้อมูล local label และ prefix ของแต่ละ LSR แลกเปลี่ยนกัน

คุณสมบัติ
การทำงานของ LDP
Transport Protocol
UDP (hello), TCP (updates)
Port Number
646
Hello destination address
224.0.0.2
ผู้เริ่มสร้าง connection
LSR ที่มี LDP ID สูงสุด
หมายเลข IP address ที่ใช้สำหรับการสร้าง TCP connection
Transport IP address (ถ้าได้ตั้งค่าเอาไว้) หรือ LDP ID ถ้าไม่ได้ตั้งค่า Transport IP address เอาไว้
การคัดเลือก LDP ID


  • จากการกำหนดค่า LDP ID
  • กรณีที่ไม่ได้ตั้งค่า LDP ID จะเลือกจาก Loopback IP ที่สูงที่สุด และอยู่ในสถานะ UP/UP
  • กรณีที่ไม่พบ Loopback IP ที่อยู่ในสถานะ UP/UP จะเลือกจาก IP address ของอินเทอร์เฟสอื่น ๆ ที่สูงที่สุด และอยู่ในสถานะ UP/UP



การทำงานของ MPLS ใน Control Plane


กระบวนการสร้าง LFIB ซึ่งเป็นฐานข้อมูลที่เราเตอร์ LSR จะใช้ในการตัดสินใจส่งต่อแพ็คเก็ต MPLS นั้น จะประกอบขึ้นมาจากข้อมูลในส่วนของ control plane และ data plane หลาย ๆ ส่วนรวมกัน โดยจะมี table ที่เกี่ยวข้องหลายชนิด ตั้งแต่ RIB, FIB, LIB, LFIB และ adjacency table ภาพด้านล่างนี้ จะแสดงถึงความเกี่ยวเนื่องในการทำงานร่วมกันระหว่าง table ต่าง ๆ โดยที่ RIB, FIB และ adjacency table นั้นจะมีใช้งานอยู่บนเราเตอร์ Cisco IOS ที่ทำการส่งต่อแพ็คเก็ต IP แบบทั่วไปที่ไม่มีการใช้งาน label อยู่แล้ว (รายละเอียดอยู่ในบทความ ทำความรู้จักกับ Switching Path บน Cisco IOS Router) ส่วน LIB และ LFIB จะเกิดขึ้นมาก็ต่อเมื่อมีการใช้งาน MPLS เท่านั้น

  • RIB (routing information base) - ก็คือ IP routing table บนอุปกรณ์เราเตอร์ โดยจะทำการจัดเก็บข้อมูลเส้นทางที่ใช้งานอยู่ในปัจจุบันของเราเตอร์ทั้งหมด โดยจะได้รับรายละเอียดข้อมูลเส้นทาง, อินเทอร์เฟสขาออก และ next-hop มาจาก routing protocol ต่าง ๆ ไม่ว่าจะเป็น Connected, Static, OSPF, EIGRP, IS-IS, RIP, BGP เราสามารถตรวจสอบรายการใน RIB ได้ ด้วยการใช้คำสั่ง "show ip route"
  • LIB (label information base) - คือที่เก็บข้อมูล label และ prefix ทั้งหมด ทั้งที่สร้างขึ้นมาเอง (local label) และที่ได้รับข้อมูลมาจากเพื่อนบ้าน (remote label) โดยจะได้รับข้อมูล prefix มาจาก RIB และจะทำการจัดสรร local label ให้กับ prefix เหล่านั้น จากนั้นก็จะเรียนรู้ข้อมูล remote label ที่เชื่อมโยงกับแต่ละ prefix เข้ามาด้วยวิธีการต่าง ๆ เช่น Static, LDP, TDP เป็นต้น โดยข้อมูลที่อยู่ใน LIB จะเป็นข้อมูล prefix และ label ที่เชื่อมโยง ทั้งหมดที่เราเตอร์ LSR ได้เรียนรู้เข้ามา โดยไม่สนใจว่าจะเป็น LSP ที่จะใช้สำหรับการส่งต่อแพ็คเก็ตหรือไม่ (ไม่ได้เก็บข้อมูลเฉพาะ LSP ที่ดีที่สุดที่จะใช้ในการส่งต่อแพ็คเก็ตเท่านั้น) โดยสามารถตรวจสอบรายการใน LIB ได้ด้วยการใช้คำสั่ง "show mpls ldp binding" หรือ "show mpls static binding" ในกรณีที่เรียนรู้ label มาแบบ static
  • FIB (forwarding information base) - คือที่เก็บข้อมูลที่จำเป็นสำหรับที่จะใช้ในการส่งต่อ IP packet ที่เข้ามายังอินเทอร์เฟสของเราเตอร์ โดยจะทำการสร้าง cache ของ prefix ทั้งหมดตามข้อมูลเส้นทางใน RIB เอาไว้ เพื่อที่จะได้สามารถทำการส่งต่อแพ็คเก็ตได้ทันที และจะใช้ข้อมูลจาก adjacency table เพื่อสร้าง layer 2 header ขึ้นมาใหม่เมื่อจะทำการส่งต่อแพ็คเก็ตออกไปยังอินเทอร์เฟสขาออก เพื่อลดการใช้งาน CPU ของเราเตอร์ลง  โดยอาจจะมีบาง prefix ที่จะทำการเก็บข้อมูล label ที่ได้รับมาจาก LIB เอาไว้ด้วย (เพื่อใช้งานในกรณีที่จะ push label เข้าสู่เครือข่าย MPLS) แพ็คเก็ตที่ถูกส่งต่อจาก FIB โดยทั่วไปจะเป็น IP packet ที่ไม่มีการใช้งาน label แต่ในกรณีที่ทำการ push label เข้าสู่เครือข่าย MPLS จะทำการส่งต่อแพ็คเก็ตออกมาเป็น MPLS packet (ในกรณีที่เราเตอร์ตัวปัจจุบันเป็น ingress LSR) เราสามารถตรวจสอบรายการที่อยู่ใน FIB ได้ด้วยการใช้คำสั่ง "show ip cef"
  • LFIB (label forwarding information base) - คือที่เก็บข้อมูลที่จำเป็นสำหรับที่จะใช้ในการส่งต่อ MPLS packet ที่เข้ามายังอินเทอร์เฟสของเราเตอร์ LSR จะเก็บข้อมูลเฉพาะ LSP ที่ดีที่สุดที่จะใช้ในการส่งต่อแพ็คเก็ตไปยังปลายทาง โดยจะได้รับข้อมูล prefix และ label มาจาก LIB ส่วนข้อมูลอินเทอร์เฟสขาออก (outgoing interface) และข้อมูล next-hop ที่จะใช้ในการส่งต่อแพ็คเก็ตจะได้รับมาจาก FIB และจะใช้ข้อมูลจาก adjacency table เพื่อสร้าง layer 2 header ขึ้นมาใหม่เมื่อจะทำการส่งต่อแพ็คเก็ตออกไปยังอินเทอร์เฟสขาออก แพ็คเก็ตที่ถูกส่งต่อจาก LFIB โดยทั่วไปจะเป็น MPLS packet แต่ในกรณีที่จะทำการ pop label ออกจากแพ็คเก็ตจะทำการส่งต่อแพ็คเก็ตออกมาเป็น IP packet ที่ไม่มีการใช้งาน label (ในกรณีที่เราเตอร์ตัวปัจจุบันเป็น egress LSR) เราสามารถทำการตรวจสอบรายการที่อยู่ใน LFIB ได้ด้วยการใช้คำสั่ง "show mpls forwarding-table"
  • Adjacency table - ที่เก็บข้อมูล datalink header ของอุปกรณ์ตัวถัดไปที่เชื่อมต่ออยู่โดยตรงกับอินเทอร์เฟสของเราเตอร์ตัวปัจจุบัน เพื่อให้สามารถส่งต่อแพ็ตเก็ตออกไปยังอินเทอร์เฟสขาออกได้ทันที โดยไม่ต้องเสียเวลาไปทำการดึงข้อมูล layer 2 จาก table ต่าง ๆ เมื่อจะทำการ switching packet เราสามารถตรวจสอบรายการใน adjacency table ได้ด้วยการใช้คำสั่ง "show adjacency detail"

ตัวอย่างการสร้าง LSP และการทำงานของ LDP บนเราเตอร์ในเครือข่าย MPLS

ภาพด้านล่างเป็นตัวอย่างการทำงานของเครือข่าย MPLS โดยในตัวอย่างนี้ จะมีเราเตอร์ PE1, PE2, P1 และ P2 ที่ทำงานอยู่ภายใต้เครือข่าย MPLS ส่วนเราเตอร์ CE1 และ CE2 จะทำงานอยู่บนเครือข่าย IP ตามปกติเท่านั้น โดยต้องการรับ-ส่งข้อมูลจาก Host A (10.1.1.1) ไปยัง Host B (10.8.8.8) ซึ่งในความเป็นจริงแล้วจะต้องทำการสร้างทั้งหมด 2 LSP ด้วยกัน คือ LSP ในการส่งข้อมูลขาไป และ LSP ในการส่งข้อมูลขากลับ โดยในตัวอย่างนี้จะขอยกตัวอย่างเฉพาะการสร้าง LSP สำหรับการส่งข้อมูลขาไปเท่านั้นนะครับ และจากที่กล่าวไว้ด้านบน ที่ว่า "ในการสร้างข้อมูลบน LIB จะสร้างจากปลายทางย้อนไปยังแต่ละต้นทาง แต่ในการสร้าง LSP จะทำการสร้างจากต้นทางไปยังปลายทาง (LSP จะถูกสร้างย้อนทางกับการสร้างรายการบน LIB)" ดังนั้นในการสร้าง LSP สำหรับการส่งข้อมูลจาก Host A (10.1.1.1) ไปยัง Host B (10.8.8.8) ก็จะต้องเริ่มต้นด้วยการสร้างข้อมูลใน LIB โดยจะเริ่มสร้างจากเราเตอร์ในฝั่งปลายทางของเครือข่าย MPLS (PE2) มานะครับ



กระบวนการทำงานของเราเตอร์แต่ละตัวตั้งแต่ได้รับ prefix เข้ามาสู่เครื่อข่าย MPLS มีดังนี้

1.เราเตอร์ PE2 เรียนรู้ข้อมูลเส้นทางใหม่ (10.8.8.0/24) เข้ามายัง RIB ผ่านทาง OSPF routing protocol

ตัวอย่างการใช้คำสั่ง "show ip route" เพื่อตรวจสอบการทำงานของ RIB และใช้คำสั่ง "show ip cef" เพื่อตรวจสอบการทำงานของ FIB
PE2#show ip route 10.8.8.0 255.255.255.0
Routing entry for 10.8.8.0/24
  Known via "ospf 1", distance 110, metric 20, type intra area
  Last update from 10.6.7.1 on Ethernet0/0, 00:00:01 ago
  Routing Descriptor Blocks:
  * 10.6.7.1, from 10.8.8.254, 00:00:01 ago, via Ethernet0/0
      Route metric is 20, traffic share count is 1

PE2#show ip cef 10.8.8.0/24
10.8.8.0/24
  nexthop 10.6.7.1 Ethernet0/0


2.เราเตอร์ PE2 ทำการจัดสรร local label ใหม่ (84) ที่ยังไม่เคยใช้งาน มาใช้งานกับ prefix 10.8.8.0/24

ตัวอย่างการใช้คำสั่ง "show mpls ldp bindings" เพื่อตรวจสอบการทำงานของ LIB และใช้คำสั่ง "show mpls forwarding-table" เพื่อตรวจสอบการทำงานของ LFIB
PE2#show mpls ldp bindings 10.8.8.0 24
  lib entry: 10.8.8.0/24, rev 25
        local binding:  label: 84


PE2#show mpls forwarding-table 10.8.8.0
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop
Label      Label      or Tunnel Id     Switched      interface

84         No Label   10.8.8.0/24      0             Et0/0      10.6.7.1

จากตัวอย่างด้านบน จะเห็นว่าเมื่อได้เรียนรู้ prefix 10.8.8.0/24 เข้ามาใน RIB เราเตอร์ PE2 จะทำการสร้างรายการของ prefix 10.8.8.0/24 ขึ้นมาใน LIB และทำการจัดสรร local label ใหม่หมายเลข 84 ที่ยังไม่เคยใช้งานให้กับ prefix 10.8.8.0/24 จากนั้นจะทำการสร้างรายการของ prefix 10.8.8.0/24 ขึ้นมาใน LFIB โดยมี local label เป็น 84 แต่จะเห็นว่ามี outgoing label เป็นค่า "No Label" ก็เนื่องจากเราเตอร์ PE2 เป็น egress LSR หรือเป็นเราเตอร์ตัวสุดท้ายใน LSP ที่มีหน้าที่ในการ pop MPLS label ออกจากแพ็คเก็ตแล้วนั่นเอง

3.เราเตอร์ PE2 ทำการอัปเดต prefix 10.8.8.0/24 ที่ได้เรียนรู้มาใหม่นี้ ไปยัง OSPF neighbor (เราเตอร์ P1 และ P2) จากนั้นจึงจะทำการประกาศข้อมูล local label (84) ที่เชื่อมโยงกับ prefix 10.8.8.0/24 ไปยัง LDP neighbor (เราเตอร์ P1 และ P2) ผ่านทางโปรโตคอล LDP

ตัวอย่างการใช้คำสั่ง "show ip ospf neighbor" และ "show mpls ldp neighbor" เพื่อตรวจสอบรายการเพื่อนบ้านของโปรโตคอล OSPF และ LDP บนเราเตอร์ PE2
PE2#show ip ospf neighbor
Neighbor ID     Pri   State           Dead Time   Address         Interface
3.3.3.3           0   FULL/  -        00:00:39    172.16.4.2      Serial1/1
2.2.2.2           0   FULL/  -        00:00:37    172.16.3.2      Serial1/0
10.8.8.254        1   FULL/DR         00:00:31    10.6.7.1        Ethernet0/0

PE2#show mpls ldp neighbor
    Peer LDP Ident: 2.2.2.2:0; Local LDP Ident 4.4.4.4:0
        TCP connection: 2.2.2.2.646 - 4.4.4.4.43709
        State: Oper; Msgs sent/rcvd: 63/59; Downstream
        Up time: 00:37:55
        LDP discovery sources:
          Serial1/0, Src IP addr: 172.16.3.2
        Addresses bound to peer LDP Ident:
          172.16.0.2      2.2.2.2         172.16.2.1      172.16.3.2
    Peer LDP Ident: 3.3.3.3:0; Local LDP Ident 4.4.4.4:0
        TCP connection: 3.3.3.3.646 - 4.4.4.4.60920
        State: Oper; Msgs sent/rcvd: 59/58; Downstream
        Up time: 00:37:48
        LDP discovery sources:
          Serial1/1, Src IP addr: 172.16.4.2
        Addresses bound to peer LDP Ident:
          172.16.1.2      3.3.3.3         172.16.2.2      172.16.4.2

จากข้อมูลบน LFIB ในปัจจุบัน ตอนนี้เราเตอร์ PE2 ก็พร้อมที่จะประมวลผลแพ็คเก็ต MPLS ที่ถูกส่งเข้ามาโดยมีการใช้งาน label หมายเลข 84 แล้ว โดยถ้าได้รับแพ็คเก็ต MPLS ที่มี label 84 เข้ามา ก็จะทำการส่งต่อแพ็คเก็ตออกไปทางอินเทอร์เฟส Ethernet0/0 ไปยัง next-hop 10.6.7.1 ตามข้อมูลที่ได้รับมาจาก FIB โดยจะเห็นว่าการใช้งาน MPLS นั้นจะต้องมีการใช้งาน IP routing protocol ในการทำงานร่วมกัน เพื่อแลกเปลี่ยนข้อมูลเส้นทางต่าง ๆ และเพื่อให้กระบวนการของ LDP สามารถทำการแลกเปลี่ยนข้อมูล label กันได้ โดยเฉพาะการใช้งาน MPLS unicast IP forwarding ที่จะต้องมีการใช้ IGP ในการแลกเปลี่ยนข้อมูลเส้นทาง ตามตัวอย่างนี้ที่จะใช้งาน OSPF ในการแลกเปลี่ยนข้อมูลเส้นทางกันนั่นเอง โดยการสร้าง LSP ในขั้นตอนนี้ เป็นเพียงส่วนหนึ่งของ LSP ทั้งหมดเท่านั้น ซึ่งจะต้องมีการทำงานต่อเนื่องในขั้นตอนต่อ ๆ ไป เพื่อให้สามารถสร้าง LSP ได้ครบตลอดเส้นทาง


4.เมื่อเราเตอร์ P1 ได้รับ OSPF update และ LDP advertisement เข้ามาจะมีการทำงานดังนี้
  • จัดสรร local label (39) ที่ยังไม่เคยใช้งานมาก่อนให้กับ prefix 10.8.8.0/24 ใน LIB
  • นำข้อมูล local label (84) ที่ PE2 ทำการส่งมาให้ มาใช้งานเป็น remote label (84) ใน LIB บนตัวมัน 
  • ทำการสร้างรายบน LFIB โดยมีรายละเอียดดังนี้
    • ได้รับข้อมูล prefix 10.8.8.0/24 และ local label 39 และ outgoing label 84 (label ที่จะใช้งานในการส่งแพ็คเก็ตออกไป) มาจาก LIB
    • ได้รับข้อมูล outgoing interface serial1/2 และ next-hop มาจาก FIB
  • ทำการอัปเดต prefix 10.8.8.0/24 ที่ได้เรียนรู้มาใหม่นี้ ไปยัง OSPF neighbor (PE1 และ P2)
  • ใช้โปรโตคอล LDP ในการประกาศข้อมูล local label (39) ที่เชื่อมโยงกับ prefix 10.8.8.0/24 ไปยัง LDP neighbor ของมันทั้ง 3 ตัว (รวมทั้งเราเตอร์ PE2 ที่ประกาศข้อมูล label มาให้ด้วย)
ตัวอย่างการตรวจสอบบนเราเตอร์ P1
  • "show ip cef" เพื่อตรวจสอบรายการบน FIB
  • "show mpls ldp bindings" เพื่อตรวจสอบรายการบน LIB
  • "show mpls forwarding-table" เพื่อตรวจสอบรายการบน LFIB
  • "show mpls ldp neighbor" เพื่อตรวจสอบรายการของ LDP neighbor

P1#show ip cef 10.8.8.0/24
10.8.8.0/24
  nexthop 172.16.3.1 Serial1/2 label 84

P1#show mpls ldp bindings 10.8.8.0 255.255.255.0
  lib entry: 10.8.8.0/24, rev 39
        local binding:  label: 39
        remote binding: lsr: 4.4.4.4:0, label: 84

P1#show mpls forwarding-table 10.8.8.0
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop
Label      Label      or Tunnel Id     Switched      interface
39         84         10.8.8.0/24      0             Se1/2      point2point

P1#show mpls ldp neighbor
    Peer LDP Ident: 4.4.4.4:0; Local LDP Ident 2.2.2.2:0
        TCP connection: 4.4.4.4.27041 - 2.2.2.2.646
        State: Oper; Msgs sent/rcvd: 23/21; Downstream
        Up time: 00:04:28
        LDP discovery sources:
          Serial1/2, Src IP addr: 172.16.3.1
        Addresses bound to peer LDP Ident:
          10.6.7.2        4.4.4.4         172.16.3.1      172.16.4.1
    Peer LDP Ident: 3.3.3.3:0; Local LDP Ident 2.2.2.2:0
        TCP connection: 3.3.3.3.52293 - 2.2.2.2.646
        State: Oper; Msgs sent/rcvd: 23/22; Downstream
        Up time: 00:04:28
        LDP discovery sources:
          Serial1/1, Src IP addr: 172.16.2.2
        Addresses bound to peer LDP Ident:
          3.3.3.3         172.16.2.2      172.16.4.2      172.16.1.2
    Peer LDP Ident: 1.1.1.1:0; Local LDP Ident 2.2.2.2:0
        TCP connection: 1.1.1.1.646 - 2.2.2.2.32195
        State: Oper; Msgs sent/rcvd: 16/16; Downstream
        Up time: 00:04:30
        LDP discovery sources:
          Serial1/0, Src IP addr: 172.16.0.1
        Addresses bound to peer LDP Ident:
          10.2.3.2        1.1.1.1         172.16.0.1      172.16.1.1


5.เมื่อเราเตอร์ P2 ได้รับ OSPF update และ LDP advertisement เข้ามาจะมีการทำงานดังนี้
  • จัดสรร local label (63) ที่ยังไม่เคยใช้งานมาก่อนให้กับ prefix 10.8.8.0/24 ใน LIB
  • นำข้อมูล local label (84) ที่ PE2 ทำการส่งมาให้ มาใช้งานเป็น remote label (84) ใน LIB บนตัวมัน 
  • ทำการสร้างรายบน LFIB โดยมีรายละเอียดดังนี้
    • ได้รับข้อมูล prefix 10.8.8.0/24 และ local label 63 และ outgoing label 84 (label ที่จะใช้งานในการส่งแพ็คเก็ตออกไป) มาจาก LIB
    • ได้รับข้อมูล outgoing interface serial1/2 และ next-hop มาจาก FIB
  • ทำการอัปเดต prefix 10.8.8.0/24 ที่ได้เรียนรู้มาใหม่นี้ ไปยัง OSPF neighbor (PE1 และ P1)
  • ใช้โปรโตคอล LDP ในการประกาศข้อมูล local label (63) ที่เชื่อมโยงกับ prefix 10.8.8.0/24 ไปยัง LDP neighbor ของมันทั้ง 3 ตัว (รวมทั้งเราเตอร์ PE2 ที่ประกาศข้อมูล label มาให้ด้วย)
ตัวอย่างตรวจสอบบนเราเตอร์ P2
  • "show ip cef" เพื่อตรวจสอบรายการบน FIB
  • "show mpls ldp bindings" เพื่อตรวจสอบรายการบน LIB
  • "show mpls forwarding-table" เพื่อตรวจสอบรายการบน LFIB
  • "show mpls ldp neighbor" เพื่อตรวจสอบรายการของ LDP neighbor
P2#show ip cef 10.8.8.0/24
10.8.8.0/24
  nexthop 172.16.4.1 Serial1/2 label 84

P2#show mpls ldp bindings 10.8.8.0 255.255.255.0
  lib entry: 10.8.8.0/24, rev 40
        local binding:  label: 63
        remote binding: lsr: 4.4.4.4:0, label: 84

P2#show mpls forwarding-table 10.8.8.0

Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop
Label      Label      or Tunnel Id     Switched      interface
63         84         10.8.8.0/24      0             Se1/2      point2point

P2#show mpls ldp neighbor

    Peer LDP Ident: 4.4.4.4:0; Local LDP Ident 3.3.3.3:0
        TCP connection: 4.4.4.4.60920 - 3.3.3.3.646
        State: Oper; Msgs sent/rcvd: 205/204; Downstream
        Up time: 02:45:00
        LDP discovery sources:
          Serial1/2, Src IP addr: 172.16.4.1
        Addresses bound to peer LDP Ident:
          10.6.7.2        4.4.4.4         172.16.3.1      172.16.4.1
    Peer LDP Ident: 1.1.1.1:0; Local LDP Ident 3.3.3.3:0
        TCP connection: 1.1.1.1.646 - 3.3.3.3.32954
        State: Oper; Msgs sent/rcvd: 120/119; Downstream
        Up time: 01:31:05
        LDP discovery sources:
          Serial1/0, Src IP addr: 172.16.1.1
        Addresses bound to peer LDP Ident:
          10.2.3.2        1.1.1.1         172.16.0.1      172.16.1.1
    Peer LDP Ident: 2.2.2.2:0; Local LDP Ident 3.3.3.3:0
        TCP connection: 2.2.2.2.646 - 3.3.3.3.26972
        State: Oper; Msgs sent/rcvd: 40/40; Downstream
        Up time: 00:20:49
        LDP discovery sources:
          Serial1/1, Src IP addr: 172.16.2.1
        Addresses bound to peer LDP Ident:
          2.2.2.2         172.16.2.1      172.16.3.2      172.16.0.2

จากนั้นก็จะทำกระบวนการเดิม ๆ บน LSR ทุก ๆ ตัว โดยในแต่ละครั้งที่ LSR ได้เรียนรู้ข้อมูลเส้นทางใหม่เข้ามา LSR ก็จะทำการจัดสรร local label ที่ยังไม่มีการใช้งานไปให้บน LIB และก็จะทำการประกาศ local label และ prefix ที่เชื่อมโยงกันไปยัง LDP neighbor และเมื่อทำการอัปเดตบนเราเตอร์ทุก ๆ ตัวในเครือข่าย MPLS แล้ว LSR แต่ละตัวก็จะมีข้อมูลที่เพียงพอต่อการส่งต่อแพ็คเก็ตบน dataplane จาก เราเตอร์ตัวแรกสุดของ LSP (ingress LSR) ไปยังเราเตอร์ตัวสุดท้ายของ LSP (egress LSR) ได้ แต่ให้ทราบไว้ว่าก่อนที่จะสามารถทำการส่งต่อแพ็คเก็ตโดยใช้ LFIB ได้นั้น จริง ๆ แล้วจะมีขั้นตอนอะไรบ้างเพื่อที่จะสร้างข้อมูลใน LFIB นี้ขึ้นมาบ้าง

เมื่อทำการแลกเปลี่ยนข้อมูลกันเสร็จสิ้นทั้งเครือข่าย MPLS แล้ว ข้อมูลที่อยู่บนเราเตอร์ PE1, P1, P2 และ PE2 จะมีรายละเอียด ดังนี้

PE1#show ip cef 10.8.8.0/24
10.8.8.0/24
  nexthop 172.16.0.2 Serial1/0 label 39
  nexthop 172.16.1.2 Serial1/1 label 63

PE1#show mpls ldp bindings 10.8.8.0 255.255.255.0
  lib entry: 10.8.8.0/24, rev 41
        local binding:  label: 25
        remote binding: lsr: 3.3.3.3:0, label: 63
        remote binding: lsr: 2.2.2.2:0, label: 39

PE1#show mpls forwarding-table 10.8.8.0
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop
Label      Label      or Tunnel Id     Switched      interface
25         39         10.8.8.0/24      0             Se1/0      point2point
           63         10.8.8.0/24      0             Se1/1      point2point

เราเตอร์ PE1 ได้รับอัปเดต prefix 10.8.8.0/24 มาจาก P1 และ P2 ทำให้จะทำการส่งข้อมูลแบบ ECMP ไปยัง next-hop ทั้งสองตัว ดังนั้นใน LFIB จึงจะเห็น outgoing label มี 2 เส้นทางด้วย และในกรณีนี้เราเตอร์ PE1 เป็นเราเตอร์ตัวแรกสุดใน LSP (ingress LSR) จึงจะเห็นว่าใน FIB จะมีข้อมูล label อยู่ด้วย ซึ่งจะใช้งานสำหรับการ push MPLS label เข้าไปเมื่อจะทำการส่งต่อแพ็คเก็ตเข้าสู่เครือข่าย MPLS นั่นเอง

P1#show ip cef 10.8.8.0/24
10.8.8.0/24
  nexthop 172.16.3.1 Serial1/2 label 84

P1#show mpls ldp bindings 10.8.8.0 255.255.255.0
  lib entry: 10.8.8.0/24, rev 39
        local binding:  label: 39
        remote binding: lsr: 4.4.4.4:0, label: 84
        remote binding: lsr: 3.3.3.3:0, label: 63
        remote binding: lsr: 1.1.1.1:0, label: 25

P1#show mpls forwarding-table 10.8.8.0
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop
Label      Label      or Tunnel Id     Switched      interface
39         84         10.8.8.0/24      0             Se1/2      point2point


P2#show ip cef 10.8.8.0/24
10.8.8.0/24
  nexthop 172.16.4.1 Serial1/2 label 84

P2#show mpls ldp bindings 10.8.8.0 255.255.255.0
  lib entry: 10.8.8.0/24, rev 40
        local binding:  label: 63
        remote binding: lsr: 1.1.1.1:0, label: 25
        remote binding: lsr: 4.4.4.4:0, label: 84
        remote binding: lsr: 2.2.2.2:0, label: 39

P2#show mpls forwarding-table 10.8.8.0
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop
Label      Label      or Tunnel Id     Switched      interface
63         84         10.8.8.0/24      0             Se1/2      point2point


PE2#show ip cef 10.8.8.0/24
10.8.8.0/24
  nexthop 10.6.7.1 Ethernet0/0

PE2#show mpls ldp bindings 10.8.8.0 255.255.255.0
  lib entry: 10.8.8.0/24, rev 25
        local binding:  label: 84
        remote binding: lsr: 2.2.2.2:0, label: 39
        remote binding: lsr: 3.3.3.3:0, label: 63

PE2#show mpls forwarding-table 10.8.8.0
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop
Label      Label      or Tunnel Id     Switched      interface
84         No Label   10.8.8.0/24      0             Et0/0      10.6.7.1

เราเตอร์ P1, P2 และ PE2 จะแลกเปลี่ยนข้อมูล label กันด้วยโปรโตคอล LDP และจัดเก็บข้อมูลที่แลกเปลี่ยนกันเอาไว้บน LIB ซึงจะเป็นข้อมูล label ที่ได้เรียนรู้มาจาก LDP neighbor ทั้งหมด โดยไม่สนใจว่าจะเป็น LSP ที่จะใช้งานหรือไม่ ตัวอย่างเช่น P1 และ P2 ก็จะทำการส่งข้อมูล local label ของตัวเองที่เชื่อมโยงกับ prefix 10.8.8.0/24 กลับไปให้กับเราเตอร์ PE2 โดยเราเตอร์ PE2 ก็จะทำการเก็บข้อมูล remote label ที่ได้รับเข้ามาจาก P1 และ P2 เก็บเอาบน LIB ด้วย ทั้งที่ไม่ได้ใช้เป็นเส้นทางในการส่งต่อแพ็คเก็ตไปยังปลายทางในปัจจุบันแต่อย่างใด ต่างจากการเก็บข้อมูลบน FIB และ LFIB ที่จะทำการเก็บข้อมูลเฉพาะเส้นทางที่ใช้งานในปัจจุบันเท่านั้น

ภาพด้านล่างแสดงตัวอย่างการเชื่อมโยงการทำงานของ table ต่าง ๆ บนเราเตอร์ PE1

สำหรับบทความนี้จะเป็นการอธิบายการทำงานของ MPLS สำหรับการส่งต่อ unicast IP forwarding บน control plane ซึ่งอันที่จริงแล้วไม่ได้รับความนิยมในการใช้งานเท่าไร เนื่องจากท้ายที่สุดแล้ว MPLS unicast IP forwarding ก็จะส่งแพ็คเก็ตไปในเส้นทางเดียวกับ IP routing ตามปกติ จะแตกต่างก็ตรงที่จะใช้งาน label ในการตัดสินใจส่งต่อข้อมูลต่อไปเท่านั้น แต่ MPLS unicast IP forwarding นี้จะเป็นพื้นฐานทีสำคัญสำหรับการนำ MPLS ไปใช้งานในรูปแบบอื่น ๆ ไม่ว่าจะเป็น MPLS layer 3 VPN, MPLS layer 2 VPN, MPLS-TE, MPLS-RSVP หรืออื่น ๆ ซึ่งจะขอกล่าวถึงในบทความต่อไปนะครับ

บทความเรื่อง MPLS ที่เกี่ยวข้อง
MPLS ตอนที่ 1 ทำความรู้จักกับการทำงานของ MPLS ใน Dataplane
MPLS ตอนที่ 2 การทำงานของ MPLS TTL propagation
MPLS ตอนที่ 3 ทำความรู้จักกับการทำงานของ MPLS ใน Control Plane
MPLS ตอนที่ 4 การตั้งค่า MPLS สำหรับการส่งต่อ Unicast IP

No comments:

Post a Comment