LINUX -DHCP, APACHE2, SSH
- Introdução
- Configurar interfaces de rede
- Configurar acesso por SSH
- Instalar o isc-dhcp-server
- Configurar o servidor DHCP e verificar seu funcionamento
- Criação das Pools
- Processo de atribuição de IP
- Criar Pools específicas filtrando por fabricante
- Instalar o Apache
- Editar página padrão
- Criar novo Virtual Host
- Criar certificados e habilitar https
Introdução
O objetivo desse trabalho é ter uma instalação do Ubuntu Server 20.04 configurada com o ISC-DHCP-SERVER fornecendo IPs para várias redes diferentes para diferentes finalidades, e também uma configuração básica do Apache2.
O servidor deverá fornecer IPs para vários grupos de máquinas, com Pools exclusivas para cada grupo, com os dispositivos sendo identificados de maneiras diferentes pelo servidor, pelo hostname ou pelo MAC address.
Também será configurado o webserver Apache2 que irá servir páginas com e sem segurança.
Configurar interfaces de rede
Durante o processo de instalação do Ubuntu Server podemos configurar as interfaces de rede disponíveis, durante a instalação dessa máquina dispomos de duas interfaces, uma usada para acessar a internet e outra que se ligará às outras máquinas.
O nome das interfaces pode variar de máquina para máquina, dependendo da interface que usam para se ligar ao computador, e de como estão identificadas na BIOS, caso não haja identificação de localização física e esteja ligada através de uma interface PCI, são identificados por ensX, onde X indica o índice do adaptador, caso exista indicação da localização física das ligações o formato é enpXsY, onde X é o número do BUS e Y é o número do dispositivo naquele BUS, e em alguns casos, quando um adaptador de rede tem mais do que uma porta, ele irá aparecer como enpXsYfZ, onde Z indica o índice da porta.
No caso de virtualização e interfaces virtuais, a apresentação poderá ser diferente de acordo com o hypervisor a ser utilizado, por exemplo, no caso do VirtualBox, as interfaces são apresentadas como enpXsY, enquanto no VMware, normalmente, como ensX, e o número da interface irá variar de acordo com os dispositivos adicionador à máquina virtual, e caso o arquivo de configuração da máquina virtual seja editado manualmente, é possível alterar o nome da interface para que em vez de mostrar ensX, mostre enpXsY, mas para isso é preciso experimentar um pouco, e ter sempre em conta que nem todos os números estão disponíveis.
Quanto a configuração dos IPs das interfaces, irei fazer a configuração da interface que terá acesso à internet durante a instalação do sistema, e a interface que irá se ligar às máquinas cliente depois do sistema ter sido instalado, para mostrar duas maneiras diferentes de o fazer.
Durante a instalação serão mostradas todas as interfaces de rede disponíveis, nesse caso temos duas, a primeira é a que está conectada e que tem acesso à internet, e é essa que iremos configurar para dar um IP estático, já que nesse momento tem um IP atribuído por DHCP, e nenhum servidor deve ter IP atribuído por DHCP, e sim utilizar um IP fixo.
Selecione a interface que deseja alterar o IP e aperte Enter, depois selecione Edit IPv4 e aperte Enter novamente, depois selecione Manual e aperte enter, aqui você deve preencher de acordo com a rede em que a máquina está conectada, depois selecione Save e clique em Enter, depois Done e aperte Enter novamente, com isso a configuração da primeira placa está feita, a configuração da segunda placa será feita depois de terminada a instalação.



Depois de completar a instalação vamos configurar o IP da segunda interface.
As versões mais recentes do Ubuntu usam o netplan como ferramenta de gestão de rede, que guarda as configurações das interfaces em um arquivo .yaml que fica em /etc/netplan.

Abra esse arquivo com o seu editor de texto preferido.

Aqui podemos ver as configurações das duas interfaces disponíveis no sistema, a primeira mostra as configurações que fizemos durante a instalação, a segunda mostra apenas que está configurada para receber um IP por DHCP, no caso dessa segunda interface, precisamos apenas configurar o IP dela, não é necessário configurar gateway nem DNS, por isso apenas duas novas linhas serão suficientes.

Não é preciso apagar a linha indicando que a interface irá receber um IP por DHCP, pode apenas a comentar para que não seja interpretada pelo sistema, e logo abaixo dela coloque as duas linhas mostradas na imagem acima, depois disso salve e feche esse arquivo de configuração.
Entretanto, apenas isso não é suficiente para que as configurações entrem em vigor, é preciso aplicar essas alterações, isso é feito com o comando netplan apply, executado como root.

Como podemos ver, originalmente a interface enp0s19 não tinha um endereço IPv4, depois de aplicar as configurações ela passou a ter um endereço IPv4.
Configurar acesso por SSH
Comece por selecionar a opção para instalar o servidor OpenSSH durante a instalação, isso fará com que o servidor possa ser acessado por SSH logo que for terminada a instalação, entretanto iremos usar uma porta diferente, para isso será necessário fazer algumas alterações em sua configuração.
Para isso abra o arquivo /etc/ssh/sshd_config como root, iremos precisar alterar apenas uma linha da configuração, na linha 15, retire o # para a ativar e altere o 22 para 12200, isso fará com que o servidor SSH passe a receber conexões na porta 12200 em vez da porta 22, que é a tradicional para esse serviço.


Depois disso é preciso reiniciar o serviço para que as alterações entrem em efeito, para isso use o comando service ssh restart como root, agora já é possível se conectar através da porta 12200.

Na imagem acima podemos ver uma captura do início de uma conexão SSH na porta 12200.
Para permitir conexões SSH através dessa porta com o firewall ativo é preciso primeiro abrir essa porta, para isso utilize o comando ufw allow 12200/tcp
E aqui podemos ver os sockets TCP que estão ativos no servidor nesse momento assim como as sessões SSH estabelecidas, seus números e os IPs dos clientes conectados, e também a configuração atual do firewall, mostrando que a porta 12200 está aberta.

Instalar o isc-dhcp-server
Instale o isc-dhcp-server com o comando apt install isc-dhcp-server, após alguns instantes ele estará pronto para ser configurado.
O arquivo de configuração se chama dhcpd.conf e se encontra na pasta /etc/dhcp/.


É nesse arquivo que iremos configurar o servidor e criar as pools que fornecerão endereços de IP para os dispositivos ligados na rede.
A documentação do isc-dhcp-client pode ser encontrada nesse link:
https://kb.isc.org/docs/en/isc-dhcp-44-manual-pages-dhcp-options
Configurar o servidor DHCP e verificar seu funcionamento
Vamos primeiro confirmar que o servidor DHCP está funcionando, para isso é só criar uma configuração básica e verificar que os clientes estão recebendo IPs corretamente, isso pode ser feito adicionando as seguintes linhas no final desse arquivo de configuração.

Com isso já podemos verificar se os clientes estão recebendo IPs corretamente.



Como podemos ver, os clientes estão recebendo IPs corretamente, com isso podemos continuar o processo de configuração do servidor DHCP e criar as Pools adequadas.
Criação das Pools
As Pools irão agrupar os clientes de acordo com características em comum, para isso é preciso primeiro criar as classes que irão fazer essa distinção entre os clientes, que por sua vez serão utilizadas pelas diferentes Pools para identificar os clientes que farão parte delas, vamos começar pelos clientes identificados por seus hostnames.

Com isso temos uma classe que irá identificar todos os clientes com um hostname começado por 304PC, agora iremos criar a Pool que irá usar essa classe como identificador.

Já temos a primeira Pool criada, depois de reiniciar o servidor DHCP e apagar o arquivo /var/lib/dhcp/dhcpd.leases, vamos agora testar com alguns clientes para confirmar que a Pool está funcionando corretamente.
Vamos começar por monitorar a lista de leases com o comando watch -n 1 dhcp-lease-list

Aqui podemos ver os dois clientes que receberam endereços de acordo com as regras da Pool.

E aqui podemos ver um dos clientes com o IP atribuído pelo servidor.

E aqui o outro cliente também com um IP atribuído.
Vamos criar outra classe e Pool seguindo o mesmo formato, entretanto usando identificadores e configurações diferentes, nesse caso será para os PCs da sala 3.05, que terão como hostnames 305PCXX e receberão IPs de uma faixa de IPs diferentes, nesse caso será de 10.17.05.0 até 10.17.05.255.

Aqui podemos ver as duas classes criadas e as duas Pools que as utilizam.
Depois de salvar a nova configuração e reiniciar o servidor, os clientes devem passar a receber IPs da nova Pool, se verificar através da lista the leases os novos clientes já devem estar lá com seus respectivos IPs.



E com isso podemos ver que os PCs estão recebendo IPs corretamente.
Agora que já verificamos que as Pools estão funcionando, vamos terminar de criar o resto das classes e Pools para as salas, com as máquinas identificadas pelos hostnames, mas dessa vez limitando o número de IPs de 256, como está configurado nesse momento, para 25 por Pool.
A nossa configuração deve ficar assim:
class "Sala3.04" {
match if substring(option host-name,0,5) = "304PC";
}
class "Sala3.05" {
match if substring(option host-name,0,5) = "305PC";
}
class "Sala3.06" {
match if substring(option host-name,0,5) = "306PC";
}
class "Sala3.07" {
match if substring(option host-name,0,5) = "307PC";
}
class "Sala3.08" {
match if substring(option host-name,0,5) = "308PC";
}
class "Sala3.12" {
match if substring(option host-name,0,5) = "312PC";
}
class "Sala3.14" {
match if substring(option host-name,0,5) = "314PC";
}
class "Sala3.16" {
match if substring(option host-name,0,5) = "316PC";
}
class "Sala3.17" {
match if substring(option host-name,0,5) = "317PC";
}
class "Sala3.18" {
match if substring(option host-name,0,5) = "318PC";
}
class "Sala4.01" {
match if substring(option host-name,0,5) = "401PC";
}
class "Sala4.02" {
match if substring(option host-name,0,5) = "402PC";
}
class "Sala4.03" {
match if substring(option host-name,0,5) = "403PC";
}
class "Sala4.04" {
match if substring(option host-name,0,5) = "404PC";
}
class "Sala4.05" {
match if substring(option host-name,0,5) = "405PC";
}
class "Sala4.06" {
match if substring(option host-name,0,5) = "406PC";
}
subnet 10.0.0.0 netmask 255.0.0.0 {
pool {
range 10.17.04.0 10.17.04.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala3.04";
}
pool {
range 10.17.5.0 10.17.5.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala3.05";
}
pool {
range 10.17.6.0 10.17.6.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala3.06";
}
pool {
range 10.17.7.0 10.17.7.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala3.07";
}
pool {
range 10.17.8.0 10.17.8.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala3.08";
}
pool {
range 10.17.12.0 10.17.12.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala3.12";
}
pool {
range 10.17.14.0 10.17.14.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala3.14";
}
pool {
range 10.17.16.0 10.17.16.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala3.16";
}
pool {
range 10.17.17.0 10.17.17.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala3.17";
}
pool {
range 10.17.18.0 10.17.18.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala3.18";
}
pool {
range 10.17.101.0 10.17.101.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala4.01";
}
pool {
range 10.17.102.0 10.17.102.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala4.02";
}
pool {
range 10.17.103.0 10.17.103.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala4.03";
}
pool {
range 10.17.104.0 10.17.104.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala4.04";
}
pool {
range 10.17.105.0 10.17.105.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala4.05";
}
pool {
range 10.17.106.0 10.17.106.24;
option domain-name-servers 10.255.255.253,8.8.8.8;
option routers 10.255.255.254;
default-lease-time 7200;
max-lease-time 14400;
allow members of "Sala4.06";
}
}
Processo de atribuição de IP
Agora vamos ver um exemplo de comunicação do processo de atribuição de IP.

Aqui temos a transação completa mostrando as quatro mensagens, Discover, Offer, Request e Acknowledgment ou ACK, abaixo podemos ver os campos que identificam o servidor.

E aqui podemos ver a lista de leases mostrando IPs fornecidos para máquinas de duas classes diferentes.

E se fizermos um novo pedido temos as seguintes mensagens trocadas entre cliente e servidor.

Aqui podemos ver que a primeira comunicação é um pedido de Release, depois é iniciado o processo DORA novamente e é atribuído um novo IP.
Criar Pools específicas filtrando por fabricante
Se usar o comando dhcp-lease-list para ver os leases atuais, vai ver que logo na primeira linha é mencionado um arquivo de texto para se obter os nomes dos fabricantes, e que esse arquivo deve ser baixado para /usr/local/etc/oui.txt, tenha atenção que a URL que é mostrada não está correta, a localização atual desse arquivo é http://standards-oui.ieee.org/oui/oui.txt, faça o download desse arquivo para a localização mencionada para obter mais informações sobre as máquinas.
Depois disso vamos adicionar uma nova classe para dispositivos HP que serão filtrados pelo seu MAC Address, e usando essa classe criar uma Pool exclusiva para esses dispositivos.

Essa classe de nome HP irá filtrar todos os dispositivos com MAC Addresses começados por 80:E8:2C e os colocar nessa classe, que por usa vez será utilizada para identificar em qual Pool de endereços esse dispositivo será colocado.

E aqui podemos ver que um equipamento teve um IP atribuído com sucesso da Pool destinada a equipamentos HP.
Agora que confirmamos que as configurações estão corretas, vamos criar outra classe e Pool para equipamentos Lexmark.


E como podemos ver, os dois clientes receberam IPs com sucesso e também tiveram seus fabricantes identificados corretamente, e abaixo temos as entradas no syslog referentes às transações DHCP dos dois dispositivos.

Vamos agora criar Pools para mais equipamentos, nesse caso para smarphones Samsung, Huawei e Crapple, as Pools terão as seguintes faixas de IPs:
- Samsung: 10.51.1.1 – 10.51.1.5
- Huawei: 10.51.1.6 – 10.51.1.10
- Crapple: 10.51.1.11 – 10.51.1.15
A configuração deve ficar dessa maneira:

E se conectarmos dispositivos desses fabricantes e dermos uma olhada na lista de leases iremos os encontrar dessa maneira:

E se desligarmos o servidor DHCP, temos o seguinte tráfego quando os clientes tentam renovar seus leases:

E abaixo podemos ver o tráfego de clientes renovando seus leases enquanto outro cliente tenta obter um lease sem sucesso, já que a Pool de endereços disponíveis para essa classe de aparelhos já está cheia.

Instalar o Apache
Vamos agora instalar o Apache e o php, para isso use o comando apt install apache2 libapache2-mod-php php -y
Com isso o Apache e php devem estar instalados e podemos verificar o estado do serviço apache2.

Entretanto, se tentarmos acessar a página padrão do Apache com o firewall ativo teremos um timeout, por isso é preciso abrir essas portas no firewall.
Com a instalação do Apache um novo perfil de aplicação foi adicionado nas configurações do firewall, fazendo com que seja mais simples abrir as duas portas necessárias de uma só vez, isso é possível de ser feito com o seguinte comando ufw allow "apache full"

Com isso já podemos acessar a página padrão através do IP do servidor.

Editar página padrão
Vamos agora editar essa página para mostrar algo diferente.
Por definição, ela fica localizada em /var/www/html, lá irá encontrar um documento chamado index.html, mude seu nome para index.html.bak, depois crie um novo documento com o nome de index.html e dentro dele coloque o seguinte conteúdo por enquanto:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title></title>
</head>
<body>
</body>
</html>
Essa é a estrutura básica de uma página html, vamos começar por dar um título para essa página, entre as tags title coloque o título desejado, se salvar o documento fizer um reload na página através do navegador verá que agora temos uma página em branco com o título que foi colocado anteriormente, entretanto, a página em si não tem conteúdo nenhum.
Vamos colocar um pouco de php nessa página, entretanto, primeiro é preciso mudar a sua extensão de .html para .php, caso contrário o servidor não irá executar nenhum código php que esteja na página.
Depois de feita essa alteração, abra o documento index.php, dentro das tags body coloque o seguinte:
<?php include 'datahora.php'; ?>
O conteúdo do documento deve ficar assim:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Servidor do Pedro</title>
</head>
<body>
<?php
include 'datahora.php';
?>
</body>
</html>
Essa nova adição fará com que quando a página seja carregada, um documento chamado datahora.php seja também carregado e seu conteúdo seja executado nesse local específico da página, entretanto, como esse documento ainda não existe, continuaremos vendo uma página em branco.
Crie um novo documento chamado datahora.php e coloque o seguinte conteúdo nele:
<?php
echo "<p>SERVIDOR DO PEDRO</p>";
echo "<p>Data e Hora atual: ".date('Y-m-d H:i:s').".</p>";
?>
Salve e carregue novamente a página, vai ver que agora temos conteúdo na página.
Vamos também adicionar uma imagem, abra o documento index.php e logo acima do início do bloco de código php que adicionamos coloque o seguinte:
<img src='cinel.png' alt='logo do cinel'>
O atributo src indica o caminho da imagem, nesse caso o nome do arquivo da imagem é cinel.png e está no diretório raíz da página e o atributo alt contém um texto alternativo para a imagem, para o caso de ela não ser carregada, e com isso a página agora fica assim:

Outra coisa interessante, se o documento php que foi criado anteriormente for acessado diretamente teremos quase a mesma página, mas dessa vez sem o título e a imagem.

Vamos agora habilitar conexões seguras, para isso use os seguintes comandos:
a2enmod ssl a2ensite default-ssl.conf service apache2 restart
Agora, se acessarmos o site por https já temos a nossa conexão encriptada.

Criar novo Virtual Host
Vamos agora criar um novo virtualhost, para isso, dentro da pasta /etc/apache2/sites-available crie uma cópia do arquivo 000-default.conf com um nome ilustrativo do site a ser criado, nesse caso o domínio utilizado será tbfinal.local, por isso o nome do arquivo ficará como tbfinal-local.conf, depois disso abra esse novo arquivo de configuração como root.
Precisaremos alterar uma linha e adicionar outra. Na linha onde temos a diretiva DocumentRoot, altere a localização atual de /var/www/html para /var/www/tbfinal, que vai ser onde iremos colocar os arquivos html e php desse novo site.
Abaixo dessa linha que acabamos de alterar coloque a diretiva ServerName tbfinal.local, salve e recarregue o serviço apache2.

Com a configuração criada, agora crie a pasta onde o site ficará hospedado, ela ficará em /var/www/tbfinal, como configuramos anteriormente, depois disso copie da pasta /var/www/html os arquivos index.php, datahora.php e a imagem para a pasta /var/www/tbfinal, depois disso abra o arquivo index.php para fazermos algumas alterações, para que não fique igual ao do site padrão.
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Servidor do Pedro - Trabalho Final</title>
</head>
<body>
<h1>Trabalho Final da UFCD 5115</h1>
<img src='cinel.png' alt='Logo do Cinel'>
<?php
include 'datahora.php';
?>
</body>
</html>
E abaixo podemos ver um excerto da comunicação entre o servidor e o cliente, com um pedido GET onde podemos ver o domínio que foi solicitado ao servidor.

Criar certificados e habilitar https
Primeiro vamos gerar o certificado, para isso use o comando openssl req -x509 -nodes -days 180 -newkey rsa:2048 -keyout mysitename.key -out mysitename.crt
Depois de criar o certificado e a chave, os mova para seus diretórios correspondentes, o certificado, com a extensão .crt, vai para a pasta /etc/ssl/certs, e a chave privada, com a extensão .key, vai para o diretório /etc/ssl/private, certifique-se de que ambos arquivos pertencem ao user root, e que o grupo a que a chave pertence é o ssl-cert.



Com isso a chave e certificado já estão armazenados nos locais certos, agora é preciso criar um novo virtualhost para o site tbfinal.local que funcionará por https, o processo é o mesmo que foi feito anteriormente, crie uma cópia da configuração default-ssl.conf com um nome relevante e edite essa cópia, altere o DocumentRoot apropriadamente e adicione a diretiva ServerName.
Agora é preciso selecionar os certificados que acabaram de ser criados, as alterações serão feitas nas diretivas SSLCertificateFile e SSLCertificateKeyFile, aponte a primeira para o certificado com a extensão .crt e a segunda para a chave com a extensão .key, depois disso é preciso recarregar as configurações.

Depois de feitas as configurações necessárias e o reload do serviço apache2, se acessarmos o site https://tbfinal.local veremos que ele tem um certificado, e se abrirmos o certificados poderemos ver suas informações.


E na imagem abaixo podemos ver todos os sockets que estão à escuta depois das configurações feitas no servidor.
