Como Ter Seu Proprio Looking Glass

De Wiki BPF
Ir para navegação Ir para pesquisar

Introdução

Assim como explicado em detalhes no artigo Looking Glass, ter um LG é fundamental para sua rede, principalmente se o ISP em questão for transito. Mesmo se tratando de casos onde não é transito, ter um LG facilita muito o troubleshooting para o seu time técnico e também para outros profissionais que precisem fazer troubleshoot em outras redes.

Na tentativa de incentivar todos os ISP's a terem seu próprio Looking Glass, vou explicar passo-a-passo como configurar um utilizando um LG OpenSource Web utilizando Debian 12, caso tenha preferencia por outra distribuição, apenas adapte conforme sua necessidade.

Instalações Iniciais

Após instalar seu Debian 12 em minimal-install, atualize seus repositórios com o comando abaixo:

apt update -y

Instale as dependências:

apt install git apache2 libapache2-mod-php php php-xml composer -y

Faça o clone do LG no GitHub:

git clone https://github.com/respawner/looking-glass.git /var/www/html/lg

Reinicie o serviço do Apache2:

systemctl restart apache2.service

Mova os arquivos da pasta /var/www/html/lg para /var/www/html/ , de forma que consiga acessar sem especificar um folder:

mv /var/www/html/lg/* /var/www/html/

Por padrão você só conseguirá acessar o LG a partir do momento que copiar o arquivo config.php.example para config.php, e é exatamente o que faremos agora.

(Prefira copiar a mover/renomear, para que possa ter backup da configuração padrão)

LookingGlassDefaultScreen.png

cd /var/www/html

cp config.php.example config.php

Remova o arquivo index.html:

rm index.html

Rode o composer para instalar o remanescente. Esse passo é necessário desde a versão 2.3.0. Caso a pagina fique quebrada, provavelmente está faltando esse passo!!

composer install

Caso tenha deixado seu linux em DHCP, verifique qual o IP recebido utilizando seguinte comando:

ip addr

Supondo que o IP seja 192.0.2.2, acesse com a seguinte URL:

http://192.0.2.2

O próximo passo é editar o arquivo de configuração que copiamos, para isso, utilize o editor de texto de sua preferencia.

nano /var/www/html/config.php

No arquivo de configuração possuímos alguns campos básicos como:

  • Nome;
  • E-mail;
  • Titulo;
  • Logo;
  • Disclaimer.

Esses campos deverão ser preenchidos mediante suas informações, segue um exemplo:

Lg.png

$config['contact']['name'] = 'NOC HexaNetworks';

$config['contact']['mail'] = 'andredias@hexanetworks.com.br';

// Frontpage configuration

// Title of the page

$config['frontpage']['title'] = 'Looking Glass - Hexa Networks';

// Logo to display (remove it to not display any logo)

$config['frontpage']['image'] = 'logo.png';

//Caso precise redimensionar a logo, pode colocar a linha abaixo e organizar a porcentagem mediante o que precisar.

$config['frontpage']['image_width'] = '35%';

// Disclaimer to inform people using the looking glass

// Set it to null to not display a disclaimer

$config['frontpage']['disclaimer'] = '';

AntiSpam

Caso queira utilizar a função de anti-spam, precisará instalar o modulo de SQLITE para o PHP. Como nesse tutorial não utilizaremos essa função, apenas adicione a linha abaixo no arquivo de configuração:

$config['antispam']['enabled'] = false;

Caso essa linha não for adicionada, o seguinte erro aparecerá na tela:

Error!

Unable to open database: SQLSTATE[HY000] [14] unable to open database file

VRF

VRF (Virtual Routing and Forwarding) são tabelas de roteamento virtuais que podem ser criadas nos equipamentos. Pensando em cenários em que os fullroutes são recebidos em uma VRF, foi adicionado essa função no projeto.

No nosso caso também não utilizaremos VRF, sendo assim, encontre a seguinte linha no final do arquivo config.php:

$config['vrfs']['enabled'] = true;

Altere para false, ficando da seguinte forma:

$config['vrfs']['enabled'] = false;

Comunicação com Roteadores

Para que o Looking Glass consiga coletar as informações que serão expostas na tela, ele precisará se comunicar com alguém. Isso pode acontecer inputando comandos dentro dos seus roteadores de borda, ou inputando comando em um daemon de BGP local (FRRouting por exemplo) que tenha um iBGP fechado com seus roteadores de borda. Ambos os metodos são explicados mais a baixo.

Para que isso aconteça, é necessario configurar essas informações diretamente no arquivo config.php, informando com quem o PHP se comunicará. O exemplo abaixo já vem pronto no arquivo:

// Authentication based on SSH or Telnet with password

// The hostname or the IP address

$config['routers']['router1']['host'] = 'r1.example.net';

// The user to use to connect to the router

$config['routers']['router1']['user'] = 'readonlyuser';

// The password of the given user

$config['routers']['router1']['pass'] = 'readonlypassword';

// The authentication mechanism to use (can be ssh-password or telnet)

$config['routers']['router1']['auth'] = 'ssh-password';

// The router type (can be cisco, ios, juniper or junos)

$config['routers']['router1']['type'] = 'juniper';

// The router source interface to be used

$config['routers']['router1']['source-interface-id'] = 'lo0';

// The router description to be displayed in the router list

$config['routers']['router1']['desc'] = 'Example\'s Router 1';

É possível informar diversos roteadores, apenas mudando o numero do equipamento. No exemplo acima pode reparar que está sendo usado como ['router1']. Caso queria ter mais equipamentos, basta copiar e adicionar abaixo router2, router 3 etc.

Método 01 - Inputando comandos no seu roteador de borda

Esse além de ser o método que recomendamos, é o método mais convencional visto de Looking Glass. Ele é interessante pois conseguirá ver além das rotas que foram eleitas para a FIB, também rotas que permanecem acomodadas apenas na RIB.

Nesse método o LG roda comandos em seu roteador de borda com intuito de ver como determinadas rotas são aprendidas, além de poder realizar pings e traceroutes. Após isso, o retorno desses comandos é exposto na tela do usuario. O detalhe desse método que que depende do projeto ter suporte a fabricante do roteador que você utiliza, onde no git deles consta os seguintes vendors suportados:

  • Support the following router types:
    • Arista
    • BIRD (v1 and v2)
    • Cisco (IOS and IOS-XR)
    • Extreme/Brocade NetIron
    • FRRouting
    • Huawei (VRP)
    • Juniper
    • Mikrotik/RouterOS
    • Nokia
    • OpenBGPd
    • Quagga
    • Vyatta/VyOS/EdgeOS

Para que isso seja possível, é necessario que seu roteador de borda tenha um usuario criado com permissão para esse tipo de comando. Inclusive, não é necessario ter acesso de escrita no equipamento!. Sugiro inclusive que, caso possível, limite os comandos que esse usuario conseguirá dar na caixa por motivos de segurança.

Tendo isso em mente, vamos configurar um exemplo para se comunicar com um roteador Huawei NE:

// IP ou dominio do seu roteador de borda; $config['routers']['router1']['host'] = '192.0.2.100';

// Usuario criado no equipamento; $config['routers']['router1']['user'] = 'lookingglass';

// Senha do usuario que foi criado; $config['routers']['router1']['pass'] = 'SenhaChuckNorris';

// Metodo de autenticação utilizada, podendo ser ssh-password ou telnet. Recomendamos utilização de SSH!

$config['routers']['router1']['auth'] = 'ssh-password';

// Por padrão ele consultará na porta 22 do SSH. Caso tenha sua porta alterada, pode especificar através da linha abaixo. Essa linha é opcional.

$config['routers']['router1']['port'] = '22';

// Fabricante do equipamento. No exemplo utilizaremos huawei;

$config['routers']['router1']['type'] = 'huawei';

// IP ou interface que originará ping e traceroute

$config['routers']['router1']['source-interface-id'] = '192.0.2.100';

// Nome do equipamento que aparecerá na interface Web. Sugiro especificar a cidade, POP ou algo que fique facil para o usuario identificar. Abaixo é um exemplo do que usamos:

$config['routers']['router1']['desc'] = 'HEXANETWORKS-RT-NE8000F1A-BGP01-SPO-SP4';

Caso já esteja tudo pronto do lado do roteador, já deverá conseguir consultar informações através da interface Web!

Método 02 - Utilizando FFRouting

Outra forma é subir um FFRouting e mandar o PHP checar diretamente nele. Dessa forma precisará subir um iBGP do FRR para seus roteadores de borda. A vantagem é que é agnostico a vendor, e a desvantagem é que conseguirá checar apenas a FIB dos roteadores de borda.

Esse arquivo vem pré-configurado para conversar com varios roteadores. Aqui explicarei um cenário simples, onde o FRRouting estará instalado no mesmo S.O. que o LG. Caso precise que funcione em um ambiente diferente, você terá que adaptar para o cenário de sua rede, utilizando a mesma lógica aqui explicada.

Seguindo a mesma logica do anterior, vamos editar apenas as linhas relacionadas ao "router1".

Configure mediante o exemplo:

// Authentication based on SSH or Telnet with password

// The hostname or the IP address

$config['routers']['router1']['host'] = '127.0.0.1';

// The user to use to connect to the router

$config['routers']['router1']['user'] = 'lookingglass';

// The password of the given user

$config['routers']['router1']['pass'] = 'SENHA-DO-USUARIO-LOOKINGGLASS';

// The authentication mechanism to use (can be ssh-password or telnet)

$config['routers']['router1']['auth'] = 'ssh-password';

// The router type (can be cisco, ios, juniper or junos)

$config['routers']['router1']['type'] = 'quagga';

// The router source interface to be used

//$config['routers']['router1']['source-interface-id'] = 'lo0';

// The router description to be displayed in the router list

Lg-roteador-de-borda.png

$config['routers']['router1']['desc'] = 'Roteador de Borda';

Acima determinamos que:

  • O LG fará consulta local;
  • Utilizará o usuário "lookingglass" para tal;
  • Com a senha "SENHA-DO-USUARIO-LOOKINGGLASS";
  • Utilizará SSH;
  • O arquivo de configuração não suporta FRRouting como parâmetro, sendo assim, iremos setar como Quagga. Como ambos possuem sintaxes semelhantes (Cisco-Like), será totalmente compatível;
  • Comentamos a interface de origem;
  • A descrição do roteador é "Roteador de Borda".

Caso queira remover o restante dos roteadores que aparecem, basta apagar ou comentar (//) as linhas referente aos outros roteadores.

O proximo passo é instalar o FRRouting:

apt-get install frr

Adicione o usuario "lookingglass" no seu linux, e o adicione ao grupo "frr":

adduser lookingglass

Informe a senha

Repita a senha

usermod -aG frrvty lookingglass

Acesse a pasta o arquivo daemons do FRR:

nano /etc/frr/daemons

Altere a linha bgpd=no para bgpd=yes e reinicie o FRR:

service frr restart

Utilize o comando vtysh para acessar a VTY do frr.

O próximo passo é basicamente fechar uma sessão iBGP entre seu roteador de borda, e o FRR. Caso não esteja habituado com configuração Cisco-Like, segue um exemplo:

router bgp 65000

neighbor 192.0.2.1 remote-as 65000

neighbor 2001:db8::2 remote-as 65000

!

address-family ipv4 unicast

  neighbor 192.0.2.1 route-map IMPORT in

  neighbor 192.0.2.1 route-map EXPORT out

exit-address-family

!

address-family ipv6 unicast

  neighbor 2001:db8::2 route-map IMPORT in

  neighbor 2001:db8::2 route-map EXPORT out

exit-address-family

!

route-map IMPORT permit 10

!

route-map EXPORT deny 1

Após isso, já terá seu Looking Glass em funcionamento, sem ter que se preocupar com integração de vendor, e com total suporte a IPv6.

Autor: André Dias