====== Servidor DHCP ======
Criado e mantido pelo **ISC (Internet Systems Consortium)**, um grupo sem fins lucrativos dedicado a desenvolver serviços de infra-estrutura usados na Internet, incluindo o Bind e o NTPD. Caso esteja curioso, a página com o código fonte é a: http://www.isc.org/sw/dhcp/. O protocolo DHCP (Dynamic Host Configuration Protocol) funciona nas camadas 2 e 3 do modelo **OSI** e é amplamente utilizado para oferecer endereço IP a um "host" que ainda não está configurado, o que oferece uma flexibilidade ao Administrador de Redes.
O que um servidor **DHCP** faz é bastante simples. Ele responde aos pacotes de //broadcast// das estações, enviando um pacote com um dos endereços IP disponíveis e os demais dados da rede. Os pacotes de //broadcast// são endereçados ao endereço "255.255.255.255" e retransmitidos pelo //switch// da rede para todas as portas, diferente dos pacotes endereçados a um endereço específico, que são transmitidos apenas na porta relacionada a ele.
Periodicamente o servidor DHCP verifica se as estações ainda estão lá, exigindo uma renovação do "aluguel" do endereço IP. Isso permite que os endereços IP sejam gastos apenas com quem realmente estiver online, evitando que os endereços disponíveis se esgotem.
O protocolo "DHCP" opera da seguinte forma:
{{:lns_dhcp.png|}}
**DHCPDISCOVER** - Um cliente envia um quadro "broadcast"(destinado a todas as máquinas) com um pedido "DHCP";
**DHCPOFFER** - O servidor "DHCP" captura o quadro e oferece um Endereço IP ao "host" requisitante;
**DHCPREQUEST** - O cliente envia um "DHCP REQUEST" endereçado para o servidor "DHCP" aceitando o IP;
**DHCPACK** - Esse é o pacote que confirma a atribuição de uma configuração de rede a um cliente, ou seja, aquele cliente agora possui configurações distribuídas pelo servidor "DHCP";
**DHCPNAK** - Caso o cliente não aceite aquele endereço IP, ele enviará um "DHCPNAK" para o servidor, e realizará o "DHCPDISCOVER" novamente.
**DHCPDECLINE** – Caso o IP já esteja sendo utilizado por outro Host, o cliente envia um DHCPDECLINE anunciando ao servidor que o endereço já é utilizado;
**DHCPRELEASE** – Se por algum motivo o cliente deixa de usar o endereço IP, o mesmo manda um DHCPRELEASE dizendo que aquele IP ja pode ser usado por outro Host;
**DHCPINFORM** – Utilizado quando o Cliente já possui endereço IP, mas precisa de outras informações, como o servidor DNS por exemplo, o mesmo envia um DHCPINFORM pedindo tais informações para o servidor DHCP.
O "DHCP" oferece três tipos de alocação de endereços IP:
**Atribuição manual** - Quando desejamos que certo cliente tenha determinado endereço IP, temos que "amarrar"o endereço "MAC"da máquina cliente ao endereço IP desejado. O servidor DHCP descobre o "MAC ADDRESS" do cliente
através do "DHCPDISCOVER", assim identificando quais são as máquinas queirão receber configurações personalizadas;
**Atribuição automática** - Onde o cliente obtém um endereço de um espaço de endereços possíveis chamado de range, especificado pelo administrador. Geralmente não existe vínculo entre os vários "MAC’s" habilitados a esse espaço
de endereços. Assim que o cliente se loga pela primeira vez na rede, ele recebe um endereçamento definitivo;
**Atribuição dinâmica** - O único método que dispõe da reutilização dinâmica dos endereços. O administrador disponibiliza um espaço de endereços possíveis, e cada cliente terá o software "TCP/IP" da sua interface de rede configurados para requisitar um endereço por "DHCP" assim que a máquina inicialize. A alocação utiliza um mecanismo de aluguel do endereço, caracterizado por um tempo de vida. Após a máquina se desligar, o tempo de vida naturalmente irá expirar, e da próxima vez que o cliente se ligue, o endereço provavelmente será outro. Podemos ainda configurar uma atualização dinâmica dos servidores de "DNS" para que cada cliente disponha também de um registro "DNS".
====== Implementando um Servidor DHCP ======
Primeiro iremos instalar o pacote do servidor dhcp:
root@dhcp:~# apt-get install isc-dhcp-server
Obtendo informação sobre o pacote instalado
root@dhcp:~# dpkg -L isc-dhcp-server
/.
/var
/var/lib
/var/lib/dhcp
/etc
/etc/dhcp
/etc/dhcp/dhcpd.conf
/etc/init.d
/etc/init.d/isc-dhcp-server
/usr
/usr/sbin
/usr/sbin/dhcpd
/usr/sbin/dhcp-lease-list
/usr/share
/usr/share/man
/usr/share/man/man5
/usr/share/man/man5/dhcpd.leases.5.gz
/usr/share/man/man5/dhcpd.conf.5.gz
/usr/share/man/man8
/usr/share/man/man8/dhcpd.8.gz
/usr/share/doc
/usr/share/doc/isc-dhcp-server
/usr/share/doc/isc-dhcp-server/NEWS.Debian.gz
/usr/share/doc/isc-dhcp-server/examples
/usr/share/doc/isc-dhcp-server/examples/dhcpd.conf.example
/usr/share/doc/isc-dhcp-server/copyright
/usr/share/doc/isc-dhcp-server/README.Debian
/usr/share/doc/isc-dhcp-server/changelog.Debian.gz
Vamos renomear o arquivo original do DHCP para uma possível consulta:
root@dhcp:~# mv /etc/dhcp/dhcpd.conf{,.dist}
Agora vamos iniciar nossa configuração num arquivo zerado. Abra-o e insira o conteúdo abaixo:
root@dhcp:~# cat /etc/dhcp/dhcpd.conf
ddns-update-style none;
#deny unknown-clients;
log-facility local7;
subnet 192.0.2.0 netmask 255.255.255.0 {
range 192.0.2.50 192.0.2.100;
authoritative;
option domain-name "exemplo.org";
option domain-name-servers 192.0.2.200,192.0.2.201;
# option netbios-name-servers 192.0.2.202;
option routers 192.0.2.1;
default-lease-time 600;
max-lease-time 7200;
min-lease-time 120;
}
**Principais diretrizes do arquivo de configuração**
**ddns-update-style:** forma que o DHCP irá armazenar as informações de redes dos clientes. Atualmente são implementados dois esquemas de atualização do DNS - o modo de atualização do DNS improvisado (ad-hoc) e o modo de atualização do esquema de interação do intervalo DHCP-DNS (interim);
**deny unknown-clients:** nega acesso a MAC não cadastrado;
**log-facility local7:** Criaremos uma entrada no /etc/rsyslog.conf para os logs do servidor DHCP;
**subnet 192.0.2.0 netmask 255.255.255.0:** qual rede o DHCP irá responder quando for solicitado;
**range 192.0.2.50 192.0.2.100:** faixa de IPs que será disponibilizado aos clientes;
**authoritative:** Indica que o servidor DHCP será autoritário em todo o seguimento da rede;
**option subnet-mask 255.255.255.0** - Essa opção define a máscara de sub-rede a ser fornecida aos clientes;
**option domain-name exemplo.org** - O nome de domínio do cliente;
**option domain-name-servers 192.0.2.200,192.0.2.201** - Essa opção lista os servidores de nomes (DNS) a serem utilizados para resolução de nomes;
**option netbios-name-servers 192.0.2.202** - Esta opção define um servidor WINS para estações Windows;
**option routers 192.0.2.1** - O cliente, além do número IP, recebe também a informação do número do "gateway"de sua rede;
**default-lease-time 600** - Servidores "DHCP" cedem endereços sob pedido por um tempo pré-determinado. O padrão nesse exemplo é ceder o endereço IP por 600 segundos, ou 10 minutos;
**max-lease-time 7200** - Caso o cliente solicite um tempo maior, o tempo máximo permitido será de 7.200 segundos (2 horas);
Para habilitar o suporte ao servidor dinâmico, utilize dynamic-bootp
Exemplo: **range dynamic-bootp 192.0.2.50 192.0.2.100;**
Uma vez criado o arquivo de configuração, basta reinicializar o servidor DHCP:
root@dhcp:~# systemctl restart isc-dhcp-server.service
**Checando os serviços**
root@dhcp:~# systemctl status isc-dhcp-server.service -l
● isc-dhcp-server.service - LSB: DHCP server
Loaded: loaded (/etc/init.d/isc-dhcp-server)
Active: active (running) since Sex 2016-03-18 16:52:13 BRT; 1min 26s ago
Process: 1135 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/isc-dhcp-server.service
└─1143 /usr/sbin/dhcpd -q -cf /etc/dhcp/dhcpd.conf -pf /var/run/dhcpd.pid
Mar 18 16:52:11 dhcp.exemplo.org dhcpd[1140]: Copyright 2004-2014 Internet Systems Consortium.
Mar 18 16:52:11 dhcp.exemplo.org dhcpd[1140]: All rights reserved.
Mar 18 16:52:11 dhcp.exemplo.org dhcpd[1140]: For info, please visit https://www.isc.org/software/dhcp/
Mar 18 16:52:11 dhcp.exemplo.org dhcpd[1142]: Internet Systems Consortium DHCP Server 4.3.1
Mar 18 16:52:11 dhcp.exemplo.org dhcpd[1142]: Copyright 2004-2014 Internet Systems Consortium.
Mar 18 16:52:11 dhcp.exemplo.org dhcpd[1142]: All rights reserved.
Mar 18 16:52:11 dhcp.exemplo.org dhcpd[1142]: For info, please visit https://www.isc.org/software/dhcp/
Mar 18 16:52:11 dhcp.exemplo.org dhcpd[1142]: Wrote 0 leases to leases file.
Mar 18 16:52:11 dhcp.exemplo.org dhcpd[1143]: Server starting service.
Mar 18 16:52:13 dhcp.exemplo.org isc-dhcp-server[1135]: Starting ISC DHCP server: dhcpd.
Checando os processos
root@dhcp:~# ps -ef | grep dhcpd
root 1143 1 0 16:52 ? 00:00:00 /usr/sbin/dhcpd -q -cf /etc/dhcp/dhcpd.conf -pf /var/run/dhcpd.pid
root 1154 422 0 16:55 pts/0 00:00:00 grep dhcpd
====== Configurando os LOGs ======
No Debian, o arquivo de configuração do syslog fica em /etc/rsyslog.conf. A seguinte entrada pode ser adiciona no final do arquivo:
root@dhcp:~# echo "local7.* /var/log/dhcpd.log" | tee --append /etc/rsyslog.conf
local7.* /var/log/dhcpd.log
root@dhcp:~# cat /etc/rsyslog.conf | grep dhcp
local7.* /var/log/dhcpd.log
root@dhcp:~# systemctl restart rsyslog
root@dhcp:~# systemctl restart isc-dhcp-server.service
root@dhcp:~# tail /var/log/dhcpd.log
Mar 18 17:38:25 dhcp dhcpd: Dynamic and static leases present for 192.0.2.50.
Mar 18 17:38:25 dhcp dhcpd: Remove host declaration cliente or remove 192.0.2.50
Mar 18 17:38:25 dhcp dhcpd: from the dynamic address pool for 192.0.2.0/24
Mar 18 17:38:25 dhcp dhcpd: DHCPREQUEST for 192.0.2.50 from 08:00:27:b0:6a:cd via eth0
Mar 18 17:38:25 dhcp dhcpd: DHCPACK on 192.0.2.50 to 08:00:27:b0:6a:cd via eth0
Mar 18 17:38:27 dhcp dhcpd: Dynamic and static leases present for 192.0.2.50.
Mar 18 17:38:27 dhcp dhcpd: Remove host declaration cliente or remove 192.0.2.50
Mar 18 17:38:27 dhcp dhcpd: from the dynamic address pool for 192.0.2.0/24
Mar 18 17:38:27 dhcp dhcpd: DHCPREQUEST for 192.0.2.50 from 08:00:27:b0:6a:cd via eth0
Mar 18 17:38:27 dhcp dhcpd: DHCPACK on 192.0.2.50 to 08:00:27:b0:6a:cd via eth0
Com isso todos os logs com origem da facility local7 (facility essa que representa o serviço de DHCP) em qualquer priority (indica o nível de importância do log) serão logados no /var/log/dhcpd.log.
====== Configurando os clientes DHCP ======
Vamos configurar a máquina cliente Linux. Abra o arquivo de rede e configure a interface eth0 para pegar IP via DHCP :
root@cliente:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp
Reinicie o serviço de rede e
root@cliente:~# systemctl restart networking
root@cliente:~# dhclient eth0 -v
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/eth0/08:00:27:b0:6a:cd
Sending on LPF/eth0/08:00:27:b0:6a:cd
Sending on Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 6
DHCPREQUEST on eth0 to 255.255.255.255 port 67
DHCPOFFER from 192.0.2.254
DHCPACK from 192.0.2.254
bound to 192.0.2.51 -- renewal in 228 seconds.
FIXME Caso não tenha o comando dhclient, “setar” um IP fixo manualmente e instalar o pacote abaixo: //# aptitude install isc-dhcp-client//
====== Fixar IP via DHCP ======
É possível fixar o IP via "DHCP" para máquinas respectivas. Isso é feito associando o "MAC Address" da placa de rede com um endereço IP.
Colhendo o MAC da maquina cliente
root@cliente:~# ip a | grep ether
link/ether 08:00:27:b0:6a:cd brd ff:ff:ff:ff:ff:ff
Para este cenário ser possível adicione no final do arquivo de configuração "/etc/dhcp/dhcpd.conf" o que está abaixo:
root@dhcp:~# cat /etc/dhcp/dhcpd.conf
ddns-update-style none;
#deny unknown-clients;
log-facility local7;
subnet 192.0.2.0 netmask 255.255.255.0 {
range 192.0.2.50 192.0.2.100;
authoritative;
option domain-name "exemplo.org";
option domain-name-servers 192.0.2.200,192.0.2.201;
# option netbios-name-servers 192.0.2.202;
option routers 192.0.2.1;
default-lease-time 600;
max-lease-time 7200;
min-lease-time 120;
}
# MAC DO CLIENTE
host cliente {
hardware ethernet 08:00:27:b0:6a:cd;
fixed-address 192.0.2.50;
}
Reinicie o dhcp server
root@dhcp:~# systemctl restart isc-dhcp-server.service
Recarregue as configurações de rede do cliente
root@cliente:~# ifdown eth0 && ifup eth0
RTNETLINK answers: No such process
Killed old client process
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/eth0/08:00:27:b0:6a:cd
Sending on LPF/eth0/08:00:27:b0:6a:cd
Sending on Socket/fallback
DHCPRELEASE on eth0 to 192.0.2.254 port 67
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/eth0/08:00:27:b0:6a:cd
Sending on LPF/eth0/08:00:27:b0:6a:cd
Sending on Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
DHCPREQUEST on eth0 to 255.255.255.255 port 67
DHCPOFFER from 192.0.2.254
DHCPACK from 192.0.2.254
bound to 192.0.2.50 -- renewal in 287 seconds.
====== Configurações adicionais ======
===== Lado do servidor =====
No que diz respeito ao servidor, podemos ainda verificar alguns arquivos para diagnosticar problemas ou mesmo extrair relatórios. Vejamos:
root@dhcp:~# cat /var/lib/dhcp/dhcpd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.3.1
lease 192.0.2.50 {
starts 5 2016/03/18 20:14:26;
ends 5 2016/03/18 20:24:26;
tstp 5 2016/03/18 20:24:26;
cltt 5 2016/03/18 20:14:26;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 08:00:27:b0:6a:cd;
client-hostname "cliente.exemplo.org";
}
lease 192.0.2.51 {
starts 5 2016/03/18 20:17:13;
ends 5 2016/03/18 20:27:13;
tstp 5 2016/03/18 20:27:13;
cltt 5 2016/03/18 20:17:13;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 08:00:27:b0:6a:cd;
client-hostname "cliente.exemplo.org";
}
server-duid "\000\001\000\001\036\177\036\355\010\000'\260j\315";
lease 192.0.2.50 {
starts 5 2016/03/18 20:14:26;
ends 5 2016/03/18 20:18:38;
tstp 5 2016/03/18 20:18:38;
cltt 5 2016/03/18 20:14:26;
binding state free;
hardware ethernet 08:00:27:b0:6a:cd;
}
Este arquivo armazena o banco de dados de aluguel do cliente DHCP. Este arquivo não deve ser modificado manualmente. As informações de aluguel DHCP de cada endereço IP recentemente atribuído são armazenadas automaticamente no banco de dados de aluguel. As informações incluem datas do aluguel e os endereços MAC
da placa de interface de rede usada para recuperar o aluguel.
Todos os horários do banco de dados de aluguel estão em GMT (Greenwich Mean Time) e não horário local. O banco de dados de aluguel é recriado de tempos em tempos para que não fique muito grande. Primeiramente, todos os aluguéis conhecidos são salvos em um banco de dados temporário de aluguel. Então, o arquivo dhcpd.leases é renomeado para dhcpd.leases , e o banco de dados temporário é salvo como dhcpd.leases.
O daemon DHCP pode ser finalizado (killed) ou o sistema pode falhar (crash) após o banco de dados de aluguel ter sido renomeado como o arquivo backup, mas antes do novo arquivo ser salvo. Se isto acontecer, o arquivo dhcpd.leases não existe, mas é necessário para iniciar o serviço. Não crie um novo arquivo de aluguel. Se você
o fizer, todos os aluguéis antigos serão perdidos e causarão muitos problemas. A solução correta é renomear o arquivo backup dhcpd.leases como dhcpd.leases e então iniciar o daemon.
Outro arquivo importante é o /etc/default/isc-dhcp-server, onde podemos setar qual interface de rede responderá as requisições dos clientes. Basta configurarmos conforme abaixo:
root@dhcp:~# egrep -i interface /etc/default/isc-dhcp-server
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="eth0"
==== Lado do cliente ====
Pelo lado do cliente podemos acompanhar quais os endereços IPs que já recebeu analisando o arquivo “/var/lib/dhcp/dhclient.leases”:
root@cliente:~# cat /var/lib/dhcp/dhclient.leases
lease {
interface "eth0";
fixed-address 192.0.2.51;
option subnet-mask 255.255.255.0;
option routers 192.0.2.1;
option dhcp-lease-time 600;
option dhcp-message-type 5;
option domain-name-servers 192.0.2.200,192.0.2.201;
option dhcp-server-identifier 192.0.2.254;
option domain-name "exemplo.org";
renew 5 2016/03/18 20:10:18;
rebind 5 2016/03/18 20:15:15;
expire 5 2016/03/18 20:16:30;
}
lease {
interface "eth0";
fixed-address 192.0.2.51;
option subnet-mask 255.255.255.0;
option routers 192.0.2.1;
option dhcp-lease-time 600;
option dhcp-message-type 5;
option domain-name-servers 192.0.2.200,192.0.2.201;
option dhcp-server-identifier 192.0.2.254;
option domain-name "exemplo.org";
renew 5 2016/03/18 20:14:42;
rebind 5 2016/03/18 20:19:03;
expire 5 2016/03/18 20:20:18;
}
lease {
interface "eth0";
fixed-address 192.0.2.50;
option subnet-mask 255.255.255.0;
option routers 192.0.2.1;
option dhcp-lease-time 600;
option dhcp-message-type 5;
option domain-name-servers 192.0.2.200,192.0.2.201;
option dhcp-server-identifier 192.0.2.254;
option domain-name "exemplo.org";
renew 5 2016/03/18 20:22:43;
rebind 5 2016/03/18 20:26:56;
expire 5 2016/03/18 20:28:11;
}
lease {
interface "eth0";
fixed-address 192.0.2.50;
option subnet-mask 255.255.255.0;
option routers 192.0.2.1;
option dhcp-lease-time 600;
option dhcp-message-type 5;
option domain-name-servers 192.0.2.200,192.0.2.201;
option dhcp-server-identifier 192.0.2.254;
option domain-name "exemplo.org";
renew 5 2016/03/18 20:27:38;
rebind 5 2016/03/18 20:31:28;
expire 5 2016/03/18 20:32:43;
}
==== Checando as configurações que foram fornecidas pelo dhcp server ====
**IP**
root@cliente:~# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:b0:6a:cd brd ff:ff:ff:ff:ff:ff
inet 192.0.2.50/24 brd 192.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:feb0:6acd/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
**Rota**
root@cliente:~# ip route | grep default
default via 192.0.2.1 dev eth0
root@cliente:~# cat /etc/resolv.conf
domain exemplo.org
search exemplo.org
nameserver 192.0.2.200
nameserver 192.0.2.201
**Pingando para fora da rede**
root@cliente:~# ping -c3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=61 time=33.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=61 time=33.8 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 2 received, 33% packet loss, time 2001ms
rtt min/avg/max/mdev = 33.704/33.798/33.892/0.094 ms
**Testando a resolução de nomes**
root@cliente:~# ping -c3 google.com.br
PING google.com.br (216.58.222.3) 56(84) bytes of data.
64 bytes from gru06s25-in-f3.1e100.net (216.58.222.3): icmp_seq=1 ttl=61 time=33.0 ms
64 bytes from gru06s25-in-f3.1e100.net (216.58.222.3): icmp_seq=2 ttl=61 time=33.0 ms
64 bytes from gru06s25-in-f3.1e100.net (216.58.222.3): icmp_seq=3 ttl=61 time=33.4 ms
--- google.com.br ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 33.029/33.186/33.433/0.230 ms
FIXME Tudo funcionando perfeitamente