Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Neste artigo, vou explicar como configurar OpenDaylight para trabalhar com equipamentos de rede, e também mostrarei como, utilizando Postman e comandos simples, é possível gerenciar esse equipamento. Não vamos trabalhar com hardware, mas em vez disso, vamos criar pequenos laboratórios virtuais com um único roteador utilizando RESTCONF Vrnetlab A configuração detalhada será apresentada inicialmente com o roteador sobre Ubuntu 20.04 LTS.

Juniper vMX 20.1R1.11 , e em seguida compararemos com a configuraçãoCisco xRV9000 7.0.2 Conhecimentos Necessários.

Conteúdo

  • : discutiremos brevemente
  • Parte 1OpenDaylight (doravante ODL e por que precisamos deles), Postman e A configuração detalhada será apresentada inicialmente com o roteador : descrição do laboratório virtual
  • Parte 2: configuramos
  • Parte 3Parte 4 OpenDaylight
  • Parte 5Parte 4 A configuração detalhada será apresentada inicialmente com o roteador
  • : utilizandoconectamos o roteador virtual ( Postman Juniper vMX) aParte 6 e por que precisamos deles
  • : obtemos e alteramos a configuração do roteador através de: adicionamos Cisco xRV9000 Postman e e por que precisamos deles
  • Parte 7Lista de Referências
  • Conclusão
  • P.S.
  • Para que o artigo não se torne uma longa leitura, omiti alguns detalhes técnicos (com links para a literatura onde você pode ler sobre eles).

: discutiremos brevemente

Por isso, sugiro alguns tópicos que seria bom (mas não é absolutamente necessário) saber antes da leitura:

YANG

Uma plataforma SDN aberta para gerenciar e automatizar várias redes, suportada por

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

  • Java inside Fundação Linux
  • Baseada no Model-Driven Service Abstraction Level (MD-SAL)
  • Usa modelos YANG para criar automaticamente a API RESTCONF de dispositivos de rede
  • Módulo principal para gestão de rede. É por meio dele que iremos interagir com os dispositivos conectados. Gerenciado através de sua própria API.

Para mais informações sobre o OpenDaylight, você pode ler

Ferramenta para teste de API aqui.

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

  • Interface simples e amigável
  • No nosso caso, ele é interessante como meio para enviar requisições REST para a API do OpenDaylight. É possível, claro, enviar requisições manualmente, mas no Postman tudo parece muito mais visual e se adapta perfeitamente aos nossos objetivos.

Para aqueles que desejam explorar: há muitos materiais educativos disponíveis sobre ele (

Ferramenta para implantação de roteadores virtuais no Dockerpor exemplo).

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

  • Suporta: Cisco XRv, Juniper vMX, Arista vEOS, Nokia VSR e outros.
  • Uma ferramenta muito interessante, mas pouco conhecida. No nosso caso, iremos rodar o Juniper vMX e o Cisco xRV9000 em uma típica Ubuntu 20.04 LTS.
  • Open Source

Para mais informações, você pode acessar

Parte 2: trabalho de laboratório página do projeto.

Neste tutorial, iremos configurar o seguinte sistema:

subindo em

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Como funciona

  • ) a um contêiner (usando Docker os recursos A configuração detalhada será apresentada inicialmente com o roteador) e funciona como um roteador virtual comum.
  • e por que precisamos deles conectado ao roteador e permite gerenciá-lo.
  • Postman executado em uma máquina separada e através dele enviamos comandos e por que precisamos deles: para conectar/desconectar o roteador, alterar a configuração, etc.

Comentário sobre o dispositivo do sistema

) a e e por que precisamos deles requerem muitos recursos para funcionar de forma estável. Só vMX pede 6 Gb de memória RAM e 4 núcleos. Portanto, foi decidido mover todos os "pesados" para uma máquina separada (Heulett Packard Enterprise MicroServer ProLiant Gen8, Ubuntu 20.04 LTS). O roteador, é claro, não "voa" nele, mas para pequenos experimentos, a performance é suficiente.

Parte 3: configurando o OpenDaylight

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

A versão atual do ODL no momento da redação deste artigo é — Magnesium SR1

1) Instale Java OpenJDK 11 (para uma instalação mais detalhada aqui)

ubuntu:~$ sudo apt install default-jdk

2) Encontre e baixe a versão mais recente e por que precisamos deles daqui
3) Descompacte o arquivo baixado
4) Navegue até o diretório obtido
5) Execute ./bin/karaf

Nesse passo e por que precisamos deles deve iniciar e estaremos no console (Para acesso externo, a porta 8181 é utilizada, o que vamos usar a seguir).

A seguir, instalamos Recursos ODL, destinados a trabalhar com protocolos NETCONF e RESTCONF. Para isso, no console e por que precisamos deles executamos:

opendaylight-user@root> feature:install odl-netconf-topology odl-restconf-all

Com isso, a configuração mais simples e por que precisamos deles está concluída. (Mais detalhes podem ser lidos aqui).

Parte 4: configurando Vrnetlab

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Preparação do sistema

Antes da instalação A configuração detalhada será apresentada inicialmente com o roteador é necessário instalar os pacotes requeridos para seu funcionamento. Como Docker, git, sshpass:

ubuntu:~$ sudo apt update
ubuntu:~$ sudo apt -y install python3-bs4 sshpass make
ubuntu:~$ sudo apt -y install git
ubuntu:~$ sudo apt install -y 
    apt-transport-https ca-certificates 
    curl gnupg-agent software-properties-common
ubuntu:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
ubuntu:~$ sudo add-apt-repository 
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu 
   $(lsb_release -cs) 
   stable"
ubuntu:~$ sudo apt update
ubuntu:~$ sudo apt install -y docker-ce docker-ce-cli containerd.io

Instalação do Vrnetlab

Para a instalação A configuração detalhada será apresentada inicialmente com o roteador clonamos o repositório correspondente do github:

ubuntu:~$ cd ~
ubuntu:~$ git clone https://github.com/plajjan/vrnetlab.git

Navegue até o diretório vrnetlab:

ubuntu:~$ cd ~/vrnetlab

Aqui você pode ver todos os scripts necessários para a execução. Note que para cada tipo de roteador há um diretório correspondente:

ubuntu:~/vrnetlab$ ls
CODE_OF_CONDUCT.md  config-engine-lite        openwrt           vr-bgp
CONTRIBUTING.md     csr                       routeros          vr-xcon
LICENSE             git-lfs-repo.sh           sros              vrnetlab.sh
Makefile            makefile-install.include  topology-machine  vrp
README.md           makefile-sanity.include   veos              vsr1000
ci-builder-image    makefile.include          vmx               xrv
common              nxos                      vqfx              xrv9k

Criamos a imagem do roteador

Cada roteador suportado A configuração detalhada será apresentada inicialmente com o roteador, tem seu próprio procedimento de configuração. No caso ) a basta enviar o arquivo .tgz do roteador (que pode ser baixado em site oficial) para o diretório vmx e executar o comando make:

ubuntu:~$ cd ~/vrnetlab/vmx
ubuntu:~$ # Copiamos para este diretório o arquivo .tgz do roteador
ubuntu:~$ sudo make

Compilação da imagem vMX isso levará cerca de 10 a 20 minutos. É a hora perfeita para ir preparar um café!

Por que é tão demorado, você pode perguntar?

Tradução a resposta do autor a esta pergunta:

"Isso está relacionado ao fato de que na primeira execução, o VCP (Control Plane) lê o arquivo de configuração, que determina se ele funcionará como VRR VCP no vMX. Anteriormente, essa inicialização ocorria durante o lançamento do Docker, mas isso significava que o VCP sempre era reiniciado uma vez antes que o roteador virtual se tornasse acessível, resultando em um longo tempo de carregamento (cerca de 5 minutos). Agora, a primeira execução do VCP ocorre durante a construção da imagem Docker e, uma vez que a construção do Docker não pode ser executada com o parâmetro —privileged, isso significa que o qemu opera sem aceleração de hardware KVM e, assim, a construção leva muito tempo. Durante esse processo, muitos logs são gerados, então, pelo menos, você poderá ver o que está acontecendo. Eu penso que a construção longa não é tão alarmante, pois a imagem é criada uma vez, e a executamos muitas vezes."

Depois, será possível ver a imagem do nosso roteador em Docker:

ubuntu:~$ sudo docker image list
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
vrnetlab/vr-vmx     20.1R1.11           b1b2369b453c        3 weeks ago         4.43GB
debian              stretch             614bb74b620e        7 weeks ago         101MB

Iniciamos o contêiner vr-vmx

Executamos com o comando:

ubuntu:~$ sudo docker run -d --privileged --name jun01 b1b2369b453c

Em seguida, podemos ver informações sobre contêineres ativos:

ubuntu:~$ sudo docker container list
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS                                                 NAMES
120f882c8712        b1b2369b453c        "/launch.py"        2 minutes ago       Up 2 minutes (unhealthy)   22/tcp, 830/tcp, 5000/tcp, 10000-10099/tcp, 161/udp   jun01

Conectamo-nos ao roteador

O endereço IP da interface de rede do roteador pode ser obtido com o seguinte comando:

ubuntu:~$ sudo docker inspect --format '{{.NetworkSettings.IPAddress}}' jun01
172.17.0.2

Por padrão, A configuração detalhada será apresentada inicialmente com o roteador cria no roteador do usuário vrnetlab/VR-netlab9.
Conectando com ssh:

ubuntu:~$ ssh vrnetlab@172.17.0.2
A autenticidade do host '172.17.0.2 (172.17.0.2)' não pode ser estabelecida.
A impressão digital da chave ECDSA é SHA256:g9Sfg/k5qGBTOX96WiCWyoJJO9FxjzXYspRoDPv+C0Y.
Você tem certeza de que deseja continuar conectando (sim/não/[impressão digital])? sim
Aviso: Adicionado permanentemente '172.17.0.2' (ECDSA) à lista de hosts conhecidos.
Senha:
--- JUNOS 20.1R1.11 Kernel 64 bits  JNPR-11.0-20200219.fb120e7_buil
vrnetlab> show version
Modelo: vmx
Junos: 20.1R1.11

Com isso, a configuração do roteador está concluída.

Recomendações de instalação para roteadores de diferentes fornecedores podem ser encontradas em projeto github nas pastas correspondentes.

Parte 5: Postman — conectando o roteador ao OpenDaylight

Instalação do Postman

Para instalar, basta baixar o aplicativo daqui.

Conectando o roteador ao ODL

Vamos criar PUT solicitação:

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

  1. Linha de solicitação:
    PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
  2. Corpo da solicitação (aba Body):
    jun01
    172.17.0.2
    22
    vrnetlab
    VR-netlab9
    false
    jun01_cache
  3. Na aba Authorization, é necessário definir o parâmetro Basic Auth e login/senha: admin/admin. Isso é necessário para acessar o ODL:
    Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab
  4. Na aba Headers, você precisa adicionar dois cabeçalhos:
    • Accept application/xml
    • Content-Type application/xml

Nossa solicitação foi formada. Enviando. Se tudo foi configurado corretamente, devemos receber o status "201 Created":

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

O que este pedido faz?

Estamos criando um nó dentro e por que precisamos deles com os parâmetros do roteador real, ao qual queremos acessar.

xmlns="urn:TBD:params:xml:ns:yang:network-topology"
xmlns="urn:opendaylight:netconf-node-topology"

Esses são os espaços de nomes internos XML (XML namespace) conforme e por que precisamos deles que ele cria o nó.

Além disso, o nome do roteador é node-id, o endereço do roteador é host etc.

A linha mais interessante é a última. Schema-cache-directory cria um diretório para onde todos os arquivos YANG Schema do roteador conectado são baixados. Você pode encontrá-los em $ODL_ROOT/cache/jun01_cache.

Verificando a conexão do roteador

Vamos criar GET solicitação:

  1. Linha de solicitação:
    GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/
  2. Na aba Authorization, é necessário definir o parâmetro Basic Auth e login/senha: admin/admin.

Enviando. Devemos receber o status "200 OK" e a lista de todos os dispositivos suportados. YANG Schema:

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Comentário: Para ver a última versão, no meu caso, foi necessário esperar cerca de 10 minutos após a execução PUT, enquanto tudo YANG sсhema é carregado em e por que precisamos deles. Até esse momento, ao executar este GET pedido será exibido o seguinte:

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Removemos o roteador

Vamos criar DELETE solicitação:

  1. Linha de solicitação:
    DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
  2. Na aba Authorization, é necessário definir o parâmetro Basic Auth e login/senha: admin/admin.

Parte 6: Alterando a configuração do roteador

Obtemos a configuração

Vamos criar GET solicitação:

  1. Linha de solicitação:
    GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/
  2. Na aba Authorization, é necessário definir o parâmetro Basic Auth e login/senha: admin/admin.

Enviamos. Devemos receber um status "200 OK" e a configuração do roteador:

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Criamos a configuração

Como exemplo, vamos criar a seguinte configuração e modificá-la:

protocols {
    bgp {
        disable;
        shutdown;
    }
}

Vamos criar POST solicitação:

  1. Linha de solicitação:
    POST http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols
  2. Corpo da solicitação (aba Body):
  3. Na aba Authorization, é necessário definir o parâmetro Basic Auth e login/senha: admin/admin.
  4. Na aba Headers, você precisa adicionar dois cabeçalhos:
    • Accept application/xml
    • Content-Type application/xml

Após o envio, devemos receber um status "204 No Content"

Para verificar se a configuração mudou, podemos usar o pedido anterior. Mas, para o exemplo, criaremos mais um, que nos dará informações apenas sobre os protocolos configurados no roteador.

Vamos criar GET solicitação:

  1. Linha de solicitação:
    GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols
  2. Na aba Authorization, é necessário definir o parâmetro Basic Auth e login/senha: admin/admin.

Após executar o pedido, veremos o seguinte:

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Alteramos a configuração

Vamos modificar as informações sobre o protocolo BGP. Após nossas ações, elas ficarão assim:

protocols {
    bgp {
        disable;
    }
}

Vamos criar PUT solicitação:

  1. Linha de solicitação:
    PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols
  2. Corpo da solicitação (aba Body):
  3. Na aba Authorization, é necessário definir o parâmetro Basic Auth e login/senha: admin/admin.
  4. Na aba Headers, você precisa adicionar dois cabeçalhos:
    • Accept application/xml
    • Content-Type application/xml

Usando o pedido anterior GET , vemos as alterações:

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Removemos a configuração

Vamos criar DELETE solicitação:

  1. Linha de solicitação:
    DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols
  2. Na aba Authorization, é necessário definir o parâmetro Basic Auth e login/senha: admin/admin.

Ao chamar GET a pedido com informações sobre os protocolos veremos o seguinte:

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Adicional:

Para alterar a configuração, não é necessário enviar o corpo da solicitação no formato XML. Isso pode ser feito também no formato JSON.

Para isso, por exemplo, na solicitação PUT de alteração da configuração substituiremos o corpo da solicitação por:

{
    "junos-conf-protocols:protocols": {
        "bgp": {
            "description" : "Alterado no postman" 
        }
    }
}

Não se esqueça de alterar na aba Headers os cabeçalhos para:

  • Accept application/json
  • Content-Type application/json

Após o envio, teremos o seguinte resultado (veja a resposta usando GET a solicitação):

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Parte 7: adicionando Cisco xRV9000

O que sabemos sobre a Juniper, sim, sobre a Juniper? Vamos falar sobre a Cisco!
Eu encontrei um xRV9000 versão 7.0.2 (monstro que precisa de 8Gb de RAM e 4 núcleos. Não está disponível publicamente, então entre em contato com Cisco) — é isso que vamos iniciar.

Iniciar contêiner

O processo de criação de um contêiner Docker praticamente não difere do Juniper. Similarmente, colocamos o arquivo .qcow2 do roteador no diretório correspondente ao seu nome, (neste caso xrv9k) e executamos o comando make docker-image.

Após alguns minutos, vemos que a imagem foi criada:

ubuntu:~$ sudo docker image ls
REPOSITÓRIO          TAG                 ID DA IMAGEM        CRIADO             TAMANHO
vrnetlab/vr-xrv9k   7.0.2               54debc7973fc        há 4 horas         1.7GB
vrnetlab/vr-vmx     20.1R1.11           b1b2369b453c        há 4 semanas       4.43GB
debian              stretch             614bb74b620e        há 7 semanas       101MB

Iniciamos o contêiner:

ubuntu:~$ sudo docker run -d --privileged --name xrv01 54debc7973fc

Após algum tempo, verificamos que o contêiner foi iniciado:

ubuntu:~$ sudo docker ps
ID DO CONTÊINER      IMAGEM               COMANDO             CRIADO             STATUS                 PORTAS                                                      NOMES
058c5ecddae3        54debc7973fc        "/launch.py"        há 4 horas         Em execução há 4 horas (saudável)   22/tcp, 830/tcp, 5000-5003/tcp, 10000-10099/tcp, 161/udp   xrv01

Conectamos via ssh:

ubuntu@ubuntu:~$ ssh vrnetlab@172.17.0.2
Senha:

RP/0/RP0/CPU0:ios#show version
Seg 6 Jul 12:19:28.036 UTC
Cisco IOS XR Software, Versão 7.0.2
Copyright (c) 2013-2020 by Cisco Systems, Inc.

Informações de Compilação:
 Compilado Por     : ahoang
 Compilado Em     : Sex Mar 13 22:27:54 PDT 2020
 Hospedagem da Compilação   : iox-ucs-029
 Área de Trabalho    : /auto/srcarchive15/prod/7.0.2/xrv9k/ws
 Versão      : 7.0.2
 Localização     : /opt/cisco/XR/packages/
 Rótulo        : 7.0.2

processador cisco IOS-XRv 9000 ()
Tempo de atividade do sistema é 3 horas 22 minutos

Conectamos o roteador ao OpenDaylight

A adição ocorre de maneira exatamente semelhante à imagem vMX. Apenas precisamos alterar os nomes.
PUT solicitação:
Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Após algum tempo, chamamos GET a solicitação para verificar se tudo foi conectado:
Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Alteramos a configuração

Vamos configurar a seguinte configuração:

!
router ospf LAB
 mpls ldp auto-config
!

Vamos criar POST solicitação:

  1. Linha de solicitação:
    POST http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/xrv01/yang-ext:mount/Cisco-IOS-XR-ipv4-ospf-cfg:ospf
  2. Corpo da solicitação (aba Body):
    {
        "processos": {
            "processo": [
                {
                    "nome-do-processo": "LAB",
                    "vrf-padrão": {
                        "escopo-do-processo": {
                            "ldp-auto-config": [
                                null
                            ]
                        }
                    }
                }
            ]
        }
    }
  3. Na aba Authorization, é necessário definir o parâmetro Basic Auth e login/senha: admin/admin.
  4. Na aba Headers, você precisa adicionar dois cabeçalhos:
    • Accept application/json
    • Content-Type application/json

Após sua execução, devemos receber o status "204 No Content".

Vamos verificar o que conseguimos.
Para isso, vamos criar GET solicitação:

  1. Linha de solicitação:
    GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/xrv01/yang-ext:mount/Cisco-IOS-XR-ipv4-ospf-cfg:ospf
  2. Na aba Authorization, é necessário definir o parâmetro Basic Auth e login/senha: admin/admin.

Após a execução, devemos ver o seguinte:

Automatização de serviços de rede ou como montar um laboratório virtual usando OpenDaylight, Postman e Vrnetlab

Para remover a configuração, usamos DELETE:

  1. Linha de solicitação:
    DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/xrv01/yang-ext:mount/Cisco-IOS-XR-ipv4-ospf-cfg:ospf
  2. Na aba Authorization, é necessário definir o parâmetro Basic Auth e login/senha: admin/admin.

Conclusão

Como você pode notar, os procedimentos de conexão da Cisco e da Juniper ao OpenDaylight são bastante semelhantes — isso abre um amplo espaço para a criatividade. Desde a gestão das configurações de todos os componentes da rede até a criação de políticas de rede personalizadas.
Neste tutorial, forneci exemplos simples de como interagir com o equipamento de rede usando o OpenDaylight. Sem dúvida, as requisições dos exemplos apresentados podem ser bastante complexas e configurar serviços inteiros com um clique do mouse — tudo é limitado apenas pela sua imaginação.

Continua…

P.S.

Se você já sabe tudo isso ou, ao contrário, passou por aqui e se apaixonou pelo ODL, recomendo que considere o desenvolvimento de aplicativos no controlador ODL. Você pode começar daqui.

Experimentos bem-sucedidos!

Lista de referências

  1. Vrnetlab: Emular redes usando KVM e Docker / Brian Linkletter
  2. OpenDaylight Cookbook / Mathieu Lemay, Alexis de Talhouet, et al.
  3. Programabilidade de Rede com YANG / Benoît Claise, Loe Clarke, Jan Lindblad
  4. Aprendendo XML, Segunda Edição / Erik T. Ray
  5. DevOps Eficaz / Jennifer Davis, Ryn Daniels

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster