Instalação do FRRouting (FRR) – Roteamento dinâmico no seu linux +Bônus iBGP
FRRouting (FRR) é um conjunto de protocolos de roteamento IP para plataformas Linux e Unix que inclui daemons de protocolo para BGP, IS-IS, LDP, OSPF, PIM e RIP.
A integração perfeita do FRR com as pilhas de rede IP Linux/Unix nativas o torna aplicável a uma ampla variedade de casos de uso.
FRR tem suas raízes no projeto Quagga (Fork do Quagga). Na verdade, ele foi iniciado por muitos desenvolvedores de Quagga de longa data que combinaram seus esforços para melhorar a base bem estabelecida do Quagga para criar a melhor pilha de protocolo de roteamento disponível.
Uma ótima apresentação foi feita pelo Junior Corazza. no GTER 46.
BSDRP – Uma opção de softrouter com FRR
Apresentação: ftp://ftp.registro.br/pub/gter/gter46/11-BSDRP.pdf
Requesitos:
Debian 10 Stretch – Instalação Limpa
Debian 11 Bullseye – Instalação Limpa
Antes de começar não esqueça de virar root da forma correta e atualizar os pacotes, e instalar alguns pacotes que serão necessários.
# su - # apt update # apt upgrade # apt install curl apt-transport-https gnupg2 lsb-release tree net-tools
Instalação do Free Range Routing
Pacotes presente do FRR no repositório do Debian 10 estão na versão 6.x.x, e Debian 11 na 7.5.x vou ir além e usar o repositório mais atualizado do FRR disponíveis em https://deb.frrouting.org, mas fica a seu critério se desejar usar o repositório “default”.
Para usar pacotes do repositório FFR faça:
# curl -s https://deb.frrouting.org/frr/keys.asc | apt-key add -
Iremos usar a versão estável oficial mais recente “frr-stable” na variável “FRRVER”, mas é possíveis para também: frr-6 frr-7 frr-8 frr-stable.
# FRRVER="frr-stable" # echo deb https://deb.frrouting.org/frr $(lsb_release -s -c) $FRRVER | tee -a /etc/apt/sources.list.d/frr.list # apt update
Podemos entrar agora em nosso respositório varios pacores FRR:
# apt search frr
frr – FRRouting suite
frr-doc – Manual
frr-rpki-rtrlib – Suporte BGP RPKI
frr-rpki-rtrlib-dbgsym – Debug do pacote frr-rpki-rtrlib
frr-snmp – Suporte SNMP
frr-snmp-dbgsym – Debug do pacote frr-snmp
frr-pythontools – Python tools
Instalarei alguns mas fique a seu critério/necessidade.
# apt install frr frr-doc frr-pythontools frr-rpki-rtrlib frr-snmp
Após instalação o diretorio /etc/ffr/ será criado juntamente com seus arquivos de configuração. Arquitetura do diretório:
# tree /etc/frr/
/etc/frr/ ├── daemons ├── frr.conf ├── support_bundle_commands.conf └── vtysh.conf
Como de costume vamos fazer um backup dos arquivos originais caso cometermos alguma “cagada” 😀
# mkdir /etc/frr/backups # cp /etc/frr/daemons /etc/frr/backups/ # cp /etc/frr/frr.conf /etc/frr/backups/ # cp /etc/frr/vtysh.conf /etc/frr/backups/ # cp /etc/frr/support_bundle_commands.conf /etc/frr/backups/
Antes de mais nada vamos entender um pouco como a aplicação funciona.
No FRR o roteamento é diferente de um roteamento tradicional, ele tem um conjunto de daemons que trabalham juntos para construir a tabela de roteamento.
Cada protocolo principal é implementado em seu próprio daemon, e esses daemons se comunicam com um daemon intermediário (zebra), que é responsável por coordenar as decisões de roteamento.
Esta arquitetura permite alta resiliência, uma vez que um erro, travamento ou exploração em um daemon de protocolo geralmente não afetará os outros. Também é flexível e extensível, uma vez que a modularidade torna mais fácil implementar novos protocolos e vinculá-los ao conjunto. Além disso, cada daemon implementa um sistema de plug-in permitindo que novas funcionalidades sejam carregadas em tempo de execução.
Ilustração da arquitetura em grande escala:
+----+ +----+ +-----+ +----+ +----+ +----+ +-----+ |bgpd| |ripd| |ospfd| |ldpd| |pbrd| |pimd| |.....| +----+ +----+ +-----+ +----+ +----+ +----+ +-----+ | | | | | | | +----v-------v--------v-------v-------v-------v--------v | | | Zebra | | | +------------------------------------------------------+ | | | | | | +------v------+ +---------v--------+ +------v------+ | | | | | | | *NIX Kernel | | Remote dataplane | | ........... | | | | | | | +-------------+ +------------------+ +-------------+
Todos os daemons FRR podem ser gerenciados por meio de um único shell de interface de usuário integrado chamado vtysh. O vtysh se conecta a cada daemon através de um soquete de domínio UNIX e então funciona como um proxy para a entrada do usuário. Além de um front-end unificado, o vtysh também oferece a capacidade de configurar todos os daemons usando um único arquivo de configuração por meio do modo de configuração integrado. Isso evita a sobrecarga de manter um arquivo de configuração separado para cada daemon.
Você encontra mais informações em: http://docs.frrouting.org/en/latest/overview.html
Módulos do kernel
Na documentação oficial de instalação é recomendado fazer alguns ajustes nas configurações de sysctl do Linux, caso para sua realidade não seja necessário pule esta parte.
Os itens a seguir são definidos para habilitar o encaminhamento de IP no kernel:
Encaminhamento IPv4 e IPv6
# vim /etc/sysctl.conf
Descomente:
net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1
Encaminhamento MPLS (Ative se achar necessário)
O suporte MPLS básico foi introduzido no kernel na versão 4.1 e recursos adicionais foram introduzidos na 4.3 e 4.5.
# vim /etc/modules-load.d/modules.conf
Adicione
# Load MPLS Kernel Modules mpls_router mpls_iptunnel
Veja quais o(s) nome(s) de sua(s) interface(s) e adicione:
# ip -br link |grep -v lo |awk '{print $1}' # vim /etc/sysctl.conf
Adicione ao final do arquivo (Anteção para o nome das interfaces: net.mpls.conf.[INTERFACE].input)
# Habilite o processamento de rótulo MPLS em todas as interfaces net.mpls.conf.enp0s3.input=1 net.mpls.platform_labels=100000
Encaminhamento VRF (Ative se achar necessário)
O seguinte impacta como os soquetes BGP TCP são gerenciados em VRFs:
net.ipv4.tcp_l3mdev_accept=0
Com essa configuração, um soquete BGP TCP é aberto por VRF. Essa configuração garante que outros serviços TCP, como SSH, fornecidos para fins não VRF, sejam bloqueados nas interfaces Linux associadas a VRF.
net.ipv4.tcp_l3mdev_accept=1
Reinicie seu servidor para carregar as novas configurações de kernel.
# reboot
Acesse novamente seu servidor, não esqueça de virar root com o comando “su -”
Após instalado o FRR não fará nada. Isso ocorre porque os daemons devem ser ativados e até o momento não temos nenhum, para ativar edite o arquivo /etc/frr/daemons e determine quais daemons serão ativados colocando um yes no daemon desejado. No meu exemplo vou ativar o bgpd qual deixarei uma “brincadeira” de exemplo ao final.
# vim /etc/frr/daemons
# Para habilitar um daemon específico, simplesmente altere o 'no' correspondente para 'yes', e será necessário reiniciar o serviço. bgpd=yes # BGP ospfd=no # OSPFD (OSPFv2 - IPv4) ospf6d=no # OSPF6D (OSPFv3 - IPv6) ripd=no # RIPD (RIPv2 - IPv4) ripngd=no # RIPNGD (RIPv3 - IPv6) isisd=no # ISISD (IS-IS - Protocolo igp Cisco) pimd=no # PIMD (PIM - Roteamento Multicast) ldpd=no # LDPD (LDP - Labels MPLS para rotas igp) nhrpd=no # NHRPD (NHRP - roteamento entre tuneis) eigrpd=no # EIGRPD (EIGRP - protocolo igp Cisco) babeld=no # BABELD (BABEL - protocolo igp dual-stack) sharpd=no # SHARPD (SHARP - protocolo exemplo zclient) pbrd=no # PBRD (PBR - gestao de regras para Police Based Routing) bfdd=no # BFDD (BFD - protocolo de adjacencia instantanea) fabricd=no # FABRICD (OpenFabric) vrrpd=no # VRRPD (Virtual Router Redundancy Protocol Deamon) # Como o nome diz, isso faz com que o VTYSH aplique a configuração ao iniciar aos daemons. vtysh_enable=yes # O próximo conjunto de linhas controla quais opções são passadas aos daemons quando iniciados. zebra_options=" -A 127.0.0.1 -s 90000000" bgpd_options=" -A 127.0.0.1" ospfd_options=" -A 127.0.0.1" ospf6d_options=" -A ::1" ripd_options=" -A 127.0.0.1" ripngd_options=" -A ::1" isisd_options=" -A 127.0.0.1" pimd_options=" -A 127.0.0.1" ldpd_options=" -A 127.0.0.1" nhrpd_options=" -A 127.0.0.1" eigrpd_options=" -A 127.0.0.1" babeld_options=" -A 127.0.0.1" sharpd_options=" -A 127.0.0.1" pbrd_options=" -A 127.0.0.1" staticd_options="-A 127.0.0.1" bfdd_options=" -A 127.0.0.1" fabricd_options="-A 127.0.0.1" vrrpd_options=" -A 127.0.0.1"
Como este tutorial é um laboratório irei ativar os daemons OSPFv2, OSPFv3, BABEL e BGP, (em produção ative somente o necessário) pois em seguida teremos alguns exemplos contribuídos pelo Patrick Brandão.
Alterações feitas no /etc/frr/daemons vamos reiniciar o FRR
# systemctl restart frr
Verifique se o mesmo está ok
# systemctl status frr
● frr.service - FRRouting Loaded: loaded (/lib/systemd/system/frr.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2020-08-11 14:00:29 -03; 41s ago Docs: https://frrouting.readthedocs.io/en/latest/setup.html Process: 665 ExecStart=/usr/lib/frr/frrinit.sh start (code=exited, status=0/SUCCESS) Status: "FRR Operational" Tasks: 18 (limit: 1150) Memory: 24.2M CGroup: /system.slice/frr.service ├─674 /usr/lib/frr/watchfrr -d -F traditional zebra bgpd ospfd ospf6d babeld staticd ├─699 /usr/lib/frr/zebra -d -F traditional -A 127.0.0.1 -s 90000000 ├─704 /usr/lib/frr/bgpd -d -F traditional -A 127.0.0.1 ├─712 /usr/lib/frr/ospfd -d -F traditional -A 127.0.0.1 ├─716 /usr/lib/frr/ospf6d -d -F traditional -A ::1 ├─720 /usr/lib/frr/babeld -d -F traditional -A 127.0.0.1 └─724 /usr/lib/frr/staticd -d -F traditional -A 127.0.0.1 ago 11 14:00:29 frr zebra[699]: client 47 says hello and bids fair to announce only static routes vrf=0 set 23 15:44:11 accel watchfrr[1220]: zebra state -> up : connect succeeded set 23 15:44:11 accel watchfrr[1220]: bgpd state -> up : connect succeeded set 23 15:44:11 accel watchfrr[1220]: ospfd state -> up : connect succeeded set 23 15:44:11 accel watchfrr[1220]: ospf6d state -> up : connect succeeded set 23 15:44:11 accel watchfrr[1220]: staticd state -> up : connect succeeded set 23 15:44:11 accel watchfrr[1220]: all daemons up, doing startup-complete notify ago 11 14:00:29 frr frrinit.sh[665]: Started watchfrr. ago 11 14:00:29 frr systemd[1]: Started FRRouting.
Pode também conferir se o serviço de cada daemons ativos foi iniciado:
# netstat -putan
Proto Recv-Q Send-Q Endereço Local Endereço Remoto Estado PID/Program name tcp 0 0 127.0.0.1:2601 0.0.0.0:* OUÇA 699/zebra tcp 0 0 127.0.0.1:2604 0.0.0.0:* OUÇA 712/ospfd tcp 0 0 127.0.0.1:2605 0.0.0.0:* OUÇA 704/bgpd tcp 0 0 127.0.0.1:2616 0.0.0.0:* OUÇA 724/staticd tcp6 0 0 ::1:2606 :::* OUÇA 716/ospf6d
Lista completa das portas:
zebrasrv 2600/tcp # zebra service zebra 2601/tcp # zebra vty ripd 2602/tcp # RIPd vty ripngd 2603/tcp # RIPngd vty ospfd 2604/tcp # OSPFd vty bgpd 2605/tcp # BGPd vty ospf6d 2606/tcp # OSPF6d vty ospfapi 2607/tcp # ospfapi isisd 2608/tcp # ISISd vty babeld 2609/tcp # BABELd vty nhrpd 2610/tcp # nhrpd vty pimd 2611/tcp # PIMd vty ldpd 2612/tcp # LDPd vty eigprd 2613/tcp # EIGRPd vty bfdd 2617/tcp # bfdd vty fabricd 2618/tcp # fabricd vty vrrpd 2619/tcp # vrrpd vty
Entrado no Shell VTY
Vtysh fornece um frontend combinado para todos os daemons FRR em uma única sessão combinada.
# vtysh
Hello, this is FRRouting (version 7.3.1). Copyright 1996-2005 Kunihiro Ishiguro, et al. frr# show running-config Building configuration... Current configuration: ! frr version 7.3.1 frr defaults traditional hostname frr log syslog informational service integrated-vtysh-config ! line vty ! end frr# exit
vtysh tem um arquivo de configuração /etc/frr/vtysh.conf que contém opções que controlam o comportamento da autenticação. Este arquivo também não será escrito por comandos de salvamento de configuração, ele deve ser atualizado manualmente.
Isso também significa que os comandos hostname e (que têm efeito para vtysh) precisam ser atualizados manualmente no vtysh.conf
Todas as configurações salvas (write) no terminal do vtysh são escritas no arquivo frr.conf.
A documentação também ressalta que é possível salvar os arquivos separados por daemons, para alterar esse comportamento é precisamos editar o /etc/frr/vtysh.conf (Fica a seu critério também, eu particularmente não altero)
# vim /etc/frr/vtysh.conf
Estão o que isso faz?
service integrated-vtysh-config
– O vtysh sempre salvará no frr.conf.
no service integrated-vtysh-config
– vtysh nunca vai salvar no frr.conf, em vez disso, ele pedirá aos daemons que escrevam/crie seus arquivos de configuração individuais.
Se fizer a altração reinicie a aplicação
# systemctl restart frr
Mais sobre vtysh: http://docs.frrouting.org/en/latest/vtysh.html
Acessamos o terminal do vtysh e usamos o comando write (salvar).
# vtysh
Hello, this is FRRouting (version 7.3.1). Copyright 1996-2005 Kunihiro Ishiguro, et al. frr# write Note: this version of vtysh never writes vtysh.conf Building Configuration... Warning: /etc/frr/frr.conf.sav unlink failed Building Configuration... Integrated configuration saved to /etc/frr/frr.conf [OK] frr# exit
Na próxima vez que salvar (write) um “____.conf.sav” será criado também preservando a configuração posterior.
Você também pode acessar o terminal vtysh (zebra) por telnet, lembra que vimos as porta que cada serviço estava rodando, logo o zebra roda na porta 2601(tcp), porém responde apenas localmente (localhost/127.0.0.1) caso você deseje abrir esse acesso externamente (restringi-lo por firewall o acesso a determinados IPs é uma boa prática) faça e alteração no arquivo daemons.
# vim /etc/frr/daemons
Encontre:
zebra_options=" -A 127.0.0.1 -s 90000000"
E altere por:
zebra_options=" -A 0.0.0.0 -s 90000000"
Se você desejar alterar esta porta basta incluir “-P porta”
zebra_options=" -A 0.0.0.0 -s 90000000 -P 40023"
Salve e reinicie o FRR
# systemctl restart frr
Porém se você tentar acessar mesmo que localmente não será possível, pois uma senha não foi definida.
# telnet localhost 40023 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Vty password is not set. Connection closed by foreign host.
Para configura as senha de login e de enable:
# vtysh
# configure terminal # password senha_de_login # enable password senha_para_enable # service password-encryption # line vty # login # end # write # exit
Ex.:
frr# configure terminal frr(config)# password remontti frr(config)# enable password remontti frr(config)# service password-encryption frr(config)# line vty frr(config-line)# login frr(config-line)# end frr# write Note: this version of vtysh never writes vtysh.conf Note: this version of vtysh never writes vtysh.conf Building Configuration... Integrated configuration saved to /etc/frr/frr.conf [OK] frr# exit
Faça um teste localmente ou externamente caso tenha liberado o acesso:
# telnet localhost 40023
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hello, this is FRRouting (version 7.3.1). Copyright 1996-2005 Kunihiro Ishiguro, et al. User Access Verification Password: frr> enable Password: frr# exit
Por mais inseguro que seja o uso do telnet, em alguns casos é comum o acesso de servidores Looking Glass publicamente. Para tornar o acesso telnet público (não vai exigir senha) apenas leitura, basta remove a senha. (Ainda assim é possível ter poderes com em enable+senha)
Removendo senha:
# configure terminal # no password # line vty # no login # end # write # exit
Hello, this is FRRouting (version 7.3.1). Copyright 1996-2005 Kunihiro Ishiguro, et al. frr# configure terminal frr(config)# no password Please be aware that removing the password is a security risk and you should think twice about this command. frr(config)# line vty frr(config-line)# no login frr(config-line)# end frr# write Note: this version of vtysh never writes vtysh.conf Building Configuration... Building Configuration... Integrated configuration saved to /etc/frr/frr.conf [OK] frr# exit
Zerando as configurações
Caso você queira começar tudo do zero, basta remover todos os .conf e copiar os arquivos originais que estão na pasta backup, e dar suas devidas permissões!
Ex.:
# rm /etc/frr/*.conf # rm /etc/frr/*.sav # rm /etc/frr/daemons # cp /etc/frr/backups/* /etc/frr/ # chown frr. /etc/frr/ -R
Modelos de configurações:
Alguns exemplos de configurações para os daemons podem ser encontrados em:
# tree /usr/share/doc/frr/examples/ ├── babeld.conf.sample ├── bfdd.conf.sample ├── bgpd.conf.sample ├── bgpd.conf.sample2 ├── bgpd.conf.vnc.sample ├── eigrpd.conf.sample ├── isisd.conf.sample ├── ldpd.conf.sample ├── ospf6d.conf.sample ├── ospfd.conf.sample ├── pbrd.conf.sample ├── pimd.conf.sample ├── ripd.conf.sample ├── ripngd.conf.sample ├── staticd.conf.sample ├── vtysh.conf.sample └── zebra.conf.sample
Em http://docs.frrouting.org/en/latest/ você encontra uma ampla documentação com muitos exemplos.
Bônus iBGP
Vou deixar aqui um modelo simples iBGP entre um servidor Linux vs Mikrotik.
Exemplo para iBGP para um DNS Anycast distribuído, usando os IPs do DNS Google, mas não estou incentivando a fazer isso é apenas um exemplo!
Configuração Linux DNS
# vtysh
Nesta configuração vamos adicionar os IPs de loopbacks em seguida fechar os peers IPv4 e IPv6, e finalizando configurando os filtros para receber rota default (Logo no RouterOS será necessário envia) e ensinar apenas as IPs de lo. Este é apenas um exemplo para você começar a brincar e estudar mais sobre o assunto.
configure terminal ! interface lo ip address 8.8.8.8/32 ipv6 address 2001:4860:4860::8888/128 ! router bgp 65530 bgp router-id 10.1.0.2 neighbor 10.1.0.1 remote-as 65530 neighbor 10.1.0.1 description "iBGP_DNS_IPv4" neighbor 2001:db8:1::1 remote-as 65530 neighbor 2001:db8:1::1 description "iBGP_DNS_IPv6" ! address-family ipv4 unicast redistribute kernel redistribute connected redistribute static neighbor 10.1.0.1 prefix-list RR-IPV4-IN in neighbor 10.1.0.1 prefix-list RR-IPV4-OUT out exit-address-family ! address-family ipv6 unicast redistribute kernel redistribute connected redistribute static neighbor 2001:db8:1::1 activate neighbor 2001:db8:1::1 prefix-list RR-IPV6-IN in neighbor 2001:db8:1::1 prefix-list RR-IPV6-OUT out exit-address-family ! ip prefix-list RR-IPV4-IN seq 5 permit 0.0.0.0/0 ip prefix-list RR-IPV4-OUT seq 5 permit 8.8.8.8/32 ! ipv6 prefix-list RR-IPV6-IN seq 5 permit ::/0 ipv6 prefix-list RR-IPV6-OUT seq 5 permit 2001:4860:4860::8888/128 ! line vty ! end write
Configuração no Mikrotik/RouterOS (Gateway DNS)
/routing bgp instance add client-to-client-reflection=no name=iBGP-DNS router-id=10.1.0.1 /routing bgp peer add default-originate=always instance=iBGP-DNS name=DNS-FRR-IPv4 remote-address=10.1.0.2 remote-as=65530 add default-originate=always instance=iBGP-DNS name=DNS-FRR-IPv6 remote-address=2001:db8:1::2 remote-as=65530 address-families=ipv6
Configuração Linux Accel-PPP
# vtysh
Nesta configuração vamos fechar os peers IPv4 e IPv6, e configurar os filtros para receber rota default (Logo no RouterOS será necessário envia) e ensinar apenas as IPs possíveis ips dinâmicos desta rede (45.0.0.0/22, 100.64.0.0/10). Lembrando que este é apenas um exemplo simples para você começar a brincar e estudar mais sobre o assunto.
configure terminal ! router bgp 65530 bgp router-id 10.1.0.2 neighbor 10.2.0.1 remote-as 65530 neighbor 10.2.0.1 description "iBGP_ACCEL_IPv4" neighbor 2001:db8:2::1 remote-as 65530 neighbor 2001:db8:2::1 description "iBGP_ACCEL_IPv6" ! address-family ipv4 unicast redistribute kernel redistribute connected redistribute static neighbor 10.2.0.1 prefix-list FILTRO-RR-IPV4-IN in neighbor 10.2.0.1 prefix-list FILTRO-RR-IPV4-OUT out exit-address-family ! address-family ipv6 unicast redistribute kernel redistribute connected redistribute static neighbor 2001:db8:2::1 activate neighbor 2001:db8:2::1 prefix-list FILTRO-RR-IPV6-IN in neighbor 2001:db8:2::1 prefix-list FILTRO-RR-IPV6-OUT out exit-address-family ! ip prefix-list FILTRO-RR-IPV4-IN seq 5 permit 0.0.0.0/0 ip prefix-list FILTRO-RR-IPV4-OUT seq 5 permit 100.64.0.0/10 le 32 ip prefix-list FILTRO-RR-IPV4-OUT seq 10 permit 45.0.0.0/22 le 32 ip prefix-list FILTRO-RR-IPV4-OUT seq 15 permit 10.0.0.0/8 le 32 ! ipv6 prefix-list FILTRO-RR-IPV6-IN seq 5 permit ::/0 ipv6 prefix-list FILTRO-RR-IPV6-OUT seq 10 permit 2001:db8::/32 le 128 ! line vty ! end write
Configuração no Mikrotik/RouterOS (Gateway Accel-PPP)
/routing bgp instance add client-to-client-reflection=no name=iBGP-Accel router-id=10.2.0.2 /routing bgp peer add default-originate=always instance=iBGP-Accel name=DNS-FRR-IPv4 remote-address=10.2.0.2 remote-as=65530 add default-originate=always instance=iBGP-Accel name=DNS-FRR-IPv6 remote-address=2001:db8:2::2 remote-as=65530 address-families=ipv6
Espero que tenha lhe instigado a buscar mais sobre o FRR.
Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!
Participe do canal no telegram para ficar atualizado sempre que publicar um novo tutorial.
Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.
Deixo aqui agradecimento ao Patrick Brandão que está elaborando um belo tutorial com muitos exemplos.