terça-feira, 23 de setembro de 2008

CIDR: Uma Receita Para a Diminuição do Espaço de Endereçamento

Artigo originalmente publicado em Linux Journal, edição de dezembro de 1998.
Explica o conceito do CIDR e mostra como você pode implementá-lo na sua rede.


Introdução

CIDR, Classless Inter-Domain Routing, ou Roteamento Inter-Domínios Sem-Classe, permite o uso maximizado do limitado espaço de endereçamento na atual implementação do Internet Protocol versão 4 (IPv4). Após ler este artigo, mesmo se você nunca configurou um computador para comunicação em rede antes, você passará a ter um bom embasamento destas referências sobre redes de computadores.


Histórico

O CIDR é a tendência atual em roteamento e tem sido por mais de três anos. Este conceito foi apresentado em 1993 para retardar o encolhimento da quantidade de endereços Internet Protocol (IP) até a chegada da próxima geração do IP (IP versão 6, também conhecido como IPng ou IP next generation).

Atualmente em testes, o IPng expandirá significativamente o espaço de endereçamento IP em várias ordens de magnitude. O IPng também terá suas próprias características avançadas de segurança. Os que desejarem participar do futuro hoje podem ter a oportunidade de fazê-lo, uma vez que o Linux possui suporte para IPng em seu kernel. Até que o IPng esteja disseminado em larga escala, fazendo o melhor uso possível do que temos disponível, o CIDR é tudo com o que podemos contar.

Para ajudar a entender por que precisamos do CIDR, vamos voltar ao início da década de 90. O IPv4, o protocolo usado pelos computadores para se comunicar em uma rede estava então em uso, mas não havia muitas conexões com a Internet ou máquinas que precisassem de conexões esta rede. Na verdade, um grande número de sistemas ainda dependiam do UUCP, o UNIX to UNIX Copy Protocol, onde as máquinas faziam "chamadas" umas para as outras em horários programados e faziam trocas de mensagens de correio eletrônico. Naquele tempo, a quantidade de endereços IP parecia ilimitada. Esta foi mais ou menos a época em que surgiu o Mosaic, o primeiro navegador (browser) Web.


IP básico

Aqueles que se considerarem bem versados em roteamento classful, podem desejar pular para a próxima seção. Computadores compreendem números na base 2 (uns e zeros), e humanos compreendem na base 10 (0 a 9); então os engenheiros desenvolveram uma forma de dar números (de identificação) para os computadores mas com facilidade de uso por humanos. Todos os computadores na Internet têm um único endereço IP que pode ser representado por uma cadeia (string) de zeros e uns. Se a cadeia é dividida em quatro grupos de oito bits (octetos), temos quatro números entre 0 (oito zeros) a 255 (oito uns), que são representados no formato XXX.XXX.XXX.XXX. Esta representação é chamada "notação decimal separada por pontos" (dotted decimal notation) e torna um pouco mais fácil a compreensão de cada número IP único pelos humanos. Estes endereços foram então subdivididos em classes "A" a "D". Observando a primeira metade do primeiro octeto:

Classe A = 0-127 (0000)
Classe B = 128-191 (1000)
Classe C = 192-223 (1100)
Classe D = o resto (1110)

As posições começando a partir da esquerda representam 128, 64, 32 e 16 - veja a Tabela 1.

0 = 00000000
128 = 10000000
192 = 11000000
224 = 11100000
240 = 11110000
248 = 11111000
252 = 11111100
254 = 11111110
255 = 11111111

Tabela 1 - Equivalência entre números Decimais e Binários

Além disso, a Classe A usa somente o primeiro número como número da rede, por exemplo, 10.XXX.XXX.XXX; a Classe B usa os dois primeiros números como o número da rede, por exemplo, 172.32.XXX.XXX; a Classe C usa três números como número da rede, por exemplo, 192.168.1.XXX e a Classe D é reservada para testes. Pode-se pensar em um endereço como tendo uma parte rede e uma parte host, representadas por números e XXXs, respectivamente. Para um endereço Classe C, a porção da rede consiste dos três primeiros octetos sendo o último octeto o que representa a porção de hosts.

Os seguintes conceitos relativos a redes de computadores precisam ser compreendidos. Note que as "definições" apresentadas são com a finalidade de ajudar a compreensão dos conceitos básicos usados neste artigo e não são as suas reais definições.

· endereço de host (host address): Um endereço único designado a um dispositivo de comunicações em um computador. Se um computador tem vários dispositivos de comunicação (p.ex., interface Ethernet ou modem), cada um destes dispositivos terá seu próprio número único. Isso significa que um host (computador ou roteador) pode ser multi-homed, p.ex., ter múltiplos endereços IP. Isto pode ser feito artificialmente designando diferentes endereços IP a um mesmo dispositivo (técnica conhecida como "IP falso" ou "apelido IP").

· endereço de rede (network address): O endereço base (mais baixo) designado a um segmento de rede, dependendo da sua máscara. Este é o primeiro número IP em uma subrede. Por exemplo, na rede Classe C que vai de 192.168.1.0 a 192.168.1.255, o endereço de rede seria 192.168.1.0.

· endereço de broadcast (broadcast address): O endereço mais alto designado a um segmento de rede. No exemplo acima, este endereço seria 192.168.1.255.

· máscara de rede (netmask): Uma máscara consistindo da porção do endereço IP onde todos os maiores bits são uns (na base 2) e todos os bits mais baixos são zeros - em outras palavras, os uns representam a porção da rede do endereço e os zeros representam a porção host. No exemplo acima, a máscara de rede seria 255.255.255.0.

Feita esta introdução a endereçamento IP e lembrando que uma década atrás quase nenhum PC participava desta rede, é fácil ver porque durante os anos 80 o IPv4 pareceu ter um suprimento inesgotável de endereços, embora nem todos os endereços possam ser designados. Teoricamente, se você pudesse usar todos os endereços IP válidos disponíveis, teria um valor máximo aproximado de 500 milhões de endereços; porém mesmo 100 milhões é extremamente otimista e insuficiente para os dias atuais.

Antes de finalizar esta seção, gostaria de descrever uma experiência. Esta experiência não funcionará adequadamente se for feita em um ambiente composto apenas por máquinas usando somente a pilha IP do Microsoft Windows, uma vez que esta implementação é falha, ou pelo menos não segue as regras pelas quais todo o resto do mundo joga. Então, você vai precisar estar usando uma máquina UNIX ou Linux com outras máquinas UNIX ou Linux na sua rede. Digite o seguinte comando:

ping -c 1 broadcast da sua rede>

O que você verá em resposta é cada máquina UNIX respondendo com o seu endereço IP e cada resposta seguinte à primeira terá (DUP!) ao lado, indicando que é uma resposta duplicada. O argumento -c 1 diz ao ping para enviar somente 1 pacote ping. O número de respostas recebidas dependerá de quantas máquinas (não-Microsoft) você tiver na sua rede. Se isso for feito a partir de uma máquina rodando MS Windows (9x ou NT), você receberá somente respostas da máquina local. Qual é o objetivo deste pequeno experimento? Se você mudar a máscara de rede de uma máquina, digamos, de 255.255.255.0 para 255.255.0.0 através disso mudando seus endereços de rede e de broadcast, mesmo que nada mais tenha mudado (p.ex., ainda esteja com o mesmo IP configurado e ainda esteja conectada à rede da mesma forma) a máquina irá parar de se comunicar com seus vizinhos pela rede. Em outras palavras, esta máquina agora está em outra rede e vai precisar de um gateway para se comunicar com as outras máquinas na rede local (todas as apostas estão fora para as máquinas com Windows).



CIDR

Enquanto as classificações IP de A a D ainda estão em uso no mundo das redes, estes termos estão obsoletos. Com o intuito de manter as coisas claras, continuarei a usar estes termos para explicar como o CIDR funciona e como você pode implementá-lo. Junto com o CIDR vem o conceito de máscara de subrede com comprimento variável (variable lenght subnet masking - VLSM).



Note que, uma vez que estamos lidando com 32 números, podemos contar o número de bits com valor igual a 1 a partir da esquerda e usar isto como uma abreviação para endereçamento:
255.255.0.0 = /16 255.255.128.0 = /17 255.255.255.0 = /24 255.255.255.128 = /25 255.255.255.192 = /26 255.255.255.224 = /27 255.255.255.240 = /28


Um diagrama para traduções CIDR:

máscara A B C # redes .0 /8 /16 /24 1 0 .128 /9 /17 /25 2 0-128 .192 /10 /18 /26 4 0-64-128-192 .224 /11 /19 /27 8 0-32-64-96-128-160-192-224 .240 /12 /20 /28 16 0-16-32-48-64-80-96-112-128-144-160-\ 176-192-208-224-240 .248 /13 /21 /29 32 0-8-16-24-32-40-48-56-64-72-80-88-96-\ 104-112-120-128-136-144-152-160-168-\ 176-184-192-199-208-216-224-232-240-248 .252 /14 /22 /30 64 0-4-8-12-16-20-24-28-32-36-40-44-48-\ 52-56-60-64-72-76-80-84-88-92-96-100-\ 104-108-112-116-120-124-128-132-136-\ 140-144-148-152-156-160-164-168-172-\ 176-180-184-188-192-196-200-204-208-\ 216-220-224-228-232-236-240-244-248-252 .254 /15 /23 N/A 128 .255 N/A N/A /32

O número em máscara refere-se ao primeiro número
!=255


A, B e C referem-se à posição da máscara

A = segundo octeto B = terceito octeto C = octeto final

#= diferença do número de redes para os endereços classful
redes= endereços de rede a serem usados nos 2º, 3º ou 4º octetos. Para obter o endereço de broadcast de uma rede, vá até o próximo número de rede maior e subtraia 1, p.ex.:

netmask = 255.240.0.0 network = 10.16.0.0 (10.16/12) broadcast = 10.31.255.255


Basicamente, com um endereço de "Classe", você tem uma máscara de sub-rede padrão. Para um endereço Classe C, esta sub-rede padrão tem comprimento de 24 bits, então colocando uns em todos os primeiros 24 bits e zeros nos restantes, temos 255.255.255.0. Para as Classes A e B, seria 255.0.0.0 e 255.255.0.0, respectivamente. Isto basicamente designa a qualquer que tenha recebido um endereço Classe C completo, 256 endereços únicos, dos quais 2 são reservados, cada para endereços de rede e de broadcast. Usando endereços "classless", podemos fazer sub-redes com esses endereços de forma simples. Como afirmado acima, a porção rede do endereço equivale à porção do endereço IP, correspondente em base 2, a todos os bits com valor 1 e o endereço de host ao todos os bits com valor 0. Isso significa que um endereço Classe C se parece com:

11111111.11111111.11111111.00000000 = 255.255.255.0

(128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 nas primeiras 3 posições e 0 na última). Novamente, note que isto é 24 números 1 e oito zeros, totalizando 32 posições.

Digamos que temos um endereço Classe C (192.168.0.1) disponível para uso, mas temos 2 escritórios com aproximadamente 75 hosts em cada, um em Nova Iorque e outro em Nova Jérsei. Enquanto poderíamos estar usando simplesmente o endereço Classe A em cada site com cada escritório usando números únicos, não podemos conectá-los porque as máquinas em Nova Jérsei não conseguem encontrar as de Nova Iorque e vice-versa. A razão pela qual estas redes não podem encontrar uma à outra é porque um computador, para encontrar outro em uma rede, assume que um endereço em sua rede local (a porção host, onde todos os números são zeros) está diretamente conectado a ela, e que outra rede é alcançável somente através de um gateway. Um gateway é uma máquina (computador ou roteador) que possui dois ou mais endereços de rede, pelo menos um na rede local e um ou mais em outras redes. Um gateway envia qualquer comunicação que não seja para a rede local através de seus outros dispositivos de comunicações, dependendo da informação armazenada em sua tabela de roteamento. Sob roteamento classful, precisaríamos de 2 endereços Classe C usados pela metade para cada escritório, o que seria um grande desperdício dos escassos endereços IP.

Com CIDR, podemos dividir um endereço Classe C em duas redes diferentes. Para fazer isso, vamos estender nossa máscara de rede em mais um bit, o que vai nos fornecer 2 redes separadas, onde antes só havia uma. Isso muda nossa máscara de rede de 255.255.255.0 ou 24 números 1 (daqui pra frente referidos como /24) para uma rede /25, ou 255.255.255.128. Ambas as nossas novas redes possuirão a mesma máscara de rede; todas as outras regras permanecem as mesmas. Agora temos uma rede com o endereço de rede 192.168.1.0 e um endereço de broadcast 192.168.1.127. A outra rede irá usar o endereço de rede 192.168.1.128 e o endereço de broadcast 192.168.1.255.
Da mesma maneira, podemos continuar partindo nossa rede em 4, 8, 16, 32, ..., redes. Na verdade, iniciando em /8, podemos partir até alcançarmos /30. Uma vez que temo 32 números para trabalhar, um /32 representa apenas 1 endereço, e neste caso em especial, não há necessidade para endereços de rede ou broadcast. Isso também significa que um /31 representa 2 endereços, mas uma vez que um seria o endereço de rede e ou outro o endereço de broadcast, ficaríamos sem endereços para hosts - uma situação quase certamente indesejável.

Neste esquema, o primeiro octeto da máscara de rede permaneceria 255, mas depois disso poderíamos mudar qualquer dos outros números. Ao invés de ficar restritos a 255 e 0, podemos nos encontrar trocando o primeiro zero na nossa máscara de rede por qualquer número dos seguintes: 128, 192, 224, 240, 248, 252 ou 254, exceto no último octeto como observado acima. Os endereços de rede e broadcast unificariam cada subede (veja a Tabela 2 para maiores detalhes). Agora, qualquer rede pode ser referenciada pela sua máscara de subrede de comprimento variável, ou o número de bits com valor igual a 1 na porção host do endereço de /8 a /32 (exceto /31). Extrapolando, cada host pode ser referenciado diretamente pelo seu endereço IP e a notação VLSM, de forma que fique bem aparente quais são os endereços de rede, broadcast e a máscara de rede.

Por exemplo, se alguém me disser para designar para minha máquina o endereço 192.168.0.50/27, eu saberia que o endereço de rede era 192.168.0.32,o endereço de broadcast era 192.168.0.63 e a máscara de rede 255.255.255.224. Para aqueles de vocês que ainda têm problemas em como traduzir tudo isto, forneci uma tabela para ajudar (Tabela 3).
Você encontrará mais usos para endereçamento classless que este. O CIDR também pode te oferecer uma forma para isolar departamentos em grandes organizações para fornecer melhor segurança (implementando-se firewalls internos) e diminuindo o tráfego em qualquer segmento de rede, reduzindo colisões e melhorando os tempos de resposta.


Grupos de endereços privados

Outra maneira que muitas empresas podem expandir seu conjunto de endereços IP utilizáveis é tirando vantagem dos endereços IP privados separados para empresas e indivíduos que não precisam de acesso direto à Internet em todas as suas máquinas. Estes números podem ser usados como melhor lhes convier.

Usando um firewall ou servidor proxy, que faça tradução de endereços de rede (NAT - Network Address Translation), chamado de "masquerading" pela comunidade Linux, estas máquinas ainda podem ser conectadas à Internet. O lado interessante é que que você não estará roteando endereços internos da empresa para a Internet, uma vez que a maioria dos roteadores são configurados para não rotear estes endereços de rede privados. Desta forma, ninguém pode acessar diretamente seus sistemas, então perigosos Web sites espalhados em sua empresa não vão voltar para assombrar você. Para qualquer um acessar um computador interno, terá que acessar primeiro o servidor proxy e depois continuar o acesso, ou ser redirecionado pelo mesmo até a máquina destino.

A referência para os endereços que podemos usar sem coordenação prévia é a RFC 1918, "Address Allocation for Private Internets", fevereiro de 1996. Estes endereços privados são os seguintes (extraídos da RFC):

10.0.0.0 - 10.255.255.255 (prefixo 10/8) 172.16.0.0 - 172.31.255.255 (prefixo 172.16/12) 192.168.0.0 - 192.168.255.255 (prefixo 192.168/16)

Note que, sob o antigo endereçamento classful, enquanto o primeiro segmento de endereço é uma rede Classe A, o segundo seriam 16 redes Classe B e o último 256 redes Classe C. Implementando um gateway Linux e configurando algumas regras simples no ipfwadm (geralmente disponível em todas as distribuições Linux), podemos fazer masquerading ou tradução de endereços de rede (NAT), oferecendo acesso Internet completo aos computadores com endereços de rede privados a menos que uma de duas coisas aconteça. Uma seria o administrador configurar o gateway para trabalhar como servidor proxy, intermediando requisições em uma determinada porta para um computador em particular; outra seria, pela Internet, um usuário usando TELNET para acessar a máquina gateway primeiro e depois os computadores internos. Desta forma, os endereços privados continuam privados.

Estes grupos de endereços também podem ser usados em redes privativas que "pegam carona" na Internet. Usando dois endereços IP "vivos" (não-privados), um em cada máquina gateway de cada rede, podemos conectar duas redes privadas usando o IPIP do Linux, que é IP tunelado dentro de IP. Enquanto isso não oferece privacidade, a menos que os dois gateways estejam executando algum programa de criptografia como o SSH (secure shell), pode oferecer uma rede virtual.


Conclusão

Enquanto os endereços Internet válidos estão se tornando escassos, empresas e indivíduos podem maximizar o uso do seu atual espaço de endereçamento e até mesmo expandir seu espaço através do uso de endereços privados. CIDR também pode ser usado para melhorar a segurança e aumentar o tempo de resposta da rede através do uso de subredes.

Mantendo-se atualizado com as tendências em coisas como CIDR e software de rede do Linux, a maioria dos obstáculos para conectividade Internet e Intranet podem ser facilmente contornados. Como o CIDR oferece a todos uma forma de maximizar o pouco que temos, endereços privados nos permitem a flexibilidade para expandir além dos endereços fornecidos pelos nossos Provedores de Serviços Internet.


Referências bibliográficas
RFC 1918
Address Allocation for Private Internets
ftp://ftp.isi.edu/in-notes/rfc1918.txt

Nenhum comentário: