DHCP com controle de IP e compartilhamento no Debian Squeeze

Introdução

Você deverá ter duas placas de rede instaladas no computador, que será o servidor DHCP.

Todo servidor deve ser configurado para iniciar automaticamente em caso de queda de energia. A configuração deve ser feita acessando-se o Setup do CMOS (o popular BIOS) da placa-mãe.

Geralmente, essa configuração está na aba “Power” ou “Energy” ou “Advanced” ou similar. A opção a ser configurada, geralmente, aparece como “Restore on AC Power Loss” ou similar.

Esta opção deve ser colocada como “Power on”. Isto fará com que a máquina seja reiniciada automaticamente. Com essa opção ligada (Power on), a placa-mãe detectará o retorno da energia e ligará a máquina automaticamente colocando o servidor em funcionamento.

1. Instalar o pacote DHCP como root:

# aptitude safe-upgrade
# apt-get update
# aptitude install isc-dhcp-server

Aguarde terminar a instalação. Deverá dar falha: “failed”, em vermelho – Isso é normal, uma vez que ainda não configuramos o DHCP.

Antes do próximo passo, você já deverá ter sua subnet (subrede) planejada com seus endereços IPs. O IP da placa de rede que irá servir o DHCP será também, automaticamente, o IP do gateway/compartilhamento da nossa configuração (no caso, a eth0).

Tecnicamente falando, quando fazemos o compartilhamento, não estamos transformando o GNU/Linux em um roteador, somente estamos compartilhando os dados de entrada de uma interface de rede com a(s) outra(s).

2. Configure os endereços IPs das placas de rede:

# vim /etc/network/interfaces

Não mexa nas linhas iniciais do arquivo. As configurações abaixo das linhas iniciais devem ficar como está abaixo.

* Lembrando que a placa de rede Onboard nem sempre é a eth0 e a Offboard nem sempre é a eth1.

O arquivo abaixo é somente o exemplo da nossa configuração:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The looback network interface
auto lo
iface lo inet loopback

# Primeira interface de rede – offboard
auto eth0
allow-hotplug   eth0
iface  eth0  inet  static
address  192.168.2.1
netmask  255.255.255.0
broadcast  192.168.2.255

# Segunda interface de rede – onboard
auto eth1
allow-hotplug  eth1
iface  eth1  inet  dhcp

Salve e saia do arquivo.

Os números de IPs devem estar de acordo com o arquivo /etc/dhcp/dhcpd.conf, que você mesmo irá configurar mais adiante.

A placa de rede que recebe a Internet é a eth1. Deixei ela com IP dinâmico. Caso queira fixar o IP da placa que recebe a Internet, no caso a eth1, ela deverá ter como gateway, o IP do roteador ADSL ou do roteador da rede.

* Lembrando que, no arquivo /etc/network/interfaces, você deve acrescentar todas as placas de rede que estiverem instaladas na máquina: eth0, eth1, eth2 e assim por diante.

3. Verifique também o arquivo /etc/resolv.conf, que deverá estar com um ou dois DNSs adicionados.

Exemplo:

# vim /etc/resolv.conf

Dentro do arquivo deverá ter:

domain xxxxxxxxxxxx
search xxxxxxxxxxxxx
nameserver xxx.xxx.xxx.xxx
nameserver xxx.xxx.xxx.xxx

Onde:

  • Em “domain” e “search”, os xxx são nomes de domínio (se houver);
  • Em “nameserver”, os xxx são números de IPs de DNS.

Caso não tenha nada no arquivo, acrescente o IP do Gateway (roteador) ou do DNS da rede (se houver). Este arquivo se renova a cada reinicialização da máquina. Se não tiver esse arquivot você deve ciá-lo:

# vim /etc/resolv.conf

E acrescentar, pelo menos, um “nameserver”. Na próxima reinicialização ele virá correto.

4. Para configurar o serviço DHCP, devemos alterar somente dois arquivos:

  • /etc/default/isc-dhcp-server
  • /etc/dhcp/dhcpd.conf

Entre no arquivo com o seu editor de texto favorito, o Nano, o Pico, o Vim, etc. Usarei o Vim como exemplo:

# vim /etc/default/isc-dhcp-server

Na linha onde diz:

INTERFACES=””

Coloque entre as aspas a interface de rede que irá responder pelo DHCP. Exemplo:

INTERFACES=”eth0

Salve e saia do arquivo.

5. Abra o arquivo /etc/dhcp/dhcp.conf:

# vim /etc/dhcp/dhcpd.conf

Comente as duas linhas que iniciam com “option domain” colocando um “#” na frente.

Procure a linha onde tem escrito:

# authoritative;

E se já não estiver sem, tire o “#” da frente.

Após, procure a linha onde diz:

# This is a very basic subnet declaration

Dê um ENTER colocando uma linha em branco e acrescente (antes leia abaixo a definição das linhas do arquivo):

subnet  192.168.2.0  netmask  255.255.255.0  {
range  192.168.2.5   192.168.2.125;
option  routers  192.168.2.1;
option  broadcast-address  192.168.2.255;
option domain-name-servers 192.168.2.2, xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx, 192.168.2.1;
}
deny unknown-clients;
ignore unknown-clients;
group servidores {
use-host-decl-names true;
host dhcp {
hardware ethernet xx:xx:xx:xx:xx:xx;
fixed-address 192.168.2.1;
}
host dns {
hardware ethernet xx:xx:xx:xx:xx:xx;
fixed-address 192.168.2.2;
}
}
group clientes {
use-host-decl-names true;
host maquina01 {
hardware ethernet xx:xx:xx:xx:xx:xx;
fixed-address 192.168.2.5;
}
}

Acrescente tantos quantos hosts forem necessários para você.

Na primeira linha definimos:

  • A nossa subrede: 192.168.2.0
  • E a máscara dessa subrede: 255.255.255.0

Escolhemos isso dentro das 3 faixas de IPs reservadas para redes internas privadas de acordo com a RFC 1918:

10.0.0.0-10.255.255.255
172.16.0.0-172.31.255.255
192.168.0.0-192.168.255.255

Definição:

  • Na linha “range”, definimos a nossa faixa e a quantidade de IPs que queremos que o DHCP distribua (depende do número de computadores que temos na rede). Esta linha deve ser comentada, caso as opções “deny unknown” e “ignore” estejam descomentadas, senão o DHCP continuará distribuindo IPs fora do cadastro dos grupos “servidores” e “clientes”.
  • Na linha “option routers”, definimos o IP do roteador que, no nosso caso, deve ser o mesmo da placa de rede que responde pelo DHCP, no caso, a eth0.
  • Na linha “option broadcast-address”, definimos o broadcast da rede.
  • Na linha “option domain-name-servers”, definimos, por primeiro, o DNS interno da rede (se houver) seguido de DNSs públicos e abertos (os xxx são endereços de IP de DNS públicos e abertos) e terminando sempre com o IP do gateway/roteador para redundância. Caso não tenha DNS interno na sua rede, retire o IP, no caso, 192.168.2.2 e o “host dns” não precisa ter.
  • As linhas “deny unknown-clients” e “ignore unknown-clients”, fazem com que o DHCP distribua IPs somente para as máquinas que estiverem com o MAC cadastrado nos grupos acima. Ao acrescentar os IPs com os MACs na tabela ARP através do arquivo /etc/ethers (abaixo) você deve comentar essas linhas colocando um “#” na frente delas.

* Importante: Se você deixar as linhas “deny …” e “ignore …” descomentadas, as máquinas clientes que estiverem com IP automático e não estiverem cadastradas, NÃO obterão IP e, logicamente, só navegarão se o IP for fixado manualmente na própria máquina.

No grupo “servidores” estamos fixando os IPs dos servidores através do MAC da placa de rede.

Para ver o MAC da placa de rede, execute ifconfig e veja o HW da placa de rede que responde pelo servidor e coloque ali em cima. Caso não haja DNS interno na rede, o “host dns” deve ser omitido.

No grupo “clientes”, definimos os IPs dos clientes através do MAC da placa de rede de cada máquina.

A opção GROUP serve para separar a configuração por grupos dentro da mesma rede/subrede. Por exemplo, você quer que um determinado grupo composto por algumas máquinas tenha uma configuração distinta de outro grupo ou do resto da rede e quer que usem, por exemplo, um outro gateway (option routers), ou qualquer outra configuração permitida a somente uma máquina pelo dhcpd.conf, você pode especificar isso através do “group” sem aplicar para toda a rede.

Salve e saia do arquivo.

Habilitando o compartilhamento

6. Compartilhando a conexão.

Criando o arquivo de configuração do IPtables:

# vim /etc/init.d/firewall.sh

Obs.: Aqui você pode dar o nome que quiser ao arquivo.

Dentro do arquivo coloque exatamente o seguinte:

#!/bin/bash
modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Onde:

  • A placa eth1 é a placa que recebe a Internet. Se a sua for a eth0, você deve colocar: -o eth0

    * Atente para isso: A interface que vai ali é SEMPRE a interface que recebe a Internet, ou seja, é nesta placa de rede que deverá ser conectado o “fio” de entrada dos dados/Internet.

  • A primeira linha é somente um comentário que identifica o interpretador de comandos, no caso o bash.
  • Na segunda linha estamos levantando o módulo de compartilhamento.
  • Na terceira linha estamos ativando o compartilhamento.
  • Na quarta linha estamos dizendo para o IPtables que tudo que entrar pela placa de rede eth1, deve ser compartilhado com as outras placas de rede do computador.

Salve e saia do arquivo.

É uma configuração extremamente básica e sem segurança nenhuma. Para maior aprofundamento, estude as regras do IPtables.

Vamos transformar o arquivo que criamos em um arquivo executável:

# chmod +x /etc/init.d/firewall.sh

Agora vamos fazer com que esse arquivo seja executado automaticamente na inicialização. Entre no arquivo “rc.local”:

# vim /etc/rc.local

Logo acima da linha “exit 0”, coloque o caminho para o arquivo, ficando assim:

/etc/init.d/firewall.sh   start
exit   0

Salve e saia do arquivo.

7. Reinicie o sistema:

# shutdown -r now

Com isso, o servidor deverá estar fazendo o compartilhamento e servindo endereços IPs para a rede local (Lan).

A lógica é a seguinte: A Internet entra por uma placa de rede, o sistema “pega” essa Internet e através do arquivo do IPtables, faz com que ela seja distribuída para as outras placas de rede, não importando quantas mais tenha na máquina.

Para remover completamente o serviço de DHCP da máquina, se for o caso, execute:

# apt-get purge isc-dhcp-server

Depois coloque todas as placas de rede com IP automático (DHCP) e reinicie:

# shutdown -r now

Daí é só reinstalar o serviço e fazer as configurações novamente.

Controle de IPs pela tabela ARP

8. Para evitar que algum cliente acesse a Internet fixando manualmente o IP na sua máquina, devemos acrescentar na tabela ARP os IPs, criando o arquivo /etc/ethers:

# vim /etc/ethers

Coloque dentro do arquivo o IP e o MAC da seguinte maneira, um por linha:

192.168.2.2   xx.xx.xx.xx.xx.xx
192.168.2.3   xx.xx.xx.xx.xx.xx

E assim por diante.

Você pode também preencher com MACs falsos, os IPs que não estão em uso, por exemplo:

192.168.2.126   00:00:00:ff:ee:11

Ficaria assim o arquivo /etc/ethers:

192.168.2.5   xx.xx.xx.xx.xx.xx
192.168.2.6   xx.xx.xx.xx.xx.xx
192.168.2.126   00:00:00:ff:ee:11
192.168.2.127   00:00:00:ff:ee:11

* Lembrando que os IPs que não estão em uso, são os que não estão cadastrados nos grupos “servidores” e “clientes”.

Se você tem uma faixa de IPs classe C (recomendada para estes casos), então são 253 linhas para você colocar no /etc/ethers, entre IPs em uso e não-uso. O endereço do gateway, da rede e do broadcast não é necessário colocar.

Agora, precisamos carregar o arquivo /etc/ethers na tabela ARP durante a inicialização. Entre no arquivo /etc/rc.local e coloque “arp -f” acima da linha exit 0:

/etc/init.d/firewall.sh   start
arp -f
exit 0

Para o controle de MAC por ARP funcionar, o servidor GNU/Linux terá que ser o gateway da rede, ou seja, deverá haver o compartilhamento.

E, não esqueça, quando a linha “range” estiver descomentada, as linhas “deny…” e “ignore…” devem estar comentadas e vice-versa.

Assim, se alguém não cadastrado no DHCP fixar manualmente um IP na máquina, mesmo estando dentro da faixa de rede utilizada, a máquina não navegará na Internet.

Você pode fazer esse controle de IPs por MAC também pelo IPtables, porém, tendo muitas máquinas na rede tornará o servidor um pouco lento. É preferível fazer pela tabela ARP.

Rolar para cima