DCIM/IPAM com phpIPAM

De ISPUP!
Ir para navegação Ir para pesquisar

Introdução

DCIM (Data Center Infraestructure Management) e IPAM (IP Address Management) são ferramentas que nos ajudam a administrar nosso ambiente de Datacenter e nossos recursos IPv4 e IPv6. Tenha em mente que controlar bem esses recursos pode te fazer economizar dinheiro e projetar melhor o crescimento do seu Provedor. Todos temos ciência que recursos de IPv4 público estão escassos e em muitos lugares já se esgotou. No Brasil o esgotamento foi anunciado em 19/8/2020 e atualmente se você deseja um prefixo IPv4 público, será necessário entrar em uma fila de espera de recuperação de recursos IP e tal espera pode ser algo entorno de 5 anos.

O objetivo desse artigo é mostrar a instalação do software phpIPAM, que é um DCIM/IPAM, e mostrar alguns exemplos de configuração. Não será nada tão sofisticado porque você deve configurá-lo conforme sua Operação e porque o objetivo aqui é te mostrar as excelentes possibilidades, para finalmente aposentar sua planilha Excel. Para entendermos o funcionamento dele e como de habitual, trabalharemos orientados em um modelo fictício e demonstrado no diagrama abaixo:


Requisitos

Como de costume utilizaremos o sistema Debian 11 (Bullseye) GNU/Linux e como ambiente não precisaremos de nada tão absurdo:

  • VM CPU Common KVM (2) @ 2.199GHz com 4 cores.
  • 4Gb de ram.
  • Um disco de 50Gb.

Instalação de pacotes base

Você pode dar uma olhada nesse artigo, como uma configuração inicial de ambiente e tenha em mente que esse sistema não deveria estar público na Internet. É um sistema com informações importantes e sigilosas, que só pessoas autorizadas da sua empresa devem ter acesso. Abaixo a lista de pacotes que instalaremos:

# apt install apache2 apache2-utils fping mariadb-server mariadb-client libapache2-mod-php php php-mysql php-cli php-pear php-gmp php-gd php-bcmath php-mbstring php-curl php-xml php-zip php-ldap php-json php-opcache php-readline php-snmp

Configurando o php.ini

Confira as variáveis abaixo e seus valores em /etc/php/7.4/apache2/php.ini. Os valores abaixo são os recomendados pelo pessoal do projeto do phpIPAM.

[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
serialize_precision = 17
zend.enable_gc = On
expose_php = Off
max_execution_time = 600
max_input_time = 60
memory_limit = 512M
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
log_errors = On
log_errors_max_len = 1024
default_mimetype = "text/html"
default_charset = "UTF-8"
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60

[Date]
date.timezone = "America/Sao_Paulo"

[mail function]
smtp_port = 25
mail.add_x_header = On

[SQL]
sql.safe_mode = Off

[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.cache_size = 2000
mysqli.default_port = 3306
mysqli.reconnect = Off

[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off

[Session]
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

[ldap]
ldap.max_links = -1

Em /etc/php/7.4/cli/php.ini modifique a variável date.timezone para "America/Sao_Paulo" ou outra que esteja usando, pois os scripts de testes do phpIPAM utilizam ela e por default não vem configurado no php.ini.

Configurando algumas coisas no Apache2

Após conferir e modificar as variáveis acima, habilitaremos o rewrite e ssl no Apache2:

# a2enmod rewrite
# a2enmod ssl
# a2ensite default-ssl.conf

Melhorar um pouco a segurança:

# perl -i -pe 's%ServerTokens OS%ServerTokens Prod%g' /etc/apache2/conf-available/security.conf
# perl -i -pe 's%ServerSignature On%ServerSignature Off%g' /etc/apache2/conf-available/security.conf
# systemctl restart apache2.service

Configurando algumas coisas do MariaDB

Agora vamos melhorar um pouco a segurança do MariaDB:

# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] Y
Enabled successfully!
Reloading privilege tables..
 ... Success!


You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] n
 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Por padrão, o MariaDB dispensa a senha de root quando utilizando por linha de comando do shell de root, mas vamos mudar isso agora e inclusive você deve escolher uma senha para o user root da base de dados:

# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 46
Server version: 10.5.18-MariaDB-0+deb11u1 Debian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD("senha_root");
Query OK, 0 rows affected (0,005 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0,000 sec)

MariaDB [(none)]> quit

No exemplo acima eu deixei a senha do usuário root da base de dados como sendo senha_root mas você deve escolher a sua e trocar ali no comando.

Criando a database do phpIPAM

A instalação automática da base de dados do phpIPAM não nos permite criar um usuário e senha específicos para acesso, então vamos criar o ambiente antes de instalar.

# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 50
Server version: 10.5.18-MariaDB-0+deb11u1 Debian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE phpipam;
Query OK, 1 row affected (0,000 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON phpipam.* TO 'phpipam'@'localhost' IDENTIFIED BY 'senha_user';
Query OK, 0 rows affected (0,004 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0,000 sec)

MariaDB [(none)]> quit
Bye

Acima criamos a database chamada phpipam e definimos para o user phpipam, a senha senha_user. Não esqueça de trocar essa senha por uma melhor.

Baixando e instalando o phpIPAM

Verifique qual a última versão do phpIPAM para baixar aqui. Nesse momento do artigo é a versão 1.5.2 e siga conforme abaixo:

# cd /usr/local/src
# wget -c https://github.com/phpipam/phpipam/releases/download/v1.5.2/phpipam-v1.5.2.tgz
# tar -xvzpf phpipam-v1.5.2.tgz
# rm /var/www/html/*
# mv phpipam/* /var/www/html/
# mv phpipam/.htaccess /var/www/html/
# find /var/www/* -type d -exec chmod 755 {} \;
# find /var/www/* -type f -exec chmod 644 {} \;
# chown -R www-data: /var/www/html/
# cd /var/www/html/
# cp config.dist.php config.php

Configurando o config.php do phpIPAM

Edite o arquivo config.php, localize logo no início esse trecho de código:

$db['host'] = '127.0.0.1';
$db['user'] = 'phpipam';
$db['pass'] = 'phpipamadmin';
$db['name'] = 'phpipam';
$db['port'] = 3306;

Altere o $db['pass'] = 'phpipamadmin' e no lugar mude phpipamadmin para a senha que você escolheu quando criou a database do phpIPAM, no meu caso deixei como senha_user. Depois da alteração ficaria assim:

$db['host'] = '127.0.0.1';
$db['user'] = 'phpipam';
$db['pass'] = 'senha_user';
$db['name'] = 'phpipam';
$db['port'] = 3306;

Modificando Apache2 para Prettify links (opcional)

Adicione em /etc/apache2/sites-available/default-ssl.conf o bloco Directory logo abaixo do DocumentRoot /var/www/html ficando assim:

                DocumentRoot /var/www/html
                <Directory /var/www/html/>
                        Options FollowSymLinks
                        AllowOverride all
                        Allow from all
                </Directory>

Iniciando a configuração do phpIPAM via web

Nesse momento acesse pelo seu navegador a URL contendo o IP do seu servidor phpIPAM. No meu caso, eu instalei no IP 10.0.10.172:

https://10.0.10.172

Na tela abaixo, selecione o 1 para criarmos uma nova instalação do phpIPAM.

Na próxima sequência usaremos a opção 1 para instalação automática da database:

Na próxima tela entraremos com o user phpipam, a senha que você definiu para ele, no meu caso deixei como senha_user. Na sequência vamos em Show advanced options, desmarcamos todas as opções e seguimos com a instalação da database.

Nesta próxima tela vamos escolher uma senha para o user admin do phpIPAM, vamos mudar o título do site e configurar a URL do site. Isso tudo podemos alterar mais tarde se quisermos.

Após a instalação teremos a tela de login e após nos identificarmos teremos esse visual:

Adicionando no cron scripts para habilitar recurso de auto discovery e ping check

Em /etc/crontab adicione as seguintes linhas abaixo. Elas serão usadas apenas se marcarmos dentro do phpIPAM o uso delas, caso contrário ficarão disponíveis para quando precisarmos.

*/15 *  * * *   root    /usr/bin/php /var/www/html/functions/scripts/discoveryCheck.php
*/15 *  * * *   root    /usr/bin/php /var/www/html/functions/scripts/pingCheck.php

Zerando o phpIPAM

Por padrão o sistema já instala com alguns dados de exemplo e vamos acessar em Subnets e depois em All sections:

Vamos na sequência apagar todas as sections conforme abaixo, tanto a IPv6, quanto o Customers:

Faremos o mesmo com as vlans:

Apagaremos as duas vlans de exemplo:

Feito isso quando voltarmos no nosso dashboard do phpIPAM teremos tudo zerado, exceto pelo usuário admin lógico:

Começando a nossa documentação

Como havia comentado no início do artigo, vamos seguir o diagrama como nosso modelo. Serei bem simples nas configurações porque o objetivo é mostrar como usar essa ferramenta excepcional para facilitar nossa vida. Também não conseguirei abordar tudo mas acredito que você mesmo conseguirá avançar mais na ferramenta, conforme for utilizando. Dito isso, não ache estranho faltarem switches, vlans e demais informações nos exemplos.

No nosso cenário fictício temos um ASN com um prefixo IPv4 /22 público e um prefixo IPv6 /32 global, pelo visto atendemos 2 cidades Araruama/RJ (AMA) e Saquarema/RJ (SQR) em Datacenters diferentes. Então vamos tentar passar isso para a nossa ferramenta.

Preparando nosso ambiente

O phpIPAM vem com diversos módulos de controle. Vou deixar habilitado somente os módulos que iremos utilizar aqui. Caso queira ver algum outro módulo, só habilitar e estudá-lo.

Estarei deixando os módulos assim:

Para podermos usar o recurso de auto discovery vamos selecionar o fping no lugar do ping:

Cadastrando as Locations

Aqui podemos estar cadastrando nossos pontos de presença mas nesse caso vamos cadastrar a localização fictícia de nossos Datacenters AMA-DC01 e SQR-DC01 :

Cada localidade teremos um Rack pelo menos para acomodar nossos equipamentos de Telecom e Servidores:

Em Devices cadastramos os equipamentos nos devidos Datacenters e posicionados corretamente nos Racks que criamos. Existem diversos tipos de devices cadastrados no phpIPAM mas nesse caso fui em Manage device types e criei os tipos BNG e CGNAT, que não existiam. Na sequência cadastrei todos os devices conforme mostra a tela abaixo.

Agora temos registros visuais dos nossos equipamentos. Quando voltamos em Racks e clicamos em qualquer Rack teremos informações como estas:

Acima além de termos uma localização plotada em mapa do nosso Rack, temos quais equipamentos estão nele, em que posição do Rack. Também podemos configurar a parte de trás do Rack se precisarem.

Aqui vimos o básico para você uma organização dos seus POPs, DCs, Racks e ativos. Agora vamos para administração dos Recursos IPv4 e IPv6.

Entrando na gestão dos recursos IPv4 e IPv6

Para iniciarmos, precisaremos criar uma Section que será o nosso ASN:

Abaixo criamos nossa section AS65534-ISPUP com permissão padrão de somente read only. Essas permissões serão úteis quando você trabalhar com equipes e dar as devidas permissões para cada uma delas.

Dentro desta section é que vamos organizar nossos IPs. Vamos criar as pastas para separar as cidades e organizar os prefixos nelas.

Uma vez dentro da Section você pode criar pastas, cadastrar prefixos, organizá-los e especificar onde eles estão sendo utilizados como por exemplo o prefixo 172.17.0.0/27, que está sendo usado entre a Borda, o BNG e o CGNAT, no nosso exemplo.

O mesmo conceito você aplicará para todos os seus pools de IPv4 públicos de caixas CGNAT, pools de CGNAT 100.64.0.0/10 que você utilizará nos seus BNGs, criar domínios de VLANs e informar também qual vlan estaria sendo utilizada naquele prefixo. Enfim, você precisa alimentar o seu phpIPAM com todas as informações que tiver sobre seus IPs e onde estão sendo utilizados. Ele vai te ajudar a reservar prefixos para algum projeto, vai poder controlar e saber quantos IPv4 públicos ainda tem disponíveis e onde estão sendo usados.

Se você clicar por exemplo no IP daquele prefixo, ele vai te dizer em qual equipamento está sendo usado e em que posição do Rack por exemplo:

Finalizando

O phpIPAM é uma ferramenta fantástica, com muitos recursos, tantos que não caberia discuti-los neste artigo pois se tornaria muito extenso. Agora que te mostrei como instalar e brincar com ele, explore, conheça todas as suas funções mas não deixe de documentar sua Rede, isso te ajudará de muitas formas, no crescimento da sua Operação e na busca de informações valiosas durante algum troubleshooting.

Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos aqui.