مرحبا حبر! هذه أول مقالة لي عن حبري ، ولدت من سؤال في أحد المنتديات المهنية. بدا السؤال ، لإعادة صياغة إلى حد ما ، على النحو التالي:
- هناك مجموعة من الملفات النصية التي تحتوي على إخراج جداول التوجيه من أجهزة الشبكة المختلفة ؛
- يحتوي كل ملف على معلومات من جهاز واحد ؛
- يمكن أن يكون للأجهزة تنسيق إخراج مختلف لجدول التوجيه ؛
- بناءً على البيانات المتاحة ، عند الطلب ، من الضروري عرض المسار إلى شبكة فرعية أو عنوان IP تعسفي من كل جهاز ؛
- يجب أن يتضمن الإخراج على كل قسم من معلومات المسار حول الإدخال من جدول التوجيه ، الذي سيتم توجيه الحزمة على طوله.
وجدت المهمة مثيرة للاهتمام ورددت صدى إحدى أدوات الشبكة الخاصة بي ، المخطط لها في المستقبل. لذلك ، في أمسية مجانية ، أفكر في حلها ، كتبت تطبيق إثبات المفهوم في Python 2.7 لصيغة Cisco IOS و IOS-XE و ASA ، والتي تلبي المتطلبات الأساسية.
في المقالة سأحاول إعادة إنتاج قطار الفكر والتعليق على النقاط الرئيسية.
هذه المواد مخصصة للأشخاص الذين هم بالفعل على دراية أساسية بأساسيات الشبكات و Python.
نرحب بجميع المهتمين بالقط!
تنويه
مؤلف المقال ، كونه مهندس شبكة ، ليس مطورًا محترفًا وقد لا يعرف بعد الفرق بين الواجهة والفئة المجردة ولكن منفتح دائمًا على النقد والتعليقات البناءة. نرحب بالتعليقات على الكود والنهج والخوارزميات المختارة من الزملاء الأكثر خبرة.
يتم توزيع جميع التعليمات البرمجية في هذه المقالة بموجب ترخيص MIT ، بما في ذلك يتم تقديمها "كما هي" ولا تقدم أي نوع من الضمان.
توضيح الشروط واختيار خوارزمية الحل
بالنظر إلى المقدمة التمهيدية ، يمكن تقسيم المهمة إلى جزأين رئيسيين: تحليل ملفات المصدر مع جداول التوجيه والبحث المباشر للمسار باستخدام البيانات الأولية.
سيسمح هذا الفصل أيضًا ، إذا لزم الأمر ، باستيراد المسارات من الأجهزة للبحث عن مسار بشكل تعسفي (على سبيل المثال ، عبر SNMP أو REST API).
لتحسين الأداء ، من المنطقي تهيئة الملفات مرة واحدة عند تشغيل البرنامج النصي.
يجب أن يتعرف المحلل اللغوي للملف على تنسيق جداول التوجيه من أنظمة التشغيل المختلفة. بعد ذلك ، سيتم النظر في خيار Cisco IOS و IOS-XE و ASA لـ IPv4. يمكن إضافة دعم التنسيقات الأخرى و IPv6 لاحقًا.
كما تعلم ، يتم اختيار الطريق وفقًا لجدول التوجيه وفقًا لمبدأ المصادفة مع البادئة ذات الطول الأكبر (أطول تطابق في البادئة).
كواحد من الحلول للبحث السريع عن مثل هذه المطابقة ، يمكنك بناء شجرة بادئة من البيانات المصدر. نظرًا لعدم وجود قيود على التبعيات الخارجية ، دعنا نتحدث عن وحدة SubnetTree النهائية.
من المحتمل أن تكون هناك حلقات توجيه في قسم الشبكة التي تم تحليلها ، ويجب الكشف عنها ولا تؤثر على البرنامج النصي. بالإضافة إلى ذلك ، في أي من العقد قد لا يكون هناك طريق إلى الشبكة الفرعية المطلوبة. هذا ينبغي أيضا النظر فيه.
إذا كان هناك VRF على الجهاز ، فيجب تخزين جداول التوجيه من كل مثيل في ملفات منفصلة ، لأنه من وجهة نظر الهيكل فهي أجهزة توجيه منفصلة.
القيود على أداء الحديد لتشغيل البرنامج النصي ، وعدد وحجم جداول التوجيه التي تم تحليلها غير مذكورة في الحالة ، ولكن يجب أن تضعها في الاعتبار.
تشير خصوصية التطبيق إلى حد متوسط يبلغ 1،000،000 إدخال في جدول التوجيه لجهاز واحد حديث. على جهاز توجيه مع عرض BGP الكامل اعتبارًا من يونيو 2018 ، قد يكون هناك بالفعل 724000 مسار.
وفقًا لتقدير تقريبي ونتائج اختبارات التخزين في الذاكرة ومعالجة كل بادئة 1،000،000 ، ستكون هناك حاجة إلى حوالي 500 ميجابايت من ذاكرة الوصول العشوائي. وبالتالي ، فإن محطة عمل متوسط الإنتاجية مع 8 غيغابايت من ذاكرة الوصول العشوائي (ما زلنا نضع في اعتبارنا في 2018) ستسمح لنا بتحليل الهيكل بسعة إجمالية تصل إلى 14-16.000.000 مسار. أي شريحة من حوالي 18-20 جهاز توجيه مع عرض كامل لكل منها.
بالنسبة لمعظم الحالات ، يعد هذا كافيًا تمامًا ، ولكن بالنسبة للشبكات الكبيرة (مثل الضغط) ، فأنت بحاجة إما لتقسيم التحليل إلى شرائح ، أو نقل المنطق إلى قاعدة بيانات خارج الذاكرة.
640 كيلوبايت كافية للجميع. دعنا نتناول النسخة الموجودة في الذاكرة.
تحليل ملفات المصدر واختيار هياكل البيانات
سننشر الملفات بجداول التوجيه في دليل فرعي منفصل ونجعلها متغيرًا:
RT_DIRECTORY = "./routing_tables"
بالنسبة إلى Cisco IOS و IOS-XE ، قد يبدو جدول التوجيه كالتالي:
عرض طريق IP S* 0.0.0.0/0 [1/0] via 10.220.88.1 10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks C 10.220.88.0/24 is directly connected, FastEthernet4 L 10.220.88.20/32 is directly connected, FastEthernet4 1.0.0.0/32 is subnetted, 1 subnets S 1.1.1.1 [1/0] via 212.0.0.1 [1/0] via 192.168.0.1 D EX 10.1.198.0/24 [170/1683712] via 172.16.209.47, 1w2d, Vlan910 [170/1683712] via 172.16.60.33, 1w2d, Vlan60 [170/1683712] via 10.25.20.132, 1w2d, Vlan220 [170/1683712] via 10.25.20.9, 1w2d, Vlan20 4.0.0.0/16 is subnetted, 1 subnets O E2 4.4.0.0 [110/20] via 194.0.0.2, 00:02:00, FastEthernet0/0 5.0.0.0/24 is subnetted, 1 subnets D EX 5.5.5.0 [170/2297856] via 10.0.1.2, 00:12:01, Serial0/0 6.0.0.0/16 is subnetted, 1 subnets B 6.6.0.0 [200/0] via 195.0.0.1, 00:00:04 172.16.0.0/26 is subnetted, 1 subnets i L2 172.16.1.0 [115/10] via 10.0.1.2, Serial0/0 172.20.0.0/32 is subnetted, 3 subnets O 172.20.1.1 [110/11] via 194.0.0.2, 00:05:45, FastEthernet0/0 O 172.20.3.1 [110/11] via 194.0.0.2, 00:05:45, FastEthernet0/0 O 172.20.2.1 [110/11] via 194.0.0.2, 00:05:45, FastEthernet0/0 10.0.0.0/8 is variably subnetted, 5 subnets, 3 masks C 10.0.1.0/24 is directly connected, Serial0/0 D 10.0.5.0/26 [90/2297856] via 10.0.1.2, 00:12:03, Serial0/0 D 10.0.5.64/26 [90/2297856] via 10.0.1.2, 00:12:03, Serial0/0 D 10.0.5.128/26 [90/2297856] via 10.0.1.2, 00:12:03, Serial0/0 D 10.0.5.192/27 [90/2297856] via 10.0.1.2, 00:12:03, Serial0/0 192.168.0.0/32 is subnetted, 1 subnets D 192.168.0.1 [90/2297856] via 10.0.1.2, 00:12:03, Serial0/0 O IA 195.0.0.0/24 [110/11] via 194.0.0.2, 00:05:45, FastEthernet0/0 O E2 212.0.0.0/8 [110/20] via 194.0.0.2, 00:05:35, FastEthernet0/0 C 194.0.0.0/16 is directly connected, FastEthernet0/0
في Cisco ASA ، يكون التنسيق مشابهًا ، ولكن بدلاً من أطوال البادئة ، يتم عرض قناع الشبكة الفرعية بترميز عشري:
تظهر الطريق S 10.1.1.0 255.255.255.0 [3/0] via 10.86.194.1, outside C 10.86.194.0 255.255.254.0 is directly connected, outside S* 0.0.0.0 0.0.0.0 [1/0] via 10.86.194.1, outside
كما ترى من المثال ، فإن المسارات ، على الرغم من التنوع الكبير ، لها نفس البنية ويمكن التنبؤ بها ، مما يعني أنه يمكن معالجتها بالتعبيرات العادية.
تخرج مجموعتان عالميتان: طرق محلية + متصلة وكل شيء آخر.
إن تعقيد الأمور قليلاً هو إمكانية وجود مسارات متعددة الخطوط مع عدد متغير من الآمال القادمة. ولهذا السبب ، من الصعب قراءة الملف للمعالجة سطراً بسطر. تتمثل إحدى طرق الخروج في معالجة تطابقات متعددة باستخدام مكرر للتعبير العادي في ملف تم تحميله بالكامل في متغير نصي.
سنكتب تعبيرات منتظمة مع مراعاة المتطلبات والقيود المدرجة:
يحتوي كلا التعبيرين على مجموعات مسماة لتسهيل استرداد البيانات عند البحث عن التطابقات والحفاظ على التعليمات البرمجية.
على وجه الخصوص ، من كل مسار ، تحتاج إلى الحصول على بادئة (مجموعات الشبكة الفرعية / الواجهة ومجموعة مجموعات maskOrPrefixLength ) ومعلومات حول المكان الذي تؤدي إليه ( عبر مجموعات المجموعات / الواجهة ).
نظرًا لأن التعبيرات تأخذ في الاعتبار عدة خيارات لتمثيل البادئة ، يمكن أن تحتوي مجموعة maskOrPrefixLength على قناع شبكة فرعية أو طول بادئة. سنختزل هذا إلى تنسيق واحد أثناء المعالجة ؛ وسنتناول طول البادئة:
def convert_netmask_to_prefix_length(mask_or_pref): if not mask_or_pref: return "" if re.match("^\/\d\d?$", mask_or_pref): return mask_or_pref if re.match("^\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?$", mask_or_pref): return ( "/" + str(sum([bin(int(x)).count("1") for x in mask_or_pref.split(".")])) ) return ""
أضف تعبيرات عادية للتحليل التالي سطرًا بسطر من مجموعة viaPortion ، والتحقق من تنسيق عناوين IPv4 وإدخال المستخدم:
ننقل الآن تمثيل شبكتنا إلى هياكل بيانات Python.
سيتم استخدام البادئات الناتجة عن تحليل جداول التوجيه كمفاتيح في شجرة البادئة. يتم توريث كائن شجرة البادئة من الوحدة النمطية SubnetTree .
سترجع نتيجة البحث بالبادئة في الشجرة قائمة من قائمة الآمال التالية وتمثيلًا نصيًا كاملاً للمسار المقابل من الملف الأصلي.
بالإضافة إلى ذلك ، قم بإنشاء قائمة بالواجهات المحلية.
يتم تمثيل كل جهاز توجيه بقاموس نضع فيه البيانات المذكورة أعلاه.
نقدم طلبًا إلى جدول التوجيه في وظيفة منفصلة:
def route_lookup(destination, router): if destination in router['routing_table']: return router['routing_table'][destination] else: return (None, None)
سيتم تعيين معرف فريد لكل جهاز توجيه. يمكنك تعيينه بعدة طرق ، في المثال الحالي سيكون من المسموح والواضح القيام بذلك بناءً على اسم الملف الأصلي.
ونتيجة لذلك ، سنضيف كائنات جهاز التوجيه الناتجة إلى القاموس باستخدام المفتاح في شكل هذا المعرف الفريد.
ROUTERS = { 'router_id_1': router_1, 'router_id_n': router_n, }
نحتاج أيضًا إلى آلية للبحث عن جهاز التوجيه التالي بواسطة عنوان IP الخاص بالخطوة التالية ، والذي تم الحصول عليه من جدول التوجيه أثناء البحث عن المسار. للقيام بذلك ، نقوم بإنشاء شجرة بادئة عالمية أخرى بمفاتيح على شكل عناوين IP لجميع أجهزة التوجيه المعروفة في الطبولوجيا والأوراق التي يتم إرجاعها بمعرف جهاز التوجيه ونوع الواجهة.
لنقم بتجميع المحلل لصيغة IOS / IOS-XE / ASA معًا. عند الإدخال ، نمرره بجدول التوجيه في شكل نص ، وعند الإخراج نحصل على قاموس الموجه بالتنسيق المحدد أعلاه.
def parse_show_ip_route_ios_like(raw_routing_table): router = {} route_tree = SubnetTree.SubnetTree() interface_list = []
نقوم بلف المحلل في وظيفة أخرى لتمكين الإضافة اللاحقة لمحللات التنسيقات الأخرى (على سبيل المثال ، NX-OS):
def parse_text_routing_table(raw_routing_table): """ Parser functions wrapper. Add additional parsers for alternative routing table syntaxes here. """ router = parse_show_ip_route_ios_like(raw_routing_table) if router: return router
لذلك ، يبقى تصفح الملفات النصية في الدليل:
def do_parse_directory(rt_directory): new_routers = {} if not os.path.isdir(rt_directory): print("{} directory does not exist.".format(rt_directory) + "Check rt_directory variable value." ) return None start_time = time() print("Initializing files...") for FILENAME in os.listdir(rt_directory): if FILENAME.endswith('.txt'): file_init_start_time = time() with open(os.path.join(rt_directory, FILENAME), 'r') as f: print ('Opening {}'.format(FILENAME)) raw_table = f.read() new_router = parse_text_routing_table(raw_table) router_id = FILENAME.replace('.txt', '') if new_router: new_routers[router_id] = new_router if new_router['interface_list']: for iface, addr in new_router['interface_list']: GLOBAL_INTERFACE_TREE[addr]= (router_id, iface,) else: print ('Failed to parse ' + FILENAME) print (FILENAME + " parsing has been completed in %s sec".format( "{:.3f}".format(time() - file_init_start_time)) ) else: if not new_routers: print ("Could not find any valid .txt files with routing tables" + " in {} directory".format(rt_directory) ) else: print ("\nAll files have been initialized" + " in {} sec".format("{:.3f}".format(time() - start_time)) ) return new_routers
وبعد تحليل كل الملفات إلى هياكل بيانات مرتبة ، يمكن للمرء أن يأخذ الجزء الثاني من المهمة.
البحث عن مسار من خلال جداول التوجيه المجهزة
بشكل عام ، في هذه المرحلة يتم تخفيض المهمة إلى تحليل الرسم البياني للشبكة. الموجهات هي رؤوس الرسم البياني ، روابط L3 بينها حواف.
يقوم قاموس ROUTERS بتخزين معرفات الموجهات في المفاتيح ، وفي القيم المقابلة - الروابط إلى عناوين IP للقفزات التالية. هذا ، بالاقتران مع GLOBAL_INTERFACE_TREE ، الذي يُرجع معرّفات جهاز التوجيه بواسطة عنوان IP ، لكل شبكة فرعية مطلوبة ، فإنه يحدد جدول المجاورة للرسم البياني.
إذا قمنا برسم أوجه تشابه مع أجهزة التوجيه الحقيقية ، للعثور على المسار الذي تحتاجه لإعادة إنتاج المنطق عالي المستوى لعملهم (الملخص من RIB / FIB / ASIC وتحسينات أخرى) عند معالجة حزمة من البحث إلى جدول التوجيه إلى طلب ARP (أو router_id في حالتنا) والتوجيه أو إسقاط الحزمة ، اعتمادًا على النتيجة.
نقوم بتنفيذ بحث مسار عودي على أجهزة التوجيه. سيتم تمثيل كل قسم من المسار بصفحة من router_id و raw_route_string - سلسلة المسار الأصلية عليه. سيتم كتابة المسار الحالي إلى مجموعة المسار . عند الوصول إلى نقطة الوجهة ، وغياب مسار في جدول التوجيه أو المرحلة التالية في الهيكل المدروس ، سيتم إضافة المسار الحالي إلى المسارات الناتجة ، والتي ستعود الوظيفة إليها.
def trace_route(source_router_id, target_ip, path=[]): if not source_router_id: return [path + [(None, None)]] current_router = ROUTERS[source_router_id] next_hop, raw_route_string = route_lookup(target_ip, current_router) path = path + [(source_router_id, raw_route_string)] paths = [] if next_hop: if nexthop_is_local(next_hop[0]): return [path] for nh in next_hop: next_hop_rid = get_rid_by_interface_ip(nh) if not next_hop_rid in [r[0] for r in path]: inner_path = trace_route(next_hop_rid, target_ip, path) for p in inner_path: paths.append(p) else: path = path + [(next_hop_rid+"<<LOOP DETECTED", None)] return [path] else: return [path] return paths def nexthop_is_local(next_hop): interface_types = ('Eth', 'Fast', 'Gig', 'Ten', 'Port', 'Serial', 'Vlan', 'Tunn', 'Loop', 'Null' ) for type in interface_types: if next_hop.startswith(type): return True
أضف وظيفة لبدء البحث في الوضع التفاعلي بعد تهيئة الملفات النصية:
def do_user_interactive_search(): while True: print ('\n') target_subnet = raw_input('Enter Target Subnet or Host: ') if not target_subnet: continue if not REGEXP_INPUT_IPv4.match(target_subnet.replace(' ', '')): print ("incorrect input") continue lookup_start_time = time() for rtr in ROUTERS.keys(): subsearch_start_time = time() result = trace_route(rtr, target_subnet) if result: print ("\n") print ("PATHS TO {} FROM {}".format(target_subnet, rtr)) n = 1 print ('Detailed info:') for r in result: print ("Path {}:".format(n)) print ([h[0] for h in r]) for hop in r: print ("ROUTER: {}".format(hop[0])) print ("Matched route string: \n{}".format(hop[1])) else: print ('\n') n+=1 else: print ("Path search on {} has been completed in {} sec".format( rtr, "{:.3f}".format(time() - subsearch_start_time)) ) else: print ("\nFull search has been completed in {} sec".format( "{:.3f}".format(time() - lookup_start_time),) )
اللمسة الأخيرة لدمج الجزئين:
def main(): global ROUTERS ROUTERS = do_parse_directory(RT_DIRECTORY) if ROUTERS: do_user_interactive_search() if __name__ == "__main__": main()
ولدينا كود جاهز للعمل.
كود import os import re import SubnetTree from time import time
التحقق من البرنامج النصي
مسلح بطوبولوجيا مجردة صغيرة من Cisco CSR-1000v الأربعة:

يتم توصيلها في أزواج من خلال واجهات GigabitEthernet 2 و 3. فيما بينها يوجد حي EIGRP ، يتم من خلاله الإعلان عن جميع الشبكات المتصلة ، بما في ذلك الشبكات على واجهات Loopback خلف كل جهاز توجيه.
بين csr1000v-01 و csr1000v-04 ، يتم أيضًا رفع نفقين GRE بشكل إضافي ، من خلال عناوين IP البعيدة التي يتم تسجيل مساراتها الثابتة إلى شبكة 10.0.0.0/8 لاختبار حلقة التوجيه.
csr1000v-01 # show ip route Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP a - application route + - replicated route, % - next hop override, p - overrides from PfR Gateway of last resort is not set S 10.0.0.0/8 [1/0] via 192.168.142.2 [1/0] via 192.168.141.2 172.16.0.0/16 is variably subnetted, 2 subnets, 2 masks C 172.16.114.0/24 is directly connected, GigabitEthernet2 L 172.16.114.5/32 is directly connected, GigabitEthernet2 192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.2.0/24 is directly connected, GigabitEthernet1 L 192.168.2.201/32 is directly connected, GigabitEthernet1 192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.12.0/24 is directly connected, GigabitEthernet2 L 192.168.12.201/32 is directly connected, GigabitEthernet2 192.168.13.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.13.0/24 is directly connected, GigabitEthernet3 L 192.168.13.201/32 is directly connected, GigabitEthernet3 D 192.168.24.0/24 [90/3072] via 192.168.12.202, 00:06:56, GigabitEthernet2 D 192.168.34.0/24 [90/3072] via 192.168.13.203, 00:06:56, GigabitEthernet3 192.168.141.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.141.0/30 is directly connected, Tunnel141 L 192.168.141.1/32 is directly connected, Tunnel141 192.168.142.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.142.0/30 is directly connected, Tunnel142 L 192.168.142.1/32 is directly connected, Tunnel142 192.168.201.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.201.0/24 is directly connected, Loopback201 L 192.168.201.201/32 is directly connected, Loopback201 D 192.168.202.0/24 [90/130816] via 192.168.12.202, 00:05:44, GigabitEthernet2 D 192.168.203.0/24 [90/130816] via 192.168.13.203, 00:06:22, GigabitEthernet3 D 192.168.204.0/24 [90/131072] via 192.168.13.203, 00:06:56, GigabitEthernet3 [90/131072] via 192.168.12.202, 00:06:56, GigabitEthernet2
csr1000v-02 # show ip route Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP a - application route + - replicated route, % - next hop override, p - overrides from PfR Gateway of last resort is not set 192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.2.0/24 is directly connected, GigabitEthernet1 L 192.168.2.202/32 is directly connected, GigabitEthernet1 192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.12.0/24 is directly connected, GigabitEthernet2 L 192.168.12.202/32 is directly connected, GigabitEthernet2 D 192.168.13.0/24 [90/3072] via 192.168.12.201, 00:46:17, GigabitEthernet2 192.168.24.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.24.0/24 is directly connected, GigabitEthernet3 L 192.168.24.202/32 is directly connected, GigabitEthernet3 D 192.168.34.0/24 [90/3072] via 192.168.24.204, 00:46:15, GigabitEthernet3 D 192.168.201.0/24 [90/130816] via 192.168.12.201, 00:36:59, GigabitEthernet2 192.168.202.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.202.0/24 is directly connected, Loopback202 L 192.168.202.202/32 is directly connected, Loopback202 D 192.168.203.0/24 [90/131072] via 192.168.24.204, 00:06:31, GigabitEthernet3 [90/131072] via 192.168.12.201, 00:06:31, GigabitEthernet2 D 192.168.204.0/24 [90/130816] via 192.168.24.204, 00:37:26, GigabitEthernet3
csr1000v-03 # show ip route Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP a - application route + - replicated route, % - next hop override, p - overrides from PfR Gateway of last resort is not set 192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.2.0/24 is directly connected, GigabitEthernet1 L 192.168.2.203/32 is directly connected, GigabitEthernet1 D 192.168.12.0/24 [90/3072] via 192.168.13.201, 00:46:12, GigabitEthernet3 192.168.13.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.13.0/24 is directly connected, GigabitEthernet3 L 192.168.13.203/32 is directly connected, GigabitEthernet3 D 192.168.24.0/24 [90/3072] via 192.168.34.204, 00:46:12, GigabitEthernet2 192.168.34.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.34.0/24 is directly connected, GigabitEthernet2 L 192.168.34.203/32 is directly connected, GigabitEthernet2 D 192.168.201.0/24 [90/130816] via 192.168.13.201, 00:36:56, GigabitEthernet3 D 192.168.202.0/24 [90/131072] via 192.168.34.204, 00:05:51, GigabitEthernet2 [90/131072] via 192.168.13.201, 00:05:51, GigabitEthernet3 192.168.203.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.203.0/24 is directly connected, Loopback203 L 192.168.203.203/32 is directly connected, Loopback203 D 192.168.204.0/24 [90/130816] via 192.168.34.204, 00:37:22, GigabitEthernet2
csr1000v-04#show ip route Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP a - application route + - replicated route, % - next hop override, p - overrides from PfR Gateway of last resort is not set S 10.0.0.0/8 [1/0] via 192.168.142.1 [1/0] via 192.168.141.1 192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.2.0/24 is directly connected, GigabitEthernet1 L 192.168.2.204/32 is directly connected, GigabitEthernet1 D 192.168.12.0/24 [90/3072] via 192.168.24.202, 00:46:17, GigabitEthernet3 D 192.168.13.0/24 [90/3072] via 192.168.34.203, 00:46:19, GigabitEthernet2 192.168.24.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.24.0/24 is directly connected, GigabitEthernet3 L 192.168.24.204/32 is directly connected, GigabitEthernet3 192.168.34.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.34.0/24 is directly connected, GigabitEthernet2 L 192.168.34.204/32 is directly connected, GigabitEthernet2 192.168.141.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.141.0/30 is directly connected, Tunnel141 L 192.168.141.2/32 is directly connected, Tunnel141 192.168.142.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.142.0/30 is directly connected, Tunnel142 L 192.168.142.2/32 is directly connected, Tunnel142 D 192.168.201.0/24 [90/131072] via 192.168.34.203, 00:37:02, GigabitEthernet2 [90/131072] via 192.168.24.202, 00:37:02, GigabitEthernet3 D 192.168.202.0/24 [90/130816] via 192.168.24.202, 00:05:57, GigabitEthernet3 D 192.168.203.0/24 [90/130816] via 192.168.34.203, 00:06:34, GigabitEthernet2 192.168.204.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.204.0/24 is directly connected, Loopback204 L 192.168.204.204/32 is directly connected, Loopback204
show ip route - ./routing_tables/ :
$ python2.7 traceRouteByShowIPRoute.py $ python2.7 traceRouteByShowIPRoute.py Initializing files... Opening csr1000v-01.txt csr1000v-01.txt parsing has been completed in 0.001 sec Opening csr1000v-02.txt csr1000v-02.txt parsing has been completed in 0.001 sec Opening csr1000v-03.txt csr1000v-03.txt parsing has been completed in 0.001 sec Opening csr1000v-04.txt csr1000v-04.txt parsing has been completed in 0.001 sec All files have been initialized in 0.003 sec Enter Target Subnet or Host:
, , , IP- .
.
Loopback204 192.168.204.204 csr1000v-04يجب أن تكون المسارات إلى عنوان IP هذا من جميع أجهزة التوجيه المتاحة.
أدخل الشبكة الفرعية المستهدفة أو المضيف: 192.168.204.204 Enter Target Subnet or Host: 192.168.204.204 PATHS TO 192.168.204.204 FROM csr1000v-04 Detailed info: Path 1: ['csr1000v-04'] ROUTER: csr1000v-04 Matched route string: L 192.168.204.204/32 is directly connected, Loopback204 Path search on csr1000v-04 has been completed in 0.000 sec PATHS TO 192.168.204.204 FROM csr1000v-03 Detailed info: Path 1: ['csr1000v-03', 'csr1000v-04'] ROUTER: csr1000v-03 Matched route string: D 192.168.204.0/24 [90/130816] via 192.168.34.204, 00:37:22, GigabitEthernet2 ROUTER: csr1000v-04 Matched route string: L 192.168.204.204/32 is directly connected, Loopback204 Path search on csr1000v-03 has been completed in 0.000 sec PATHS TO 192.168.204.204 FROM csr1000v-02 Detailed info: Path 1: ['csr1000v-02', 'csr1000v-04'] ROUTER: csr1000v-02 Matched route string: D 192.168.204.0/24 [90/130816] via 192.168.24.204, 00:37:26, GigabitEthernet3 ROUTER: csr1000v-04 Matched route string: L 192.168.204.204/32 is directly connected, Loopback204 Path search on csr1000v-02 has been completed in 0.000 sec PATHS TO 192.168.204.204 FROM csr1000v-01 Detailed info: Path 1: ['csr1000v-01', 'csr1000v-03', 'csr1000v-04'] ROUTER: csr1000v-01 Matched route string: D 192.168.204.0/24 [90/131072] via 192.168.13.203, 00:06:56, GigabitEthernet3 [90/131072] via 192.168.12.202, 00:06:56, GigabitEthernet2 ROUTER: csr1000v-03 Matched route string: D 192.168.204.0/24 [90/130816] via 192.168.34.204, 00:37:22, GigabitEthernet2 ROUTER: csr1000v-04 Matched route string: L 192.168.204.204/32 is directly connected, Loopback204 Path 2: ['csr1000v-01', 'csr1000v-02', 'csr1000v-04'] ROUTER: csr1000v-01 Matched route string: D 192.168.204.0/24 [90/131072] via 192.168.13.203, 00:06:56, GigabitEthernet3 [90/131072] via 192.168.12.202, 00:06:56, GigabitEthernet2 ROUTER: csr1000v-02 Matched route string: D 192.168.204.0/24 [90/130816] via 192.168.24.204, 00:37:26, GigabitEthernet3 ROUTER: csr1000v-04 Matched route string: L 192.168.204.204/32 is directly connected, Loopback204 Path search on csr1000v-01 has been completed in 0.000 sec Full search has been completed in 0.001 sec
, . :
csr1000v-01#show ip route 192.168.204.204 csr1000v-01#show ip route 192.168.204.204 Routing entry for 192.168.204.0/24 Known via "eigrp 200", distance 90, metric 131072, type internal Redistributing via eigrp 200 Last update from 192.168.13.203 on GigabitEthernet3, 00:02:15 ago Routing Descriptor Blocks: 192.168.13.203, from 192.168.13.203, 00:02:15 ago, via GigabitEthernet3 Route metric is 131072, traffic share count is 1 Total delay is 5020 microseconds, minimum bandwidth is 1000000 Kbit Reliability 255/255, minimum MTU 1500 bytes Loading 1/255, Hops 2 * 192.168.12.202, from 192.168.12.202, 00:02:15 ago, via GigabitEthernet2 Route metric is 131072, traffic share count is 1 Total delay is 5020 microseconds, minimum bandwidth is 1000000 Kbit Reliability 255/255, minimum MTU 1500 bytes Loading 1/255, Hops 2
csr1000v-01 equal-cost EIGRP csr1000v-02 csr1000v-03.
, : ['csr1000v-01', 'csr1000v-03', 'csr1000v-04'] ['csr1000v-01', 'csr1000v-02', 'csr1000v-04'].
csr1000v-02#show ip route 192.168.204.204 csr1000v-02#show ip route 192.168.204.204 Routing entry for 192.168.204.0/24 Known via "eigrp 200", distance 90, metric 130816, type internal Redistributing via eigrp 200 Last update from 192.168.24.204 on GigabitEthernet3, 00:08:48 ago Routing Descriptor Blocks: * 192.168.24.204, from 192.168.24.204, 00:08:48 ago, via GigabitEthernet3 Route metric is 130816, traffic share count is 1 Total delay is 5010 microseconds, minimum bandwidth is 1000000 Kbit Reliability 255/255, minimum MTU 1500 bytes Loading 1/255, Hops 1
csr1000v-03#show ip route 192.168.204.204 csr1000v-3#show ip route 192.168.204.204 Routing entry for 192.168.204.0/24 Known via "eigrp 200", distance 90, metric 130816, type internal Redistributing via eigrp 200 Last update from 192.168.34.204 on GigabitEthernet2, 00:08:45 ago Routing Descriptor Blocks: * 192.168.34.204, from 192.168.34.204, 00:08:45 ago, via GigabitEthernet2 Route metric is 130816, traffic share count is 1 Total delay is 5010 microseconds, minimum bandwidth is 1000000 Kbit Reliability 255/255, minimum MTU 1500 bytes Loading 1/255, Hops 1
csr1000v-2 csr1000v-3 EIGRP csr1000v-4.
, : ['csr1000v-02', 'csr1000v-04'] ['csr1000v-03', 'csr1000v-04'] .
csr1000v-04#show ip route 192.168.204.204 csr1000v-04#show ip route 192.168.204.204 Routing entry for 192.168.204.204/32 Known via "connected", distance 0, metric 0 (connected) Routing Descriptor Blocks: * directly connected, via Loopback204 Route metric is 0, traffic share count is 1
csr1000v-4 Connnected Loopback204.
Local : ['csr1000v-04'].
10.10.10.0/24 ( )Enter Target Subnet or Host: 10.10.10.0/24 Enter Target Subnet or Host: 10.10.10.0/24 PATHS TO 10.10.10.0/24 FROM csr1000v-04 Detailed info: Path 1: ['csr1000v-04', 'csr1000v-01', 'csr1000v-04<<LOOP DETECTED'] ROUTER: csr1000v-04 Matched route string: S 10.0.0.0/8 [1/0] via 192.168.142.1 [1/0] via 192.168.141.1 ROUTER: csr1000v-01 Matched route string: S 10.0.0.0/8 [1/0] via 192.168.142.2 [1/0] via 192.168.141.2 ROUTER: csr1000v-04<<LOOP DETECTED Matched route string: None Path 2: ['csr1000v-04', 'csr1000v-01', 'csr1000v-04<<LOOP DETECTED'] ROUTER: csr1000v-04 Matched route string: S 10.0.0.0/8 [1/0] via 192.168.142.1 [1/0] via 192.168.141.1 ROUTER: csr1000v-01 Matched route string: S 10.0.0.0/8 [1/0] via 192.168.142.2 [1/0] via 192.168.141.2 ROUTER: csr1000v-04<<LOOP DETECTED Matched route string: None Path search on csr1000v-04 has been completed in 0.000 sec PATHS TO 10.10.10.0/24 FROM csr1000v-03 Detailed info: Path 1: ['csr1000v-03'] ROUTER: csr1000v-03 Matched route string: None Path search on csr1000v-03 has been completed in 0.000 sec PATHS TO 10.10.10.0/24 FROM csr1000v-02 Detailed info: Path 1: ['csr1000v-02'] ROUTER: csr1000v-02 Matched route string: None Path search on csr1000v-02 has been completed in 0.000 sec PATHS TO 10.10.10.0/24 FROM csr1000v-01 Detailed info: Path 1: ['csr1000v-01', 'csr1000v-04', 'csr1000v-01<<LOOP DETECTED'] ROUTER: csr1000v-01 Matched route string: S 10.0.0.0/8 [1/0] via 192.168.142.2 [1/0] via 192.168.141.2 ROUTER: csr1000v-04 Matched route string: S 10.0.0.0/8 [1/0] via 192.168.142.1 [1/0] via 192.168.141.1 ROUTER: csr1000v-01<<LOOP DETECTED Matched route string: None Path 2: ['csr1000v-01', 'csr1000v-04', 'csr1000v-01<<LOOP DETECTED'] ROUTER: csr1000v-01 Matched route string: S 10.0.0.0/8 [1/0] via 192.168.142.2 [1/0] via 192.168.141.2 ROUTER: csr1000v-04 Matched route string: S 10.0.0.0/8 [1/0] via 192.168.142.1 [1/0] via 192.168.141.1 ROUTER: csr1000v-01<<LOOP DETECTED Matched route string: None Path search on csr1000v-01 has been completed in 0.003 sec Full search has been completed in 0.004 sec
.
:
csr1000v-01#show ip route 10.10.10.0 255.255.255.0 csr1000v-01#show ip route 10.10.10.0 255.255.255.0 Routing entry for 10.0.0.0/8 Known via "static", distance 1, metric 0 Routing Descriptor Blocks: * 192.168.142.2 Route metric is 0, traffic share count is 1 192.168.141.2 Route metric is 0, traffic share count is 1
csr1000v-04#show ip route 10.10.10.0 255.255.255.0 csr1000v-04#show ip route 10.10.10.0 255.255.255.0 Routing entry for 10.0.0.0/8 Known via "static", distance 1, metric 0 Routing Descriptor Blocks: 192.168.142.1 Route metric is 0, traffic share count is 1 * 192.168.141.1 Route metric is 0, traffic share count is 1
csr1000v-01 csr1000v-04 GRE- 10.0.0.0/8. .
:
PATHS TO 10.10.10.0/24 FROM csr1000v-01 Path 1: ['csr1000v-01', 'csr1000v-04', 'csr1000v-01<<LOOP DETECTED'] Path 2: ['csr1000v-01', 'csr1000v-04', 'csr1000v-01<<LOOP DETECTED'] PATHS TO 10.10.10.0/24 FROM csr1000v-04 Path 1: ['csr1000v-04', 'csr1000v-01', 'csr1000v-04<<LOOP DETECTED'] Path 2: ['csr1000v-04', 'csr1000v-01', 'csr1000v-04<<LOOP DETECTED']
csr1000v-02#show ip route 10.10.10.0 255.255.255.0 csr1000v-02#show ip route 10.10.10.0 255.255.255.0 % Network not in table
csr1000v-3#show ip route 10.10.10.0 255.255.255.0 csr1000v-3#show ip route 10.10.10.0 255.255.255.0 % Network not in table
csr1000v-02 csr1000v-03 . .
, , , .
الخلاصة
, . MacBook Pro Intel Core i5 8GB RAM 700.000+ 6.85 ( 100 ). 320-350.
( ).
. IPv6 SubnetTree .
Python3, , raw_input input .
, , — , " " , " ", ..
Policy Based Routing ( PBR ) . , .
, - .
, .