|
|
Linha 8: |
Linha 8: |
| Para utilizar o script você precisará do módulo '''netmiko''' instalado. Esse módulo te permite fazer conexões, via python, em diversos tipos de devices. Como utilizaremos o Debian aqui, é bem simples de instalar: | | Para utilizar o script você precisará do módulo '''netmiko''' instalado. Esse módulo te permite fazer conexões, via python, em diversos tipos de devices. Como utilizaremos o Debian aqui, é bem simples de instalar: |
| # apt install python3-netmiko | | # apt install python3-netmiko |
− | Instalado o '''netmiko''' basta criar o script abaixo. Este script é a primeira versão, pode conter bugs mas sinta-se convidado a ajudar a melhorá-lo. Pode me contactar para isso. | + | Instalado o '''netmiko''' basta pegar o script no '''Github''' em [https://github.com/gondimcodes/lgview '''https://github.com/gondimcodes/lgview''']. Este script é a primeira versão, pode conter bugs mas sinta-se convidado a ajudar a melhorá-lo. |
− | #!/usr/bin/env python3
| + | |
− | <nowiki>'''</nowiki>
| |
− | lgview is free software; you can redistribute it and/or modify
| |
− | it under the terms of the GNU General Public License as published by
| |
− | the Free Software Foundation; either version 2 of the License, or
| |
− | (at your option) any later version.
| |
− | <nowiki>#</nowiki>
| |
− | This program is distributed in the hope that it will be useful,
| |
− | but WITHOUT ANY WARRANTY; without even the implied warranty of
| |
− | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| |
− | GNU General Public License for more details.
| |
− | <nowiki>#</nowiki>
| |
− | You should have received a copy of the GNU General Public License
| |
− | along with this program; if not, write to the Free Software
| |
− | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
| |
− |
| |
− | Precisa do pacote: python3-netmiko
| |
− | <nowiki>'''</nowiki>
| |
− | import os
| |
− | import sys
| |
− | import re
| |
− | from netmiko import ConnectHandler
| |
− |
| |
− | __author__ = 'Marcelo Gondim'
| |
− | __version__= 1.0
| |
− | __datebegin__= "25/06/2023"
| |
− | <nowiki>#########################################################################</nowiki>
| |
− | routeviews = {
| |
− | <nowiki> </nowiki> "device_type": "cisco_xe",
| |
− | <nowiki> </nowiki> "host": "route-views.routeviews.org",
| |
− | <nowiki> </nowiki> "username": "rviews",
| |
− | <nowiki> </nowiki> "password": ""
| |
− | }
| |
− |
| |
− | ix_sp = {
| |
− | <nowiki> </nowiki> "device_type": "cisco_ios_telnet",
| |
− | <nowiki> </nowiki> "host": "lg.sp.ptt.br",
| |
− | }
| |
− |
| |
− | ix_rj = {
| |
− | <nowiki> </nowiki> "device_type": "cisco_ios_telnet",
| |
− | <nowiki> </nowiki> "host": "lg.rj.ix.br",
| |
− | }
| |
− |
| |
− | ix_ce = {
| |
− | <nowiki> </nowiki> "device_type": "cisco_ios_telnet",
| |
− | <nowiki> </nowiki> "host": "lg.ce.ix.br",
| |
− | }
| |
− |
| |
− | at_t = {
| |
− | <nowiki> </nowiki> "device_type": "cisco_ios_telnet",
| |
− | <nowiki> </nowiki> "host": "route-server.ip.att.net",
| |
− | <nowiki> </nowiki> "username": "rviews",
| |
− | <nowiki> </nowiki> "password": "rviews"
| |
− | }
| |
− |
| |
− | internexa = {
| |
− | <nowiki> </nowiki> "device_type": "juniper_junos",
| |
− | <nowiki> </nowiki> "host": "177.84.161.226",
| |
− | <nowiki> </nowiki> "username": "bgp_view",
| |
− | <nowiki> </nowiki> "password": "bgp_view"
| |
− | }
| |
− |
| |
− | algar = {
| |
− | <nowiki> </nowiki> "device_type": "juniper_junos",
| |
− | <nowiki> </nowiki> "host": "201.48.0.2",
| |
− | <nowiki> </nowiki> "username": "rviews",
| |
− | <nowiki> </nowiki> "password": "rviews"
| |
− | }
| |
− |
| |
− | <nowiki>#########################################################################</nowiki>
| |
− |
| |
− | try:
| |
− | <nowiki> </nowiki> prefixo = sys.argv[1]
| |
− | <nowiki> </nowiki> asn_mitigacao = sys.argv[2]
| |
− | <nowiki> </nowiki> asn_prefixo = sys.argv[3]
| |
− | except:
| |
− | <nowiki> </nowiki> print("Parametros faltando! Precisa passar o prefixo IPv4 /24 mitigado, o ASN mitigador e o ASN do prefixo mitigado.")
| |
− | <nowiki> </nowiki> print("Ex.: ./lgview.py 192.168.0.0/24 65000 65001")
| |
− | <nowiki> </nowiki> exit(0)
| |
− |
| |
− |
| |
− | def grep(texto, dado):
| |
− | <nowiki> </nowiki> linhas = texto.split('\n')
| |
− | <nowiki> </nowiki> lista = []
| |
− |
| |
− | <nowiki> </nowiki> for linha in linhas:
| |
− | <nowiki> </nowiki> if re.search(dado, linha):
| |
− | <nowiki> </nowiki> if "community" not in linha.lower():
| |
− | <nowiki> </nowiki> lista.append(linha)
| |
− |
| |
− | <nowiki> </nowiki> return lista
| |
− |
| |
− | os.system('cls' if os.name == 'nt' else 'clear')
| |
− | titulo = "LGVIEW - Lista prefixos nos Looking Glass para troubleshooting de Mitigacao DDoS - %s - v%s - %s" % (__author__, __version__,__datebegin__)
| |
− | print("#"*126)
| |
− | print(" %s" %(titulo))
| |
− | print("#"*126)
| |
− | print("Verificando Prefixo: " + prefixo + "\n")
| |
− | <nowiki>#########################################################################</nowiki>
| |
− |
| |
− | print("Checando LG: route-views.routeviews.org")
| |
− | consulta = ConnectHandler(**routeviews)
| |
− | consulta.send_command('terminal length 0')
| |
− | resultado = consulta.send_command('show ip bgp ' + prefixo)
| |
− |
| |
− | busca = grep(resultado, asn_prefixo)
| |
− |
| |
− | for elemento in busca:
| |
− | <nowiki> </nowiki> if asn_mitigacao not in elemento:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[91m' + elemento + '\033[0m')
| |
− | <nowiki> </nowiki> else:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[92m' + elemento + '\033[0m')
| |
− |
| |
− | <nowiki>#########################################################################</nowiki>
| |
− |
| |
− | print("Checando LG: IX-SP")
| |
− | consulta = ConnectHandler(**ix_sp)
| |
− | consulta.send_command('terminal length 0')
| |
− | resultado = consulta.send_command('show ip bgp ' + prefixo)
| |
− |
| |
− | busca = grep(resultado, asn_prefixo)
| |
− |
| |
− | for elemento in busca:
| |
− | <nowiki> </nowiki> if asn_mitigacao not in elemento:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[91m' + elemento + '\033[0m')
| |
− | <nowiki> </nowiki> else:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[92m' + elemento + '\033[0m')
| |
− |
| |
− | <nowiki>#########################################################################</nowiki>
| |
− |
| |
− | print("Checando LG: IX-RJ")
| |
− | consulta = ConnectHandler(**ix_rj)
| |
− | consulta.send_command('terminal length 0')
| |
− | resultado = consulta.send_command('show ip bgp ' + prefixo)
| |
− |
| |
− | busca = grep(resultado, asn_prefixo)
| |
− |
| |
− | for elemento in busca:
| |
− | <nowiki> </nowiki> if asn_mitigacao not in elemento:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[91m' + elemento + '\033[0m')
| |
− | <nowiki> </nowiki> else:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[92m' + elemento + '\033[0m')
| |
− |
| |
− | <nowiki>#########################################################################</nowiki>
| |
− |
| |
− | print("Checando LG: IX-CE")
| |
− | consulta = ConnectHandler(**ix_ce)
| |
− | consulta.send_command('terminal length 0')
| |
− | resultado = consulta.send_command('show ip bgp ' + prefixo)
| |
− |
| |
− | busca = grep(resultado, asn_prefixo)
| |
− |
| |
− | for elemento in busca:
| |
− | <nowiki> </nowiki> if asn_mitigacao not in elemento:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[91m' + elemento + '\033[0m')
| |
− | <nowiki> </nowiki> else:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[92m' + elemento + '\033[0m')
| |
− |
| |
− | <nowiki>#########################################################################</nowiki>
| |
− |
| |
− | print("Checando LG: AT&T")
| |
− | consulta = ConnectHandler(**at_t)
| |
− | consulta.send_command('set cli screen-length 0')
| |
− | resultado = consulta.send_command('show route protocol bgp ' + prefixo)
| |
− |
| |
− | busca = grep(resultado, asn_prefixo)
| |
− |
| |
− | for elemento in busca:
| |
− | <nowiki> </nowiki> if asn_mitigacao not in elemento:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[91m' + elemento + '\033[0m')
| |
− | <nowiki> </nowiki> else:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[92m' + elemento + '\033[0m')
| |
− |
| |
− | <nowiki>#########################################################################</nowiki>
| |
− |
| |
− | print("Checando LG: Internexa")
| |
− | consulta = ConnectHandler(**internexa)
| |
− | consulta.send_command('set cli screen-length 0')
| |
− | resultado = consulta.send_command('show route protocol bgp ' + prefixo)
| |
− |
| |
− | busca = grep(resultado, asn_prefixo)
| |
− |
| |
− | for elemento in busca:
| |
− | <nowiki> </nowiki> if asn_mitigacao not in elemento:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[91m' + elemento + '\033[0m')
| |
− | <nowiki> </nowiki> else:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[92m' + elemento + '\033[0m')
| |
− |
| |
− | <nowiki>#########################################################################</nowiki>
| |
− |
| |
− | print("Checando LG: Algar")
| |
− | consulta = ConnectHandler(**algar)
| |
− | consulta.send_command('set cli screen-length 0')
| |
− | resultado = consulta.send_command('show route protocol bgp ' + prefixo)
| |
− |
| |
− | busca = grep(resultado, asn_prefixo)
| |
− |
| |
− | for elemento in busca:
| |
− | <nowiki> </nowiki> if asn_mitigacao not in elemento:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[91m' + elemento + '\033[0m')
| |
− | <nowiki> </nowiki> else:
| |
− | <nowiki> </nowiki> print('AS-PATH: ' + '\033[92m' + elemento + '\033[0m')
| |
− |
| |
− | <nowiki>#########################################################################</nowiki>
| |
| Para executar é bem simples, passe como parâmetros: o '''prefixo IPv4 /24''' que quer fazer a busca, o '''ASN da empresa mitigadora''' e o '''ASN do seu prefixo'''. Abaixo um exemplo de chamada: | | Para executar é bem simples, passe como parâmetros: o '''prefixo IPv4 /24''' que quer fazer a busca, o '''ASN da empresa mitigadora''' e o '''ASN do seu prefixo'''. Abaixo um exemplo de chamada: |
| # ./lgview.py 198.51.100.0/24 65200 65001 | | # ./lgview.py 198.51.100.0/24 65200 65001 |