GNU/Linux
 
 
DHCP Server

Numa rede de computadores os administradores automatizam muitas de suas tarefas, principalmente em grandes redes. A distribuição de IPs de maneira automática pelo DHCP (Dynamic Host Configuration Protocol) Server é um exemplo. Esse servidor distribui informações de rede automática e centralizadamente. As informações que ele pode oferecer são: endereço IP, endereço de subrede, máscara de sub-rede, gateway padrão, endereço(s) do(s) DNS(s), domínio etc. Além disso, faz "amarrações" dessas informações com o endereço MAC de uma interface de rede. Também, pode trabalhar em conjunto com o servidor DNS. O DHCP Server utiliza a porta UDP 67 para comunicação.


Instalação DHCP server
# apt-get update ; apt-get install dhcp3-server -y (aparecerá um dialog dizendo que o servidor instalado é um non-authoritative por padrão. Isso significa que se um cliente requisitar um endereço que o server não conheça, ou seja, o endereço é incorreto para aquele segmento, o Server não enviará um DHCPNAK, o qual diz para ao cliente para parar de usar aquele endereço. Aperte "OK" para continuar)
Obs: aparecerá no final da instalação uma falha ao tentar iniciar o serviço DHCP Server. Isso é perfeitamente normal, devido a nenhuma sub-rede ter sido configurada na(s) interface(s) de rede. Com isso, evita-se que a rede, onde o servidor foi instalado, seja "derrubada" pelo simples fato de instalá-lo. O DHCP Server segue a famosa lenda dos servidores HighLander (só pode haver um ;-)

Habilitando interfaces de rede
# vi /etc/default/isc-dhcp-server (arquivo que lista as interfaces de rede que o DHCP Server vai trabalhar. A seguir é mostrada a linha padrão p/ essa configuração)
INTERFACES="" (linha padrão. A princípio não há interface habilitada. A seguir a linha modificada para a interface eth0)
INTERFACES="eth0" (linha modificada. O DHCP Server vai trabalhar na interface eth0)
INTERFACES="eth0 eth1" (linha modificada. O DHCP Server vai trabalhar na interface eth0 e eth1)

Arquivo de configuração
# vi /etc/dhcp3/dhcpd.conf (entra no arquivo de configuração)
ddns-update-style none; (indica que o DHCP não vai trabalhar em conjunto com o DNS. Caso haja esta integração, deve-se trocar "none" por "interim")
Obs: a opção "interim" faz a integração de um DHCP com um DNS e quer dizer que quando um cliente DHCP solicitar um IP ao servidor DHCP, este envia o nome do cliente para o DNS. Assim, o nome do cliente DHCP estará dentro do DNS de maneira automática, podendo usufruir de todos os benefícios de um DNS. Também é necessário configurar o cliente DHCP e o DNS.
option domain-name "example.org"; (define uma opcao global de dominio para todas as redes criadas nesse servidor DHCP. Geralmente se deve comentar essa linha, colocando um "#" no seu início, pois mais a frente essa opcao serao definida individualmente em cada sub-rede)
option domain-name-servers ns1.example.org, ns2.example.org; (define uma opcao global de DNS Servers para todas as redes criadas nesse servidor DHCP. Geralmente se deve comentar essa, colocando um "#" no seu início, pois mais a frente essa opcao sera definida individualmetne em cada sub-rede)
default-lease-time 600; (tempo padrão em segundos que o DHCP Server concede o IP, caso o cliente não peça por mais tempo)
max-lease-time 7200; (caso o cliente peça por mais tempo do que a linha anterior, o máximo possível é o valor definido em "max-lease-time")
#authoritative; (linha comentada por padrão. Isso significa que se um cliente requisitar um endereço que o server não conheça, ou seja, o endereço é incorreto para aquele segmento, o Server não enviará um DHCPNAK, o qual diz para ao cliente para parar de usar aquele endereço)
log-facility local7; (usado para enviar as menssagens de log para um destino diferente)
Obs: Dentro deste arquivo "/etc/dhcp3/dhcpd.conf" existem várias outras linhas comentadas que são exemplos de como declarar no DHCP Sever uma sub-rede, mas não as modifique, vá para o final do arquivo.

Agora será declarada uma sub-rede com as seguintes características (não as digite):
Sub-rede = 172.16.200.0
Máscara = 255.255.255.0
Intervalo entre os IP oferecidos = 172.16.200.50 à 172.16.200.200
IP do DNS primário e secundário = 172.16.200.1 e 172.16.200.2
Nome de domínio = matrix.com.br
Gateway padrão = 172.16.200.254


Então, va para o final do arquivo, e digite as linhas a seguir para que tenha as características da sub-rede acima
subnet 172.16.200.0 netmask 255.255.255.0 { (sub-rede 172.16.200.0 com máscara 255.255.255.0)
range 172.16.200.50 172.16.200.200; (intervalo de IPs que o DHCP Server vai oferecer)
option domain-name-servers 172.16.200.1, 172.16.200.2; (IP do DNS primário e secundário)
option domain-name "matrix.com.br"; (nome de domínio)
option routers 172.16.200.254; } (gateway padrão)

Salve e sai do arquivo de configuração. Agora inicialize o daemon do DHCP Server com o seguinte comando:
# /etc/init.d/dhcp3-server start (iniciando o serviço DHCP Server)

Caso não apareça erro, então está tudo OK. Para verificar se a porta 67 UDP usada pelo DHCP Server foi aberta digite:
# netstat -unap | grep -i dhcpd (mostra na tela se alguma porta UDP que tenha 67 está ativa, inclusive o nome do programa que a abriu)





A parte de configuração do servidor DHCP está OK. Agora p/ configurar um cliente GNU/Linux clique aqui e para configurar um cliente MS Windows clique aqui.





Com as configurações realizadas até o momento, se pôde configurar, de maneira rápida e fácil, um DHCP Server. No entanto, existem muitos outras características que se pode manipular. Por exemplo, colocar mais de um intervalo (range) de IPs que serão oferecidos para os clientes
# vi /etc/dhcp3/dhcpd.conf (entra no arquivo de configuração novamente)
subnet 172.16.200.0 netmask 255.255.255.0 {
range 172.16.200.50 172.16.200.200; (intervalo entre 172.16.200.50 até 172.16.200.200 )
range 172.16.200.230 172.16.200.253; (intervalo entre 172.16.200.230 até 172.16.200.253)
option domain-name-servers 172.16.200.1, 172.16.200.2;
option domain-name "matrix.com.br";
option routers 172.16.200.254; }

"Amarrando" o IP, oferecido pelo DHCP Server, com o endereço MAC da interface rede de um cliente
subnet 172.16.200.0 netmask 255.255.255.0 {
range 172.16.200.50 172.16.200.200;
option domain-name-servers 172.16.200.1, 172.16.200.2;
option domain-name "matrix.com.br";
option routers 172.16.200.254; }
host server01 { (nome do computador)
hardware ethernet 00:1e:8c:66:97:f1; (endereço MAC da interface de rede)
fixed-address 172.16.200.3; } (endereço IP que será oferecido ao MAC digitado na linha anterior)
host server02 { (nome de um outro computador)
hardware ethernet 00:50:56:c0:00:01; (endereço MAC da interface de rede)
fixed-address 172.16.200.55; } (endereço IP que será oferecido ao MAC digitado na linha anterior)
Obs: se pode fazer mais de uma amarração (IP/MAC) como exposto exemplo acima.

Pode setar informações individuais quando se fixa o IP com o MAC
subnet 172.16.200.0 netmask 255.255.255.0 {
range 172.16.200.50 172.16.200.200;
option domain-name-servers 172.16.200.1, 172.16.200.2; (informação global)
option domain-name "matrix.com.br"; (informação global)
option routers 172.16.200.254; } (informação global)
host server01 {
hardware ethernet 00:1e:8c:66:97:f1;
fixed-address 172.16.200.3;
option routers 172.16.200.1; } (informação individual para este host)
host server02 {
hardware ethernet 00:50:56:c0:00:01;
fixed-address 172.16.200.55;
option domain-name-servers 172.16.200.5; (informação individual para este host)
option routers 172.16.200.9; } (informação individual para este host)

Uma outra opção é trabalhar com grupos
subnet 172.16.200.0 netmask 255.255.255.0 {
range 172.16.200.50 172.16.200.200;
option domain-name-servers 172.16.200.1, 172.16.200.2;
option domain-name "matrix.com.br";
option routers 172.16.200.254; }
group servidores { (grupo chamado "servidores")
option domain-name-servers 172.16.200.7; (informação individual para este grupo)
host server01 {
hardware ethernet 00:50:51:e1:00:01;
fixed-address 172.16.200.43;
option routers 172.16.200.9; }
host server02 {
hardware ethernet 00:80:54:c5:30:02;
fixed-address 172.16.200.39;
option routers 172.16.200.11; }}
group roteadores { (grupo chamado "roteadores")
option routers 172.16.200.1; (informação individual para este grupo)
option domain-name-servers 172.16.200.41; (informação individual para este grupo)
host router01 {
hardware ethernet 00:20:51:e1:00:21;
fixed-address 172.16.200.13;
host router02 {
hardware ethernet 00:80:14:c5:32:22;
fixed-address 172.16.200.19; }}

Mais de uma sub-rede
subnet 172.16.200.0 netmask 255.255.255.0 {
range 172.16.200.50 172.16.200.200;
option domain-name-servers 172.16.200.1, 172.16.200.2;
option domain-name "matrix.com.br";
option routers 172.16.200.254; }
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.30 192.168.0.100;
option domain-name-servers 192.168.0.5;
option domain-name "reload.br";
option routers 192.168.0.252; }
Obs: as sub-redes relacionadas acima devem estar associadas as interfaces de rede definidas em /etc/default/dhcp3-server como exposto no início desse artigo. Então, acesse esse arquivo e defina os adaptadores de rede envolvidos. O DHCP Server sabe associar uma sub-rede com uma interface de rede através do endereço de rede e máscara de sub-rede que podem ser vistos com o comando "ifconfig".

A seguir tem-se um exemplo de como poderia ficar o arquivo de configuração /etc/dhcp3/dhcpd.conf. Nele foram configuradas 2 sub-redes, 4 ranges, grupos, hosts, informações globais e individuais. Apesar de ser grande, não é complicado:
subnet 172.16.200.0 netmask 255.255.255.0 {
range 172.16.200.50 172.16.200.200;
range 172.16.200.230 172.16.200.253;
option domain-name-servers 172.16.200.1, 172.16.200.2;
option domain-name "matrix.com.br";
option routers 172.16.200.254; }
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.30 192.168.0.100;
range 192.168.0.120 192.168.0.200;
option domain-name-servers 192.168.0.5;
option domain-name "reload.br";
option routers 192.168.0.252; }
group servidores {
option domain-name-servers 172.16.200.7;
host server01 {
hardware ethernet 00:50:51:e1:00:01;
fixed-address 172.16.200.43;
option routers 172.16.200.2; }
host server02 {
hardware ethernet 00:80:54:c5:30:02;
fixed-address 172.16.200.39;
option routers 172.16.200.9; }}
group roteadores {
option routers 172.16.200.1;
option domain-name-servers 172.16.200.41;
host router01 {
hardware ethernet 00:20:51:e1:00:21;
fixed-address 172.16.200.13;
host router02 {
hardware ethernet 00:80:14:c5:32:22;
fixed-address 172.16.200.19; }}
group dmz {
option routers 192.168.0.1;
option domain-name-servers 192.168.0.32;
host mail1 {
hardware ethernet 00:20:51:e1:03:29;
fixed-address 192.168.0.32; }
host mail2 {
hardware ethernet 00:80:14:c5:15:63;
fixed-address 192.168.0.7; }}




Monitoração e Gerência

# cat /var/lib/dhcp3/dhcpd.leases (DHCP client lease database. É neste arquivo onde se monitora, em tempo real, o que o DHCP Server está fazendo em relação a conseção dos IPs)
# cat /var/lib/dhcp3/dhcpd.leases~ (backup dos dados mais antigos do "/var/lib/dhcp3/dhcpd.leases")
# cat /var/run/dhcpd.pid (ou "ps ax | grep -i dhcp", mostra o número do processo)




CLUSTER COM O DCHP SERVER

O DHCP Server do GNU/Linux oferece a funcionabilidade de cluster como failover e load-balance. O failover significa ter dois DHCP Server trabalhando em alta-disponibilidade (high-availability). Nesse caso, esses dois servidores são chamados de primary e secondary. Além disso, é possível fazer balanceamento de carga (load-balance). A seguir será mostrado como deve ficar essas configurações no DHCP Servers (primary e secondary).



DCHP SERVER PRIMARY

# apt-get install ntpdate (é necessário a sicronização de hora no dois DHCP Servers. Se deve colocar a sicronização no CRON para que de tempos e tempos isso seja feita)
# vi /etc/default/isc-dhcp-server
failover peer "dhcp-failover" { (informa os inicio das configurações dos pares/dupla do failover. Peer = Pares)
primary; (informa que este servidor será o DHCP Server Primário)
address 172.16.200.1; (endereço IP DHCP Server Primário)
port 667; (porta de comunição do DHCP Server Primário)
peer address 172.16.200.2; (endereço IP DHCP Server Secudário)
peer port 668; (porta de comunição do DHCP Server Secudário)
max-response-delay 50; (timeout em segundos até o DHCP Server Primário ser trocado pelo Secudário)
max-unacked-updates 15; (timeout em segundos até o DHCP Server Primário ser trocado pelo Secudário)
mclt 3600; (MCLT - Maximum Client Lead Time. Prazo de entrega máximo do cliente. Essa opção é somente para o DHCP Server Primário. Esse parâmentro especifica o tempo para a troca da base de leases entre o Primário e Secundário)
split 128; (divisão entre o Primário e Secudário das entregas/ofertas de IP com o propósito de load-balancing. Esse valor vai de 0 até 255, assim, 128 é um divisão igualitária entre os dois servidores - 50% para cada um dos dois servidores])
load balance max seconds 5; (se um dos pares do load-balance não responder, serão chaveadas as requisições para o outro DHCP Server responder)
}
include "/etc/dhcpd/pools"; (aqui que entra a grande jogada. Ao invés de adicionar o restante das configurações no arquivo principal de configuração do DHCP Server "/etc/default/isc-dhcp-server", use um ou vários "include" para colocar as "subnet", "host", "group", "pool" etc. Isso para o esquema de failover é de extrema importância, pois se pode colocar o restante das configurações do DHCP Server num servidor de arquivos ou num storage e mapear isso nos DHCP Servers Primário e Secudário. Assim, evita fazer as configurações duas vezes no Primário e Secundário)



DCHP SERVER SECONDARY

# apt-get install ntpdate (é necessário a sicronização de hora no dois DHCP Servers. Se deve colocar a sicronização no CRON para que de tempos e tempos isso seja feita)

As configurações do DHCP Server Secundário são praticamente as mesmas do Primário, a não ser por algumas pequenas diferenças na declação do failover (failover peer "dhcp-failover"). É importante ter isso em mente, pois o restantes das configurações devem ser as mesmas.

# vi /etc/default/isc-dhcp-server
failover peer "dhcp-failover" { (informa os inicio das configurações dos pares/dupla do failover. Peer = Pares)
secondary; (informa que este servidor será o DHCP Server Secudário)
address 172.16.200.2; (endereço IP do DHCP Server Secudário)
port 668; (porta de comunição do DHCP Server Secudário)
peer address 172.16.200.1; (endereço IP do DHCP Server Primário)
peer port 667; (porta de comunição do DHCP Server Primário)
max-response-delay 50; (timeout em segundos até o DHCP Server Primário ser trocado pelo Secudário)
max-unacked-updates 15; (timeout em segundos até o DHCP Server Primário ser trocado pelo Secudário)
load balance max seconds 5; (se um dos pares do load-balance não responder, serão chaveadas as requisições para o outro DHCP Server responder)
}
include "/etc/dhcpd/pools/lan.conf"; (aqui que entra a grande jogada. Ao invés de adicionar o restante das configurações no arquivo principal de configuração do DHCP Server "/etc/default/isc-dhcp-server", use um ou vários "include" para colocar as "subnet", "host", "group", "pool" etc. Isso para o esquema de failover é de extrema importância, pois se pode colocar o restante das configurações do DHCP Server num servidor de arquivos ou num storage e mapear isso nos DHCP Servers Primário e Secudário. Assim, evita fazer as configurações de "subnet", "host", "group", "pool" etc duas vezes no Primário e Secundário)

# vi /etc/dhcpd/pools/
unknown-clients (essa opção é "allow" por padrão "allow unknown-clients". Um "unknown-clients" é simplesmente um cliente que não tem uma declaração "host". Caso esteja pensando em permitir acesso a sua rede somente para clientes conhecidos no DHCP Server, ou seja, os que tem uma declaração "host", basta colocar "deny unknown-clients". Fora do contexto de um "pool" use "ignore unknown-clients" em vez do "deny unknown-clients")
known-clients (um "known-clients" é simplesmente um cliente que tem uma declaração "host")
bootp (essa opção é "allow" por padrão "allow bootp". Essa opção especifica se o DHCP Server vai ou não responder as requisições "bootp" de clientes [allow, deny e ignore]. Num esquema de "failover peers" use "deny dynamic bootp clients" em vez do "deny bootp")
client-updates (essa opção especifica se o DHCP Server vai ou não deixar o cliente fazer atualização no DNS [A record]. Essa opção só deve ser usada quando se tem o "ddns-update-style interim" configurado)
all clients; (essa opção é usada para permitir ou previnir um "pool" para todos os clientes)
booting (essa opção é usada para informa se o DHCP Server deve ou não responder a uma requisição de um cliente em particular. Essa opção só tem sentido se aperecer numa declaração de "host". Caso se use um "deny booting" para um cliente, ele não oberá um endereço IP do DHCP Server. As opções são "allow", "deny" e "ignore")
client-updates (essa opção )



ORDEM DOS PACOTES DHCP TROCADOS ENTRE O CLIENTE E SERVIDOR

REQUISIÇÃO DE IP
DHCP DISCOVER (cliente. Pacote em broadcast)
DHCP OFFER (servidor)
DHCP REQUEST (cliente. Pacote em unicast)
DHCP ACK (servidor)
DHCP INFORMATION (client. Opcional, usado por exemplo quando um cliente solicita informações sobre proxy web via WPAD [configurações automáticas do browsers])



COLORINDO OS ARQUIVOS DE CONFIGURAÇÃO

# vi /usr/share/vim/vimcurrent/filetype.vim (adicione a linha a seguir)
au BufNewFile,BufRead /etc/dhcp/*.conf setf named




Assuntos Relacionados
DHCP Client no GNU/Linux .
DHCP Client no MS Windows .
DHCP Relay no GNU/Linux .
DHCP Relay no FreeBSD .
 
 


Hugo Azevedo de Jesus
ETI - Especialista em Tecnologia da Informação