23 בספט׳ 2012

BGP - Initial Configuration



שלום לכולם,
לאחר תקופה ארוכה שלא העליתי מאמר לבלוג.. 
הפעם אני רוצה לשתף אתכם בהיכרות ראשונית ומעמיקה בנושא פרוטוקול ה-BGP.
מאמר זה הולך להיות פרקטי, עם הסברים בנושא הפעלה והגדרה של BGP.

נתחיל...?

BGP Initial Configuration Commands:

הגדרת BGP מבוצעת בצורה ידנית לחלוטין, כל פעולה ב-BGP צריכה להיות מוגדרת, כגון שכנים ספציפיים וכו.
BGP עובד בפורט 179 באמצעות TCP ולכן הוא גם מוגדר Reliable בגלל ה-ACK של TCP
BGP הוא כמו כל אפליקציה שמשתמשת ב-TCP מה שאומר שבאמצעות TCP הקליינט יוצר את קשרי ה- 3-way-handshake זאת ע"י שליחת פקטת SYN לכיוון לפורט 179, במידה וקיים נתב בקצה השני שמוגדר לקבל את BGP הוא עונה עם SYN/ACK
לכיוון הפורט שממנו הוא התקבל.
במידה ושני השכנים מנסים להקים קשרי שכנות באותו זמן ישנו כלי עפ"י RFC 4271  אשר תפקידו הוא לגלות Collision  באמצעות ה-BGP RID ובכך הוא יודע את איזה הודעת Hello  להשאיר ולאיזו לעשות DROP.

הגדרת קשרי שכנות ב-BGP:

router bgp xxx
neighbor x.x.x.x remote-as xxx

ניתן לוודא שהשכנים אחר הוקמו על ידי פקודת:
במידה ואנחנו רואים Prefix ולא ACTIVE/IDLE משמש קשרי השכנות הוקמו (המספר מעיד על כמות הניתובים שקיבלנו מאותו שכן).
exec
show ip bgp summary


הערה חשובה!!
ה-TTL עבור Sessions שיוצאים הוא 255 בקשרי IBGP, ו-IBGP לא חייבים להיות DC כל עוד ה-IGP מחבר בינהם ויודע להגיע משכן לשכן.
לעומת זאת EBGP Sessions יוצאים עם TTL  שווה ל-1 כברירת מחדל מה שאומר לנו ששכנים חייבים להיות מחוברים ישירות אחד לשני.

כמו כן ניתן לצפות בניתובים שהתקבלו וזאת באמצעות פקודה:

exec
show ip bgp


חשוב מאוד לשים לב לשורת ה-NEXT-HOP .
שים לב שהשדה הזה הוא מכיל את הכתובת של השכן שממנו נלמד הניתוב.
אם ניקח לדוגמא את הרשת 150.1.7.0  דרך הכתובת 155.1.67.7, על מנת להגיע לניתוב הנ"ל צריך לבצע Recursive Lookup (חיפוש חוזר) על כתובת השכן (Next-Hop) עד שנמצא ממשק תואם שדרכו אפשר לצאת.
ניתוב לא יכול להחשב כ-BEST במידה ואין אפשרות יציאה לכיוון ה-NEXT HOP .

BGP Update Source:

כיוון ש-BGP משתמש ב-TCP לטובת העברת המידע, לכן אין צורך בכך שהשכנים יהיו DC.
מה שמאפשר לנו להגדיר ממשקים וירטואליים – כגון Loopbackים כממשק היציאה של קשרי השכנות.
מה שקורה בעצם הוא מצב שבו קשרי השכנות לא עולים כיוון שאנחנו מגדירים אותם לעבוד עם Loopback וה-BGP מוציא את הודעת ה-TCP עם Source IP הלא נכון.

ניתן להשתמש בפקודה על מנת לעדכן את הכתובת שאיתה אנחנו רוצים להקים את קשרי השכנות:

router bgp xxx
neighbor xxx update-source


טיפ יעיל!
ניתן להגדיר ACL אשר תוחם את כתובת המקור וכל יעד כמו בדוגמא הנ"ל ולבצע Debug IP Packet  ל-TCP רק עם הכתובות הללו ובכך בעצם לפלטר את הנתונים ולא להציף את כל הנתב בנתונים.

דוגמא:
global
access-list 100 permit tcp any host 150.1.4.4
access-list 100 permit tcp host 150.1.4.4 any

exec
debug ip packet detail 100

מה שחשוב לזכור בעדכון הכתובת מקור ב-BGP הוא שה-TCP Server של ה-BGP חייב לאשר מהיכן ה-Session מגיע.
אם ה-SYN מגיע מכתובת שאינה מוגדרת כשכן ה-Connection Refuse.

BGP Multihop Peering:

כפי שציינו קודם לכן, כברירת מחדל חיבורי EBGP יוצאים עם TTL של 1 מה שאומר לנו שחיבורים לא ישירים (Non-DC) אינם יכולים להתקיים כיוון שנקבל הודעת "TTL Expire in transit"

לכן אנחנו צריכים להוסיף את הפקודה תחת השכן:

router bgp xxx
neighbor x.x.x.x ebgp-multihop 10
הערה: אם לא הגדרות מספר אחרי ה-Multihop מה שיופיע הוא 255 (המקסימום)

BGP Disable Connected-Check:

אם ניזכר בסעיף מעל נוכל לראות כפי שדיברנו על ה-TTL, TTL =1 מונע הקמת קשרי שכנות בין נתבים שהם לא DC.
בנוסף על כך ה-IOS מונע הקמת קשרי שכנות בין נתבים שהם לא DC כאשר ה-TTL=1 .
כפי שראינו קודם לכן, ניתן לפתור בעיה זו על ידי פקודת ebgp-multihop והעלאת ה-TTL לערך שיאפשר הקמת קשר שכנות.

בתצורות מסוימות שהשכנים כן מחוברים ישירות אחד לשני אבל מקימים קשרי שכנות באמצעות LOOPBACKים במקום הממשקים הישירים שלהם ניתן להשתמש באופציית ה-Disable-Connected-Check.

למרות שאנחנו משיגים את אותה תוצאה (הגדלת ה-TTL) ההבדל ביניהם הוא שה- Disable-Connected-Check מונע מצבים שבהם ה-EBGP Session בין שתי התקנים מנותב דרך נתב TRANSIT.

הפקודה:

router bgp xxx
neighbor x.x.x.x disable-connected-chcek

BGP Authentication Peering:

התמיכה של BGP בסיסמה היא באמצעות Option 19 בתוך TCP.
ההגדרה של Md5 Hash היא דיי פשוטה ומבוצעת באופן הבא תחת השכן:

router bgp xxx
neighbor x.x.x.x password CISCO

ניתן לצפות בהגדרה של הסיסמה באמצעות הפקודה:

exec
show ip bgp neighbors x.x.x.x | include state|flags

BGP Route-Reflector:

הגדרת BGP route reflector כפי שצוין ב-RFC 2796 נמצאים בשימוש ברשתות BGP גדולות וזאת על מנת להוריד את כמות הנתבים שצריכים להיות Fully Meshed על הנוסחה: n*(n-1)/2

לנתבי RR  יכולים להיות סוגים שונים של Peers והם:
EBGP Peers
Client-Peers
Non-client peers

-          EBGP Peers הם שכנים שנמצאים ב-AS שונה כולל אלו שנמצאים ב-Sub-AS Confederation.
-          Client Peers הם שכני IBGP שיש להם את שורת ה- route-reflector-client מוגדרת עליהם.
-          Non-Client הם שכני IBGP שאין להם את הגדרת ה-RR.
פרסומי ניתובים שנשלחים מה-RR חייבים להיות תואמים לתנאים הבאים:
1.      ניתובים שנלמדו ע"י EBGP יכולים להיות מועברים לשכני  EBGP אחרים, Clients ו- Non Clients.
2.      ניתובים שנלמדו ע"י Client יכולים להיות מועברים לשכן EBGP, שכן Client ושכן שהוא Non Client.
3.      ניתובים שנלמדו ע"י Non Client יכולים להיות מועברים לשכן-EBGP, לשכן Client אבל לא לשכן שהוא Non Client.

בתצורה הפשוטה ביותר של RR נבחרת נקודה אחת מרכזית בתוך כל ה-IBGP דומיין וכל השכנים מוגדרים כקליינטים של אותו RR שנבחר.

הגדרת Route-Reflector:
router bgp xxx
neighbor x.x.x.x route-reflector-client

ניתן לראות ניתוב שהתקבל על ידי RR  באמצעות פקודה:

exec
show ip bgp 150.1.1.1 255.255.255.0


שים לב!
כאשר ניתוב מופץ, או לחילופין משתקף (Reflected) מנתב שהוא RR אל Client או אל Non Client כתובת ה-Next-Hop בתוך ה-BGP Attribute לא מתעדכנת!

אך לעומת זאת מוכנים 2 Attributes חדשים לתוך הניתוב ש-Reflected והם:
·         Originator ID.
·         Cluster List.

אם נזכור שמנגנון למניעת לולאות ב-BGP היה חוק ה-Split Horizon והוא היה מתבצע על ידי מניעת הפצת ניתוב שהתקבל משכן IBGP לשכן IBGP אחר, כיוון שה-Route Reflector  שובר את החוק הזה אנחנו צריכים מנגנון אחר שיסייע במניעת לולאות.

הראשון מבניהם הוא ה-Originator ID שהוא מוחל על ידי ה- route reflector כמו ה-RID שממנו נלמד הניתוב.



אם נסתכל בדוגמא למעלה אנחנו יכולים לראות שהניתוב נלמד מה-RID של R2.
המנגנון נכנס לפעולה ברגע שהנתב מזהה את ה-RID של עצמו בתוך העדכון וכך הוא עושה לניתוב DROP.
לכן ישנה חשיבות רבה לכתובת ה-RID בדיוק כמו ב-EIGRP או OSPF.

ה-Attribute השני מבניהם הוא ה-Cluster List, הוא מכיל בתוכו את ה-Cluster-ID של כל ה-RR ים שהניתוב צריך לעבור דרכם בתוך הרשת.
אלא אם אנחנו מגדירים Bgp cluster-id הערך ברירת מחדל הוא ה-RID של ה-RR.

ה-Attribute  הזה נועד למנוע לולאות בין RRים כאשר אנחנו מטמיעים בצורה היררכית.
Cluster ב-BGP מוגדר כ- RR וכל הקליינטים שלו, כאשר RR לומד ניתוב משכן IBGP אחר והוא מוצא בתוך ה-Cluster-List את ה-RID של עצמו, הוא מפיל את העדכון.
ישנה נטייה להשוות את ה-RR ל-DR/BDR ב-OSPF, ובמקרים מסויימים התעבורה לא מגיעה להתקן ה-RR, אלא ברוב המקרים ה-RR משמש כמרכז התעבורה אבל לא בהכרח מעביר את כל התעבורה דרכו.


המונח Cluster מתייחס ל-RR והקליינטים שלו או למספר RRים שמשרתים את אותם קליינטים.
Clustering משמש לצורך יצירת איזון בין כמות תעבורת ה-BGP שצריכה לעבור בין ה-Peers ולטובת שרידות
הרבה ספקיות אינטרנט גדולות משתמשות בקלסטרים בתצורות ה-IBGP שלהם, זאת על ידי מיקום של ה-CLUSTER במיקומים גאוגרפיים שונים דבר אשר מפחית את כמות החורים הארוכים של קשרי ה-BGP שמוקמים.

המשך יבוא... 

מקווה שעזרתי.
אבי