در پروتکل BGP شاید مهمترین Attribute در NLRI همان AS_PATH است، به طوریکه Loop Prevention در Advertisementهای eBGP با استفاده از این Attribute اتفاق میافتد. در این مقاله میخواهیم با استفاده از ابزار قدرتمند Regex این Attribute را راحتتر بخوانیم، خروجیهای دلخواهمان را بگیریم و از آن برای فیلترینگ در BGP استفاده کنیم.
مقادیر AS_PATH به طور کلی میتواند از سه المان نشئت بگیرد:
اول: AS_SEQUENCE که به شکل منظم تمام ASهایی را که پرفیکس از آن عبور میکند، در خود جای میدهد.
دوم: AS_SET که در دستور aggregate به کار میرود و تمام AS_PATHهای موجود در تک تک پرفیکسهای Aggregate شده را به شکل نامنظم و غیر تکراری در متغیر AS_PATH جدید مینویسد.
سوم: AS_CONFED_SET و AS_CONFED_SEQUENCE که به ترتیب برای روتهای Aggregate شده در Confederation و ترتیب توالی Sub ASها در Confederation را نشان میدهد.
خود AS_PATH جدیدترین AS را در سمت چپ و آن ASیی که پرفیکس در آن Originate شده است را در سمت راست نمایش میدهد به عبارت دیگر آخرین AS که از آن عبور کرده را در سمت چپترین و ASیی که در آن تولید شده است را در راستترین حالت نشان میدهد. همچنین در این نمایش آن ASهایی که در براکت {} هستند متعلق به AS_SET و آنهایی که در پرانتز () هستند مربوط Confederation میباشند هر چند گاهی اوقات این پرانتز ها با کاراکتر \ به نوعی Escape میشوند چرا که در سیستمعامل اکثرا پرانتز یک Special Character است. اما برای تعامل با AS_PATH و تغییر در آن ابزاری تحت عنوان Regex یا Regular Expression وجود دارد که برای کار با AS_PATH در محیطهای عملیاتی بسیار حیاتی و کاربردی است.
برای کار با Regex ابتدا بایستی معانی متاکاراکترها یا همان Modifireها را بدانیم:
"." به معنی هر کاراکتری
"?" کاراکتر قبل صفر یا یک بار تکرار شود
"*" کاراکتر قبل صفر یا به هر تعدادی تکرار شود
"+" کاراکتر قبل یک یا به هر تعدادی تکرار شود
"^" ابتدای محتویات AS_PATH را نشان کن
"$" انتهای محتویات AS_PATH را نشان کن
"[ ]" یک Range را نشان کن که درون آن هر شمارهای را میتوان نوشت
"_" فاصله بین شماره ASها یا انتهای AS_PATH را نشان کن
"( )" برای گروهبندی ASها
" | " به معنی OR منطقی
برای درک بیشتر به مثالهای زیر توجه کنید:
$^ به معنای خالی بودن AS_PATH است. به عبارت دیگر روت در Local AS به نوعی Origin شده است.
_100^ به معنای این است که پرفیکس از AS همسایه که شماره آن 100 است گرفته شده باشد. وجود کاراکتر _ در اینجا بسیار حیاتی است چرا که در گزاره 100^ دیگر ASها نظیر 1001، 1002 و الی آخر با آن Match میشوند.
_100_ به معنی این است پرفیکس حتما از AS شماره 100 گذر کرده باشد.
100$_ به معنای این است پرفیکس در AS شماره 100 تولید شده است.
با همین متاکارکترها ترکیبهای بسیار پیچیدهتری را میتوان نوشت:
100_(+[0-9])^ روتی که از AS شماره 100 گذر کرده و فقط یک هاپ (یک AS) از AS ما فاصله دارد. توجه کنید کاراکتر + با کل عبارت [0-9] مچ میشود و میتواند هر عدد یک رقمی را تولید کرده و سپس دوباره یک عدد یک رقمی دیگر را تولید نماید. شمارههایی که با آن مچ میگردد همه چیز را شامل میشود برای مثال: 1، 65535، 254، 1111 و غیره.
(+[0-9])_100^ کلیه پرفیکسهایی که از همسایه ما AS شماره 100 گرفته میشود.
(+[0-9])+(_100)^ پرفیکسهایی که از همسایه ما AS شماره 100 گرفته شده باشد و حتی اگر این AS عملیات AS_PATH Prependingرا انجام داده باشد.
(\100)\^ پرفیکسهایی که از همسایه AS شماره 100 در Confederation گرفته شده باشد.
همانطور که میبینیم با Regex همه چیز را میتوان نوشت. در ادامه و در کانکتست سیکسو باید از Regex درون یک as-path access-list استفاده کنیم و برای نوشتن آن از دستور زیر کمک میگیریم:
ip as-path access-list NUM [ permit | deny] REGEX
برای پیادهسازی آن نیز میتوانیم این as-path را در یک route-map با گزاره match as-path انتخاب نموده و برای یک همسایه به شکل inbound یا outbound پیادهسازی نماییم:
route-map REGEX_TEST [ permit | deny ] 10
match as-path NUM
router bgp AS_NUM
neighbor NEIGHBOR route-map REGEX_TEST in | out