рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдпрд╛ рдлрд┐рд░ рдкрд╛рдпрдерди рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреНрдпреЛрдВ

рд╣реЗрд▓реЛ рд╣рдмреНрд░! рдпрд╣ рд╣реИрдмреЗ рдкрд░ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╣реИ, рдФрд░ рд╡рд╣ рдПрдХ рдкреЗрд╢реЗрд╡рд░ рдордВрдЪреЛрдВ рдореЗрдВ рдПрдХ рд╕рд╡рд╛рд▓ рд╕реЗ рдкреИрджрд╛ рд╣реБрдЖ рдерд╛ред рдкреНрд░рд╢реНрди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрд╛ рдЧрдпрд╛, рдЬреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:


  • рд╡рд┐рднрд┐рдиреНрди рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрдХрд░рдгреЛрдВ рд╕реЗ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╡рд╛рд▓реЗ рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ;
  • рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ;
  • рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ;
  • рдЙрдкрд▓рдмреНрдз рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЕрдиреБрд░реЛрдз рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдПрдХ рдордирдорд╛рдирд╛ рд╕рдмрдиреЗрдЯ рдпрд╛ рдЖрдИрдкреА рдкрддреЗ рдХреЗ рд▓рд┐рдП рдкрде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ;
  • рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрде рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрднрд╛рдЧ рдкрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЯ рдХреЛ рд░реВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рджрд┐рд▓рдЪрд╕реНрдк рдкрд╛рдпрд╛ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдореЗрд░реА рдЕрдкрдиреА рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкреНрд░рддрд┐рдзреНрд╡рдирд┐рдд рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдореБрдлреНрдд рд╢рд╛рдо рдХреЛ, рдЗрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рд╕рд┐рд╕реНрдХреЛ IOS, IOS-XE рдФрд░ ASA рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди 2.7 рдореЗрдВ рдПрдХ рдкреНрд░реВрдл-рдСрдлрд╝-рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрд╛, рдЬреЛ рдорд┐рд▓рддрд╛ рд╣реИред рдмреБрдирд┐рдпрд╛рджреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВред


рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЯреНрд░реЗрди рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рд╕рд╛рдордЧреНрд░реА рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдФрд░ рдкрд╛рдЗрдерди рдХреА рдореВрд▓ рдмрд╛рддреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред
рд╣рд░ рдХрд┐рд╕реА рдХрд╛ рдмрд┐рд▓реНрд▓реА рдореЗрдВ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!


рддреНрдпрд╛рдЧ


рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ, рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЬреАрдирд┐рдпрд░ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдПрдХ рдкреЗрд╢реЗрд╡рд░ рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрднреА рддрдХ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИред рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ, рдЪрдпрдирд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╕рднреА рдХреЛрдб рдПрдордЖрдИрдЯреА рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдпрд╣ "рдЬреИрд╕рд╛ рд╣реИ" рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред


рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдФрд░ рд╕рдорд╛рдзрд╛рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдкрд╕рдВрдж


рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рдПрдХ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдХрд╛рд░реНрдп рдХреЛ рджреЛ рдореБрдЦреНрдп рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдЖрд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрде рдХреА рдкреНрд░рддреНрдпрдХреНрд╖ рдЦреЛрдЬред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреГрдердХреНрдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдордирдорд╛рдиреЗ рддрд░реАрдХреЗ рд╕реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрд╕рдПрдирдПрдордкреА рдпрд╛ рд░реАрд╕реНрдЯ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рд╕реЗ рдорд╛рд░реНрдЧреЛрдВ рдХрд╛ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд▓рд╛, IPv4 рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдХреЛ IOS, IOS-XE рдФрд░ ASA рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреНрдп рд╕реНрд╡рд░реВрдкреЛрдВ рдФрд░ IPv6 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдорд╛рд░реНрдЧ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдорд╛рд░реНрдЧ рдХрд╛ рдЪреБрдирд╛рд╡ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд▓рдВрдмрд╛рдИ (рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЙрдкрд╕рд░реНрдЧ рдорд┐рд▓рд╛рди) рдХреЗ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЧ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдореИрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рд╕реЗ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдкреЗрдбрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рддреИрдпрд╛рд░ рд╕рдмрдиреЗрдЯрдЯреНрд░реА рдореЙрдбреНрдпреВрд▓ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред


рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдП рдЧрдП рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрднрд╛рдЧ рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд░рд╛рдЙрдЯрд┐рдВрдЧ рд▓реВрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд┐рд╕реА рднреА рдиреЛрдб рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рд╕рдмрдиреЗрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдпрджрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╡реАрдЖрд░рдПрдл рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдЙрдЯрд░ рд╣реИрдВред


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрд╣реЗ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд╕реАрдорд╛рдПрдВ, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдП рдЧрдП рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЖрдХрд╛рд░ рдХреЛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрд╡реЗрджрди рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдПрдХ рдЖрдзреБрдирд┐рдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдореЗрдВ 1,000,000 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рдФрд╕рдд рд╕реАрдорд╛ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреА рд╣реИред рдЬреВрди 2018 рддрдХ рдмреАрдЬреАрдкреА рдлреБрд▓ рд╡реНрдпреВ рд╡рд╛рд▓реЗ рд░рд╛рдЙрдЯрд░ рдкрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 724,000+ рд░реВрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдореЛрдЯреЗ рдЕрдиреБрдорд╛рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ 1,000,000 рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рдЗрди-рдореЗрдореЛрд░реА рд╕реНрдЯреЛрд░реЗрдЬ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП, рд▓рдЧрднрдЧ 500 рдПрдордмреА рд░реИрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕ рдкреНрд░рдХрд╛рд░, 8 рдЬреАрдмреА рд░реИрдо (рд╣рдо рдЕрднреА рднреА 2018 рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рде рдПрдХ рдФрд╕рдд рдЙрддреНрдкрд╛рджрдХрддрд╛ рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рд╣рдореЗрдВ 14-16.000.000 рдорд╛рд░реНрдЧреЛрдВ рдХреА рдХреБрд▓ рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЯреЛрдкреЛрд▓реЙрдЬреА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрд╣реА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рдкреВрд░реНрдг рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ 18-20 рд░рд╛рдЙрдЯрд░ рдХрд╛ рдПрдХ рдЦрдВрдбред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдмрдбрд╝реЗ рдиреЗрдЯрд╡рд░реНрдХ (рдЬреИрд╕реЗ рддрдирд╛рд╡) рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рддрд░реНрдХ рдХреЛ рдПрдХ рдЖрдЙрдЯ-рдСрдл-рдореЗрдореЛрд░реА рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
640KB рд╕рднреА рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╣рдореЗрдВ рдЗрди-рдореЗрдореЛрд░реА рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред


рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛


рд╣рдо рдПрдХ рдЕрд▓рдЧ рдЙрдк-рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░реВрдЯрд┐рдВрдЧ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрд╛рд╣рд░ рд░рдЦ рджреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЪрд░ рдмрдирд╛ рджреЗрдВрдЧреЗ:


RT_DIRECTORY = "./routing_tables" 

рд╕рд┐рд╕реНрдХреЛ IOS рдФрд░ IOS-XE рдХреЗ рд▓рд┐рдП, рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:


рдЖрдИрдкреА тАЛтАЛрдорд╛рд░реНрдЧ рджрд┐рдЦрд╛рдПрдБ
 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 

рд╕рд┐рд╕реНрдХреЛ рдПрдПрд╕рдП рдореЗрдВ, рдкреНрд░рд╛рд░реВрдк рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрд╕рд░реНрдЧ рд▓рдВрдмрд╛рдИ рдХреЗ рдмрдЬрд╛рдп, рд╕рдмрдиреЗрдЯ рдорд╛рд╕реНрдХ рдХреЛ рджрд╢рдорд▓рд╡ рд╕рдВрдХреЗрддрди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


рдорд╛рд░реНрдЧ рджрд┐рдЦрд╛рдПрдБ
 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 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдорд╣рд╛рди рд╡рд┐рд╡рд┐рдзрддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рд╕рдорд╛рди рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рджреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдореВрд╣ рд╕рд╛рдордиреЗ рдЖрддреЗ рд╣реИрдВ: рд╕реНрдерд╛рдиреАрдп + рдХрдиреЗрдХреНрдЯреЗрдб рдорд╛рд░реНрдЧ рдФрд░ рдмрд╛рдХреА рд╕рдмред
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреА рд╢рд┐рдХрд╛рдпрдд рдХрд░рдирд╛ рдЕрдЧрд▓реА рдЖрд╢рд╛рдУрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рдорд╛рд░реНрдЧ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдирд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рдПрдХ рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдПрдХ рдкрд╛рда рдЪрд░ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднрд░реА рд╣реБрдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдХрдИ рдореИрдЪреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реИред


рд╣рдо рд╕реВрдЪреАрдмрджреНрдз рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдФрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд┐рдЦреЗрдВрдЧреЗ:


 # Local and Connected route strings matching. REGEXP_ROUTE_LOCAL_CONNECTED = re.compile( '^(?P<routeType>[L|C])\s+' + '((?P<ipaddress>\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)' + '\s?' + '(?P<maskOrPrefixLength>(\/\d\d?)?' + '|(\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)?))' + '\ is\ directly\ connected\,\ ' + '(?P<interface>\S+)', re.MULTILINE ) # Static and dynamic route strings matching. REGEXP_ROUTE = re.compile( '^(\S\S?\*?\s?\S?\S?)' + '\s+' + '((?P<subnet>\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)' + '\s?' + '(?P<maskOrPrefixLength>(\/\d\d?)?' +'|(\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)?))' + '\s*' + '(?P<viaPortion>(?:\n?\s+(\[\d\d?\d?\/\d+\])\s+' + 'via\s+(\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)(.*)\n?)+)', re.MULTILINE ) 

рдореИрдЪреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдХреЛрдб рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдирд╛рдорд┐рдд рд╕рдореВрд╣ рд╣реИрдВ ред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдорд╛рд░реНрдЧ рд╕реЗ рдЖрдкрдХреЛ рдПрдХ рдЙрдкрд╕рд░реНрдЧ ( рд╕рдмрдиреЗрдЯ / рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдорд╛рд╕реНрдХрдСрд░реЗрдкреНрд░рд┐рдлрд╝рд┐рдХреНрд╕рд▓рд┐рдлреНрдЯ рд╕рдореВрд╣ ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рддреА рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдБ рдЬрд╛рддрд╛ рд╣реИ ( рдереНрд░реВрдкреЛрд░реНрдЯ / рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдореВрд╣реЛрдВ)


рдЪреВрдВрдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреА рд╣реИрдВ , рдорд╛рд╕реНрдХрдСрд░реЗрдкреНрд░рд┐рдлрд╝рд┐рдХреНрд╕рд▓рд┐рдлреНрдЯ рд╕рдореВрд╣ рдореЗрдВ рдПрдХ рд╕рдмрдиреЗрдЯ рдорд╛рд╕реНрдХ рдпрд╛ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд▓рдВрдмрд╛рдИ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рдПрдХ рдПрдХрд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХрдо рдХрд░ рджреЗрдВрдЧреЗ; рд╣рдо рдЙрдкрд╕рд░реНрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдиреНрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ:


 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 "" 

IPP4 рдкрддреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реБрдП, рдереНрд░реВрдкреЛрд░реНрдк рдЧреНрд░реБрдк рд╕реЗ рдЕрдЧрд▓реА-рд╣реЙрдк рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:


 # Route string VIA portion matching. REGEXP_VIA_PORTION = re.compile( '.*via\s+(\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?).*' ) # RegEx template string for IPv4 address matching. REGEXP_IPv4_STR = ( '((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))' ) # IPv4 CIDR notation matching in user input. REGEXP_INPUT_IPv4 = re.compile("^" + REGEXP_IPv4_STR + "(\/\d\d?)?$") 

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдкрд╛рдпрдерди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рд╕реЗ рдЙрддреНрдкрдиреНрди рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЛ рдЙрдкрд╕рд░реНрдЧ рд╡реГрдХреНрд╖ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрдкрд╕рд░реНрдЧ рдЯреНрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдмрдиреЗрдЯрдЯреНрд░реА рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред
рдкреЗрдбрд╝ рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рдЕрдЧрд▓реА рдЙрдореНрдореАрджреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рдПрдХ рд╕реВрдЪреА рд▓реМрдЯрд╛рдПрдЧрд╛ рдФрд░ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рд░реНрдЧ рдХрд╛ рдПрдХ рдкреВрд░реНрдг рдкрд╛рдард╛рддреНрдордХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╕реНрдерд╛рдиреАрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдПрдБред
рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЙрдЯрд░ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЙрдкрд░реЛрдХреНрдд рдбреЗрдЯрд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВред


 # Example data structures route_tree = SubnetTree.SubnetTree() route_tree['subnet'] = ((next_hop_1, next_hop_n), raw_route_string) interface_list = ((interface_1, ip_address_1), (interface_n, ip_address_n)) connected_networks = ((interface_1, subnet_1), (interface_n, subnet_n)) router = { 'routing_table': route_tree, 'interface_list': interface_list, 'connected_networks': connected_networks, } 

рд╣рдо рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ:


 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, } 

рд╣рдореЗрдВ рдкрде-рдЦреЛрдЬ рдХреЗ рджреМрд░рд╛рди рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЕрдЧрд▓реЗ-рд╣реЙрдк рдХреЗ рдЖрдИрдкреА рдкрддреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдЧрд▓реЗ рд░рд╛рдЙрдЯрд░ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд░рд╛рдЙрдЯрд░ рдФрд░ рдкрд╣рдЪрд╛рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд▓реМрдЯреЗ рдЯреЛрдкреЛрд▓реЙрдЬреА рдФрд░ рд╢реАрдЯ рдореЗрдВ рд╕рднреА рдЬреНрдЮрд╛рдд рд░рд╛рдЙрдЯрд░ рдХреЗ рдЖрдИрдкреА рдкрддреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЙрдкрд╕рд░реНрдЧ рдЯреНрд░реА рдмрдирд╛рддреЗ рд╣реИрдВред


 # Example GLOBAL_INTERFACE_TREE = SubnetTree.SubnetTree() GLOBAL_INTERFACE_TREE['ip_address'] = (router_id, interface_type) # Returns RouterID by Interface IP address which it belongs to. def get_rid_by_interface_ip(interface_ip): if interface_ip in GLOBAL_INTERFACE_TREE: return GLOBAL_INTERFACE_TREE[interface_ip][0] 

рдЖрдЗрдП, IOS / IOS-XE / ASA рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рде рдкрд╛рд░реНрд╕рд░ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦреЗрдВред рдЗрдирдкреБрдЯ рдкрд░, рд╣рдо рдЗрд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдлреЙрд░реНрдо рдореЗрдВ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╣рдореЗрдВ рдКрдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд░рд╛рдЙрдЯрд░ рдбрд┐рдХреНрд╢рдирд░реА рдорд┐рд▓рддреА рд╣реИред


 def parse_show_ip_route_ios_like(raw_routing_table): router = {} route_tree = SubnetTree.SubnetTree() interface_list = [] # Parse Local and Connected route strings in text. for raw_route_string in REGEXP_ROUTE_LOCAL_CONNECTED.finditer(raw_routing_table): subnet = ( raw_route_string.group('ipaddress') + convert_netmask_to_prefix_length( raw_route_string.group('maskOrPrefixLength') ) ) interface = raw_route_string.group('interface') route_tree[subnet] = ((interface,), raw_route_string.group(0)) if raw_route_string.group('routeType') == 'L': interface_list.append((interface, subnet,)) if not interface_list: print('Failed to find routing table entries in given output') return None # parse static and dynamic route strings in text for raw_route_string in REGEXP_ROUTE.finditer(raw_routing_table): subnet = ( raw_route_string.group('subnet') + convert_netmask_to_prefix_length( raw_route_string.group('maskOrPrefixLength') ) ) via_portion = raw_route_string.group('viaPortion') next_hops= [] if via_portion.count('via') > 1: for line in via_portion.splitlines(): if line: next_hops.append(REGEXP_VIA_PORTION.match(line).group(1)) else: next_hops.append(REGEXP_VIA_PORTION.match(via_portion).group(1)) route_tree[subnet] = (next_hops, raw_route_string.group(0)) router = { 'routing_table': route_tree, 'interface_list': interface_list, } return router 

рд╣рдо рджреВрд╕рд░реЗ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 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 рд▓рд┐рдВрдХ рдХрд┐рдирд╛рд░реЛрдВ рд╣реИрдВред
рд░рд╛рдЙрдЯрд░ рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рд░рд╛рдЙрдЯрд░ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреБрдВрдЬреА рдореЗрдВ, рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЕрдЧрд▓реЗ рд╣реЙрдкреНрд╕ рдХреЗ рдЖрдИрдкреА рдкрддреЗ рдХреЗ рд▓рд┐рдВрдХред рдпрд╣реА рд╣реИ, GLOBAL_INTERFACE_TREE рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ, рдЬреЛ рдЖрдИрдкреА рдкрддреЗ рджреНрд╡рд╛рд░рд╛ рд░рд╛рдЙрдЯрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдВрдЫрд┐рдд рд╕рдмрдиреЗрдЯ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдЧреНрд░рд╛рдл рдЖрд╕рдиреНрди рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред


рдпрджрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рд╛рдЙрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛рдПрдВ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕ рдкрде рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдкреИрдХреЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рдирдЬрд╝рд░ рд╕реЗ рд▓реЗрдХрд░ рдПрдЖрд░рдкреА рдЕрдиреБрд░реЛрдз (рдпрд╛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд░реВрдЯрд░_рдб ) рдФрд░ рд░реВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рддрд░реНрдХ (рдЖрд░рдЖрдИрдмреА / рдПрдЖрдИрдЖрдИрд╕реА рдФрд░ рдЕрдиреНрдп рдЕрдиреБрдХреВрд▓рди рд╕реЗ рдЕрдореВрд░реНрдд) рдХреЛ рдкреБрди: рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╛ рдбреНрд░реЙрдк рдкреИрдХреЗрдЬ, рдкрд░рд┐рдгрд╛рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред


рд╣рдо рд░рд╛рдЙрдЯрд░ рдкрд░ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкрде рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдкрде рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЦрдВрдб рдХреЛ рд░реВрдЯрд░_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 # Path to directory with routing table files. # Each routing table MUST be in separate .txt file. RT_DIRECTORY = "./routing_tables" # RegEx template string for IPv4 address matching. REGEXP_IPv4_STR = ( '((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))' ) # IPv4 CIDR notation matching in user input. REGEXP_INPUT_IPv4 = re.compile("^" + REGEXP_IPv4_STR + "(\/\d\d?)?$") # Local and Connected route strings matching. REGEXP_ROUTE_LOCAL_CONNECTED = re.compile( '^(?P<routeType>[L|C])\s+' + '((?P<ipaddress>\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)' + '\s?' + '(?P<maskOrPrefixLength>(\/\d\d?)?' + '|(\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)?))' + '\ is\ directly\ connected\,\ ' + '(?P<interface>\S+)', re.MULTILINE ) # Static and dynamic route strings matching. REGEXP_ROUTE = re.compile( '^(\S\S?\*?\s?\S?\S?)' + '\s+' + '((?P<subnet>\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)' + '\s?' + '(?P<maskOrPrefixLength>(\/\d\d?)?' +'|(\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)?))' + '\s*' + '(?P<viaPortion>(?:\n?\s+(\[\d\d?\d?\/\d+\])\s+' + 'via\s+(\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)(.*)\n?)+)', re.MULTILINE ) # Route string VIA portion matching. REGEXP_VIA_PORTION = re.compile( '.*via\s+(\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?).*' ) # Store for 'router' objects generated from input routing table files. # Each file is represented by single 'router' object. # Router is referenced by Router ID (RID). # RID is filename by default. # Format: # # ROUTERS = { # 'RID1': {'routing_table': {}, 'interface_list': ()}, # 'RID_N': {'routing_table': {}, 'interface_list': ()}, # } # ROUTERS = {} # Global search tree for Interface IP address to Router ID (RID) resolving. # Stores Interface IP addresses as keys. # Returns (RID, interfaceID) list. # Interface IP addresses SHOULD be globally unique across inspected topology. GLOBAL_INTERFACE_TREE = SubnetTree.SubnetTree() def parse_show_ip_route_ios_like(raw_routing_table): """ Parser for routing table text output. Compatible with both Cisco IOS(IOS-XE) 'show ip route' and Cisco ASA 'show route' output format. Processes input text file and writes into Python data structures. Builds internal SubnetTree search tree in 'route_tree'. Generates local interface list for router in 'interface_list' Returns 'router' dictionary object with parsed data. """ router = {} route_tree = SubnetTree.SubnetTree() interface_list = [] # Parse Local and Connected route strings in text. for raw_route_string in REGEXP_ROUTE_LOCAL_CONNECTED.finditer(raw_routing_table): subnet = ( raw_route_string.group('ipaddress') + convert_netmask_to_prefix_length( raw_route_string.group('maskOrPrefixLength') ) ) interface = raw_route_string.group('interface') route_tree[subnet] = ((interface,), raw_route_string.group(0)) if raw_route_string.group('routeType') == 'L': interface_list.append((interface, subnet,)) if not interface_list: print('Failed to find routing table entries in given output') return None # parse static and dynamic route strings in text for raw_route_string in REGEXP_ROUTE.finditer(raw_routing_table): subnet = ( raw_route_string.group('subnet') + convert_netmask_to_prefix_length( raw_route_string.group('maskOrPrefixLength') ) ) via_portion = raw_route_string.group('viaPortion') next_hops= [] if via_portion.count('via') > 1: for line in via_portion.splitlines(): if line: next_hops.append(REGEXP_VIA_PORTION.match(line).group(1)) else: next_hops.append(REGEXP_VIA_PORTION.match(via_portion).group(1)) route_tree[subnet] = (next_hops, raw_route_string.group(0)) router = { 'routing_table': route_tree, 'interface_list': interface_list, } return router 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 convert_netmask_to_prefix_length(mask_or_pref): """ Gets subnet_mask (XXX.XXX.XXX.XXX) of /prefix_length (/XX). For subnet_mask, converts it to /prefix_length and returns result. For /prefix_length, returns as is. For empty input, returns "" string. """ 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 "" def route_lookup(destination, router): """ Performs route_tree lookup in passed router object for passed destination subnet. Returns list of next_hops with original route strings or (None,None) depending on lookup result. """ if destination in router['routing_table']: return router['routing_table'][destination] else: return (None, None) def get_rid_by_interface_ip(interface_ip): """Returns RouterID by Interface IP address which it belongs to.""" if interface_ip in GLOBAL_INTERFACE_TREE: return GLOBAL_INTERFACE_TREE[interface_ip][0] def nexthop_is_local(next_hop): """ Check if nexthop points to local interface. Will be True for Connected and Local route strings on Cisco devices. """ 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 trace_route(source_router_id, target_ip, path=[]): """ Performs recursive path search from source Router ID (RID) to target subnet. Returns tuple of path tuples. Each path tuple contains a sequence of Router IDs with matched route strings. Multiple paths are supported. """ 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 do_parse_directory(rt_directory): """ Go through specified directory and parse all .txt files. Generate router objects based on parse result if any. Populate new_routers with those router objects. Default key for each router object is FILENAME. Return new_routers. """ 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 {} 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 def do_user_interactive_search(): """ Provides interactive search dialog for user. Asks user for target subnet or host in CIDR notation. Validates input. Prints error and goes back to start for invalid input. Executes path search to given target from each router in global ROUTERS. Prints formatted path search result. Goes back to start. """ 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() 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ


рдЪрд╛рд░ рд╕рд┐рд╕реНрдХреЛ CSR-1000v рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕рд╛рд░ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХреЗ рд╕рд╛рде рд╕рд╢рд╕реНрддреНрд░:



рд╡реЗ рдЧрд┐рдЧрд╛рдмрд┐рдЯ рдИрдерд░рдиреЗрдЯ 2 рдФрд░ 3 рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝реЗ рдореЗрдВ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рдИрдЖрдИрдЬреАрдЖрд░рдкреА рдкрдбрд╝реЛрд╕ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдХрдиреЗрдХреНрдЯреЗрдб рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЙрдЯрд░ рдХреЗ рдкреАрдЫреЗ рд▓реВрдкрдмреИрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
Csr1000v-01 рдФрд░ csr1000v-04 рдХреЗ рдмреАрдЪ, рджреЛ GRE рд╕реБрд░рдВрдЧреЛрдВ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд░рд┐рдореЛрдЯ рдЖрдИрдкреА рдкрддреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЬреЛ рд╕реНрдереИрддрд┐рдХ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ 10.0.0.0/8 рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд░реВрдЯрд┐рдВрдЧ рд▓реВрдк рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХреГрдд рд╣реИрдВред


csr1000v-01 # рд╢реЛ рдЖрдИрдкреА рдорд╛рд░реНрдЧ
 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 # рд╢реЛ рдЖрдИрдкреА рдорд╛рд░реНрдЧ
 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 # рд╢реЛ рдЖрдИрдкреА рдорд╛рд░реНрдЧ
 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- .


Enter Target Subnet or Host: 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 ) . , .


, - .
, .

Source: https://habr.com/ru/post/hi414043/


All Articles