programas para manuseio de arquivos e invasao de dados, sendo necessario mascaras de burlwe para ,nao dectacao de ip. toda ´pratica de acesso a comp. alheios é de toda responsabilidade de qem a pratica . nao resposabilizado pelo fornecedor do arquivo, informamos qe procure saber muito bem programacao e manuseio de link de redes (trafego para efetuar o mesmo ).procure efetuar antes em meros bobos . para qem sabe efetuar em mcros comp. efetuar criacao de invasores por compilacao e camuflagem de trojan , hamachi. temida. best.satan.brutuus,telnet:um dos principais para acesso remoto . saber usalo de grande valia. saber comandos de cmd . protecao de redes . a sua mesma para nao ser descoberto ;e nao ser likado . ou nukado .se conseguir baixar:protheus é otimo destrui dor de site. mais dificil de encontrar junto com hidra(assembly). o programa de anonimos tambem e bom o orbit ,mais traz em sim um virus de log . para remotamente te vistoriar . thc scan é otimo para aquele qe e esperto e ambicioso . é para poucos,pois e por tom de discagem para conf qe aceita e apos invasao por ip . em comandos.
https://www.metropoledigital.ufrn.br/aulas_avancado/web/disciplinas/desenv_web/aula_02.html
Mapeamento é a associação de uma pasta compartilhada em uma rede de computadores a uma letra de unidade disponível em um computador local. Pois alguns usuários devem acessar as mesmas unidades e pastas compartilhadas com freqüência. Embora a unidade ou a pasta compartilhada possa ser facilmente acessada quando pesquisada em Meus locais de rede, essa tarefa pode tornar-se desnecessariamente repetitiva para a conexão com compartilhamentos comuns.
Para simplificar o processo de pesquisa de unidades e pastas compartilhadas, você pode estabelecer uma conexão semipermanente com um recurso compartilhado, mapeando-o no Windows Explorer. Esse recurso mapeado é conhecido como unidade mapeada ou unidade de rede. Após mapear um recurso, você poderá acessá-lo da mesma forma que acessaria um volume local.
Para mapear uma unidade de rede você deve fazer o seguinte:
No Windows Explorer, clique em Ferramentas e, em seguida, clique em Mapear unidade de rede. Escolha uma letra de unidade disponível para atribuir ao compartilhamento e na caixa Pasta, digite o caminho da pasta compartilhada (por exemplo,ComputerDicasusers). Marque a opção Reconectar-se durante o Logon e clique emConcluir.
Máquinas virtuais
Terminal remoto
Captura de pacotes
Protocolo ARP: Mapeando endereços de Rede para endereços de Enlace.
Protocolos TCP e UDP
Tradução de endereços de rede - NAT
Protocolo DHCP: distribuindo automaticamente configurações IP para as estações em uma LAN
Sistema de Nomes de Domínio (DNS)
Autenticação e compartilhamento de arquivos – Parte I
Autenticação e compartilhamento de arquivos: parte II
Autenticação e compartilhamento de arquivos: parte III
Web: protocolo HTTP e servidor Apache
Proxy e servidor Squid
Correio eletrônico
Gerenciamento de redes – SNMP, RMON e CACTI
Voltar
Imprimir
Topo
Redes de Computadores
Aula 4 – Protocolo ARP: Mapeando endereços de Rede para endereços de Enlace.
Autores:
Marcos Cesar Madruga Alves Pinheiro (Professor)
Carlos Markennede Crescêncio deLima (Assistente)
Renato Gondim Sarmento (Assistente)
João Paulo Confessor (Assistente)
Contato:
marcos@dimap.ufrn.br
markennedy@dimap.ufrn.br
joaopaulo@dimap.ufrn.br
renato@dimap.ufrn.br
Nesta aula você aprenderá um protocolo que é de fundamental importância para que a pilha de protocolos TCP/IP possa ser utilizada com qualquer tecnologia de rede física, como Ethernet ou as redes sem fio 802.11, por exemplo. Verá que este protocolo se chama ARP (Address Resolution Protocol, ou seja, Protocolo de Resolução de Endereços), e tem como principal função descobrir o endereço MAC da máquina para qual um dado pacote IP deve ser entregue. Você aprenderá porque isso é necessário e como essa tarefa é realizada.
• Aprender que o protocolo ARP é utilizado para traduzir endereços de rede para endereços de enlace, e que normalmente traduz um endereço IP para um endereço Ethernet.
• Entender por que a tradução de endereços de rede para endereços de enlace é necessária.
• Entender como a tradução de endereços de rede para endereços de enlace é realizada.
• Utilizar uma ferramenta para monitorar o processo de tradução de endereços.
Por que o protocolo ARP é necessário
Você sabe que nas redes que utilizam o protocolo IP, como é o caso da Internet e da maioria das redes das empresas atualmente, os dados são transmitidos entre as máquinas em pacotes IP, e que cada pacote contém o endereço IP da máquina que está enviando o pacote e o endereço IP da máquina para a qual ele deve ser entregue. A Figura 1 mostra o pacote IP que é gerado quando uma máquina A quer enviar dados para uma máquina C. Naturalmente os demais campos do cabeçalho IP e os cabeçalhos das camadas de transporte e de aplicação foram omitidos.
Figura 1 - Transmissão usando um pacote IP
Acontece, como você também já sabe, que não existe nenhuma placa de rede que fale IP, que é um protocolo da camada de rede. As placas de rede implementam a camada de enlace, portanto, comunicam-se enviando quadros no formato definido pela sua tecnologia, como, por exemplo, Ethernet ou 802.11. Naturalmente, do mesmo modo que os pacotes IP contêm campos para os endereços IP, os quadros também contêm os endereços de enlace (chamados endereços MAC) da máquina que gerou o quadro e da máquina para a qual ele deve ser entregue. Lembre-se de que endereço MAC é o mesmo que endereço da placa de rede.
O pacote IP é transmitido dentro da parte de dados do quadro utilizado pela placa de rede. Assim sendo, para que o pacote IP seja entregue à máquina desejada, precisamos colocar no campo de endereço MAC de destino do quadro o endereço MAC da máquina que possui o IP com quem queremos falar. O problema é que o usuário não sabe o endereço MAC da máquina com quem quer falar, ele conhece apenas o endereço IP dela! A Figura 2 mostra como o pacote IP da Figura 1 realmente precisaria ser transmitido. Vamos assumir que a rede utilizada é da tecnologia Ethernet.
Figura 2 - Enviando um pacote IP dentro do Ethernet
Veja que o campo Endereço Ethernet de origem é preenchido com o endereço da placa de rede da máquina local (de onde o pacote será enviado), mas o endereço Ethernet de destino não é conhecido. Portanto, é necessário que exista algum mecanismo automático para se descobrir o endereço Ethernet associado a um endereço IP. Esse mecanismo existe e é o ARP (Protocolo para Resolução de Endereços, do inglês Address Resolution Protocol).
Embora o ARP seja um protocolo genérico que é capaz de traduzir endereços de qualquer protocolo de rede para endereços de qualquer protocolo de enlace, normalmente seu uso mais frequente é traduzir endereços IP para endereços Ethernet, ou endereços IP para endereços MAC 802.11 nas redes sem fio.
Nos nossos exemplos iremos utilizar a tradução de endereços IP para Ethernet, mas os mesmos procedimentos explicados se aplicam para outros protocolos e tecnologias de enlace.
Em nossos exemplos utilizamos endereços Ethernet que tenham algo em comum com o endereço IP da máquina, para que fique mais fácil de você lembrar. O último byte do endereço Ethernet, por exemplo, normalmente será igual ao último byte do endereço IP. Mas lembre-se de que, na realidade, os endereços Ethernet não mantêm nenhuma relação com o IP. Quando você compra uma placa de rede ela já tem seu endereço Ethernet!
Para finalizar esta seção, veja na Figura 3 onde o protocolo ARP se situa na pilha de protocolos TCP/IP.
Figura 3 - Posição do ARP na pilha de protocolos TCP/IP
Funcionamento do ARP
Vamos agora entender como o ARP consegue descobrir o endereço Ethernet associado a um endereço IP. Antes dessa explicação é importante que você se lembre que uma máquina pode enviar um quadro Ethernet para uma única outra máquina ou para todas as outras máquinas da rede. No primeiro caso, o endereço da placa de rede da máquina de destino é colocado no campo de endereço de destino do quadro, e este quadro é entregue apenas à máquina de destino. No seguindo caso, o campo endereço de destino do quadro é preenchido com o endereço especialFF:FF:FF:FF:FF:FF, chamado “Endereço de Broadcast”, fazendo com que o quadro seja entregue a todas as máquinas da rede.
O ARP se aproveita dessa capacidade de enviar um quadro para todas as máquinas da rede para resolver o seu problema de forma muito simples. Ele apenas envia uma mensagem em broadcast (ou seja, para todas as máquinas da rede) dizendo: “Por favor, quem tem o endereço IP X.X.X.X, informe qual é seu endereço Ethernet”. Evidentemente, X.X.X.X é substituído pelo endereço IP para o qual ela quer descobrir o Ethernet. Como todas as máquinas recebem esta pergunta, a máquina que tiver o endereço IP X.X.X.X responde informando seu Ethernet. É importante observar que essa resposta não é enviada em broadcast! Ela é enviada diretamente para quem fez a pergunta. Isso é possível porque o endereço de quem fez a pergunta está no quadro Ethernet que o destino recebeu, no campo endereço de origem.
A mensagem ARP é transmitida dentro da parte de dados do Ethernet, portanto, o campo tipo do quadro Ethernet contém o código do protocolo ARP, que é 0x0806 (em hexadecimal). Além disso, naturalmente, o pacote IP só será transmitido após o envio do quadro ARP e do recebimento da resposta. Ainda sobre o valor do campo tipo, nos nossos exemplos, quando mostrarmos um quadro utilizaremos a palavra “ARP” ao invés do código numérico, pois fica mais fácil de entender. Mas lembre-se que de fato é utilizado o valor numérico!
A Figura 4 mostra como ocorre a comunicação mostrada na Figura 2, onde a máquina 10.1.1.1 quer transmitir um pacote IP para a máquina 10.1.1.3, e, para isso, utiliza o ARP para descobrir seu endereço Ethernet. Na Figura 4(a) a máquina “A” envia uma mensagem ARP em broadcast perguntando quem tem o IP 10.1.1.3. Veja que o campo tipo do quadro Ethernet contém a identificação do protocolo ARP, e que todas as outras máquinas da rede, no caso, B e C, recebem o quadro, uma vez que ele foi enviado para o endereço de broadcast (FF:FF:FF:FF:FF:FF).
Figura 4(a) - Envio de requisição ARP para descobrir o endereço Ethernet
Na Figura 4(b) vemos que apenas a máquina C responde à mensagem ARP, pois ela possui o endereço IP para o qual se deseja descobrir o endereço Ethernet. As outras máquinas, no caso a máquina B, descartam a mensagem ARP. Você pode observar ainda que apenas a máquina A recebe esta resposta, pois o quadro é enviado diretamente para o seu endereço (AA:AA:AA:01:01:01).
Figura 4(b) - Envio de resposta ARP informando o endereço Ethernet
Finalmente, na Figura 4(c), vemos que após receber a resposta ARP informando qual é o endereço Ethernet (AA:AA:AA:00:00:03) associado ao endereço IP de C (10.1.1.3), o pacote IP que precisa ser enviado para ela é colocado dentro de um quadro Ethernet e enviado.
Figura 4(c) - Envio do pacote IP após utilização do ARP
1. Quais os endereços colocados nos camposendereço de origem e endereço de destino de um quadro Ethernet contendo uma mensagem de requisição ARP?
2. Qual o valor do campo de tipo de um quadro Ethernet contendo uma mensagem de resposta ARP?
Formato das Mensagens ARP
Na seção anterior nós descrevemos as mensagem ARPs contendo apenas dois campos: um para o endereço IP e outro para o endereço Ethernet. Na verdade, como o ARP pode funcionar com vários protocolos de camada de rede e vários protocolos de camada de enlace, as mensagens ARP possuem campos para identificar quais protocolos são utilizados.
Antes de vermos esses campos, saiba que existem apenas dois tipos de mensagem, uma para perguntar pelo endereço Ethernet associado a um IP, chamada ARP Request, e outra, chamada ARP Reply, para responder essa requisição, onde a máquina informa o Ethernet associado ao IP. Além disso, as duas possuem exatamente os mesmos campos, sendo diferenciadas pelo valor contido em um dos campos do quadro, que indica o tipo de operação. A Tabela 1 mostra os campos de uma mensagem ARP e o significado de cada um.
Nome do Campo Tamanho
(em bytes) Descricao
Tipo Hardware 2 Código da tecnologia da camada de enlace (Ex: Ethernet. 0x0001 - hexadecimal)
Tipo Protocolo 2 Código do Protocolo de Rede (Ex: IP. 0x0800 - hexadecimal)
Tam End. Hw 1 Tamanho do endereço de enlace (em bytes). Se for Ethernet, contém o valor 6.
Tam End. Proto 1 Tamanho do endereço de Rede (em bytes). Se for IP, contém o valor 4.
Operação 2 Código do tipo de mensagem: 0x0001 para o ARP Request, 0x0002 para o ARP Reply.
Endereço Hardware Origem - Endereço de Enlace da origem. O tamanho deste campo é o valor do campo “Tam End. Hw”
Endereço Protocolo Origem - Endereço de Rede da origem. O tamanho deste campo é o valor do campo “Tam End. Proto”
Endereço Hardware destino - Endereço de Enlace da origem. Se for Ethernet, o tamanho é 6 bytes.
Endereço Protocolo Destino - Endereço de Enlace da origem. Se for IP, o tamanho é 4 bytes.
Tabela 1 - Campos do quadro ARP
Para entendermos melhor como os campos de endereço são utilizados, vamos ver os valores que realmente são enviados nos campos de endereço das mensagens ARP trocadas entre as máquinas A e C do exemplo mostrado na sessão anterior – Figuras 3(a) e 3(b). As duas mensagens são enviadas em quadros Ethernet contendo no campo de tipo o código do ARP (0x0806 – Hexadecimal), sendo que o ARP Resquest é enviado para o endereço de broadcast Ethernet, enquanto o ARP reply é enviado diretamente para o endereço Ethernet de A.
Arp Request
Enviada por A ARP Reply
Enviada por C
Endereço Hardware Origem AA:AA:AA:00:00:01 AA:AA:AA:00:00:03
Endereço Protocolo Origem 10.1.1.1 10.1.1.3
Endereço Hardware destino 00:00:00:00:00:00:00 AA:AA:AA:00:00:01
Endereço Protocolo Destino 10.1.1.3 10.1.1.1
Tabela 2 - Valores dos campos de endereço para a comunicação entre A e C
Observe que no ARP Resquest o endereço IP de origem é preenchido com zeros, pois é exatamente este endereço que desejamos descobrir.
1. Em um quadro que contém uma mensagem ARP, qual campo devemos olhar para saber se é uma mensagem ARP Request ou ARP Reply?
Cache ARP
Embora o modelo descrito na seção anterior resolva o problema da resolução de endereços, ele apresenta dois efeitos colaterais negativos. O primeiro ocorre pelo fato de enviar mensagens pela rede, pois isso faz com que haja um tempo (atraso) até que a resposta do ARP chegue, causando um atraso no envio do pacote que se deseja transmitir. O segundo efeito negativo se deve ao fato das mensagens serem transmitidas a todas as máquinas na rede. Isso aumenta o volume de tráfego nessa rede, podendo levar a uma redução no seu desempenho. O ideal é que a maior parte da capacidade de transmissão de uma rede seja destinada aos dados das aplicações dos usuários. Quanto mais informações para outras finalidades a rede transmitir, como é o caso do ARP, menos banda de rede sobre para os usuários.
Para minimizar os dois problemas citados, o ARP utiliza uma tabela (chamada de cache arp) onde ele guarda as informações que já descobriu. As duas principais colunas desta tabela são endereço IP e endereço MAC. Desse modo, cada linha desta tabela contém um endereço IP e o seu endereço MAC (tipicamente um endereço Ethernet ou 802.11).
Usando a tabela, o funcionamento do ARP fica da seguinte maneira: quando uma máquina precisa enviar um pacote para um determinada endereço IP, ela primeiro verifica se este endereço IP já se encontra na tabela ARP. Se ele existir lá, basta obter seu endereço Ethernet a partir da tabela. Neste caso, nenhuma mensagem é enviada. Caso o endereço IP não exista na tabela, aí sim, é enviada a mensagem ARP (ARP request) pela rede. Quando a resposta do ARP chegar (ARP Reply), além de ser utilizada para o envio do pacote IP, é inserida uma entrada na tabela cache associando o IP e o Ethernet. A Figura 5 mostra um fluxograma que descreve o funcionamento do ARP.
Figura 5 - Fluxograma do ARP usando a tabela cache
Veja que o fluxograma mostra que pode existir uma situação onde enviamos uma requisição ARP e não recebemos resposta. Isso é normal, e acontecerá sempre que tentarmos acessar um endereço IP para o qual não existe nenhuma máquina na nossa rede. Isso acontecerá, por exemplo, quando a máquina que você tenta acessar está desligada. Nesses casos, embora não tenha sido mostrado no fluxograma, também será inserida uma entrada na tabela cache para o endereço IP, mas não haverá um endereço Ethernet associado. Essa entrada servirá apenas para vermos que já tentamos nos comunicar com aquele IP e não conseguimos resposta. Portanto, sempre que alguém precisar se comunicar com esse IP, uma nova requisição ARP será enviada pela rede!
É importante observar que as entradas cadastradas na tabela cache não podem ficar lá para sempre. Para entender por que, suponha, por exemplo, que descobrimos que o endereço IP 200.1.1.1 está associado ao endereço Ethernet AA:AA:AA:01:01:01 e inserimos esta entrada na tabela cache. Descobrimos também que o endereço IP 200.2.2.2 está associado ao endereço Ethernet AA:AA:AA:02:02:02 e inserimos esta entrada na tabela cache. Podem acontecer as seguintes duas situações que levariam a um erro:
• depois de algum tempo, as máquinas podem ter sido reinicializadas e terem obtido outros endereços IP. Suponha que após a reinicialização a máquina com endereço Ethernet AA:AA:AA01:01:01, obteve-se o endereço IP 200.2.2.2 e a máquina com endereço Ethernet AA:AA:AA:02:02:02 obteve o endereço IP 200.1.1.1. Se você usasse as informações que estão na tabela cache, quando tentasse transmitir um pacote para o endereço IP 200.1.1.1 você o enviaria para o endereço Ethernet AA:AA:AA:01:01:01, o que está errado! Como esse endereço MAC agora está associado ao IP 200.2.2.2, você enviaria o pacote para a máquina errada!
• a placa de rede da máquina 200.1.1.1 que possuía endereço Ethernet AA:AA:AA01:01:01 pode ter dado algum problema e ter sido trocada por outra. Como o endereço Ethernet é um endereço gravado na própria placa, a nova placa de rede terá outro endereço Ethernet! Portanto, se continuasse usando as informações armazenadas na tabela cache inicialmente, você não conseguiria mais se comunicar com a máquina 200.1.1.1.
Para minimizar os dois problemas citados, cada linha da tabela cache possui uma terceira coluna, que guarda uma informação de tempo, chama timestamp. Essa coluna contém o instante do tempo em que a entrada foi inserida na tabela. Assim, se depois de certo tempo em que foi inserida a entrada não for utilizada, ela é removida. Além disso, mesmo as entradas utilizadas são removidas depois de certo tempo (que naturalmente é maior que o das entradas não utilizadas). Por fim, saiba que a tabela cache de ARP é normalmente chamada apenas de “Tabela ARP”.
1. Para que serve a Tabela ARP?
Manipulando a cache
Podemos facilmente listar o conteúdo da tabela ARP a partir de comandos do sistema operacional. O comando para listar o conteúdo da tabela é: arp –n. Vamos usar este comando vendo alguns exemplos práticos.
Quando tudo dá certo
Supondo que temos uma rede como a mostrada na Figura 3. Vamos ver o que acontece quando a máquina A (10.1.1.1) vai enviar um ping para a máquina C (10.1.1.3).
Suponha que a máquina A acabou de ser ligada e ainda não se comunicou com ninguém. Desse modo, antes de executar o comando ping na máquina A podemos ver que sua tabela ARP está vazia, digitando o comando arp –n. Veja na Figura 6 que nada é mostrado.
Figura 6 - Tabela ARP vazia
A seguir, o usuário da máquina A realiza o comando ping para a máquina C. Como podemos ver na Figura 7, a máquina C enviou as respostas, de modo que o comando foi bem sucedido.
Figura 7 - Comando Ping executado com sucesso
Como a máquina A precisou descobrir o Ethernet associado ao endereço de C (10.1.1.3) para poder lhe enviar os pacotes, ela lhe enviou primeiro uma mensagem ARP e colocou a resposta na Tabela ARP (cache). Podemos verificar isso digitando o comando arp –n na máquina A, conforme mostrado na Figura 8.
Figura 8 - Tabela ARP contendo o endereço Ethernet associado ao IP 10.1.13
A coluna Address mostra o endereço IP ao qual o Ethernet mostrado na coluna HWaddress está associado. A colunaHWtype diz que o tipo do endereço da coluna HWaddress é um endereço Ethernet, e a coluna Iface diz qual das placas de rede da máquina A está conectada na rede onde a máquina C se encontra (lembre-se que se a máquina A fosse um roteador ela teria mais de uma placa de rede).
Como já explicamos antes, essa entrada fica guardada na Tabela ARP por certo tempo (tipicamente dois minutos) e depois é apagada. Durante o tempo em que ela está na cachê, se a máquina A tentar se comunicar com a máquina C, não será necessário enviar uma nova mensagem ARP. Depois que ela for excluída a próxima tentativa de comunicação com C irá gerar novamente uma mensagem ARP e a resposta será incluída na Cache. O processo continua sempre desse modo, com as informações sendo incluídas e apagadas da cache. Portanto, se esperássemos aproximadamente 2 minutos e executássemos o comando arp –n novamente na máquina A, veríamos que sua tabela ARP estaria vazia novamente.
Otimização do ARP
Normalmente uma máquina que recebe um pacote IP de outra envia pacotes de volta para esta máquina. Assim sendo, quando uma máquina recebe uma requisição ARP ela pode já inserir o endereço IP e o Ethernet da máquina que lhe enviou o quadro na sua tabela cache. Isso evita que ela precise enviar uma requisição ARP para a máquina de origem quando tentar se comunicar com ela.
Desse modo, no exemplo que mostramos – a máquina A enviando um ping para a máquina C –, a máquina C, ao receber a requisição ARP perguntando pelo seu IP (10.1.1.3), já insere o endereço IP (10.1.1.1) e o Ethernet (AA:AA:AA:00:00:01) da máquina A na sua cache. Assim, quando C for responder ao ping, o endereço Ethernet de A já vai ser conhecido e não será necessário enviar uma nova requisição ARP. Na Figura 9, mostramos a tabela ARP da máquina C após receber o ping de A. Veja que foi inserida uma entrada para o IP e Ethernet de A.
Figura 9 - Tabela Cache da Máquina C após receber ping de A
Talvez você esteja se perguntando: “Espere aí, como tenho certeza se essa entrada foi inserida automaticamente quando C recebeu o ARP ou após ele tentar enviar a resposta do ping?”
Se você pensou isso, tem razão. Apenas olhando a tabela não dá para saber, pois quando C tentasse enviar a resposta do ping, ele iria primeiro enviar uma mensagem ARP para A, de modo que a tabela seria preenchida do mesmo jeito!
Para termos certeza que C não enviou nenhuma mensagem de requisição ARP, basta capturarmos os quadros transmitidos. Isso pode ser feito em A, em C, ou em qualquer máquina da rede, uma vez que os quadros são enviados em broadcast. Vamos capturar na máquina B – veja Figura 4(c). Na Figura 10, que mostra os quadros capturados durante o envio e a resposta do ping de A para C, você pode ver que em nenhum momento C envia mensagens de requisição ARP para A! Ele envia apenas a resposta ao pedido feito por A.
A linha 4 da Figura 10 mostra a mensagem de ARP Request (requisição), onde 10.1.1.1 perguntou quem tem (Who-has) o IP 10.1.1.3. A linha 5, mostra o ARP Reply (resposta), onde 10.1.1.3 responde dizendo que o endereço Ethernet é (is-at) AA:AA:AA:00:00:03. As demais 6 linhas representam os três pacotes ping trocados entre as máquinas. Desse modo, as linhas 6 e 7 são referentes ao primeiro pacote ping (veja a indicação seq 1), e mostram, respectivamente, a requisição ping enviada de 10.1.1.1 para 10.1.1.3 e a resposta enviada de 10.1.1.3 para 10.1.1.1.
Figura 10 - Captura de quadros na rede durante a comunicação entre A e C
Quando não obtemos resposta
Vamos ver agora como fica a tabela ARP quando tentamos nos comunicar com alguém que não responde a mensagem ARP (provavelmente porque a máquina está desligada, ou porque digitamos um endereço IP que não pertence a ninguém da rede).
Figura 11 - Tabela ARP com endereço Ethernet não localizado
Veja na Figura 11 que inicialmente enviamos um ping para o endereço IP 10.1.1.5, para o qual sabemos não existir nenhuma máquina com este endereço na rede. A resposta do ping, “Destination Host Unreachable”, significa “Máquina de Destino Inalcançável”, ou seja, ninguém respondeu ao ping enviado. A verdade é que o ping nem mesmo chegou a ser enviado! Como a máquina de origem e a de destino pertencem à mesma rede (10.1.1.0), a máquina A enviou primeiro uma mensagem ARP perguntando pelo Ethernet de 10.1.1.5, mas ninguém respondeu! O valor “(incomplete)“ na coluna HWaddress mostra que não foi possível descobrir o endereço Ethernet associado ao IP 10.1.1.5. Como esta entrada na tabela está “incompleta”, sempre que alguém tentar se comunicar com o endereço IP 10.1.1.5 uma nova mensagem ARP será enviada.
Alterando a tabela ARP
Além de verificar o conteúdo da cache também é possível excluir alguma entrada ou cadastrar uma entrada de modo permanente. Saiba, entretanto, que normalmente você não precisa utilizar esses comandos, pois o ARP funciona sem requer nenhuma configuração.
O cadastro permanente de endereços na cache é chamado estático e asentradas inseridas desta forma nunca são apagadas depois de certo tempo. Embora forneça um nível maior de segurança que o modo dinâmico, pois dificulta a tentativa de alguém em se passar por um determinado endereço, é menos flexível que o modo dinâmico. – se a máquina mudar seu IP ou Ethernet, você terá que mudar o registro manualmente. O comando para inserir um registro associando o endereço Ethernet xx:xx:xx:xx:xx:xx com o IP A.B.C.D é: arp –s A.B.C.D xx:xx:xx:xx:xx:xx.
A exclusão de registros da cache é muito utilizada quando você quer fazer testes, e eventualmente quando você detecta que algum endereço na cache ainda não foi atualizado após você trocar a placa de rede de alguma máquina. A Figura 12 mostra como é possível excluir o endereço Ethernet associado a um IP. Veja que após a exclusão o endereço aparece como “incompleto”.
Figura 12 - Excluindo um endereço Ethernet da tabela ARP
Máquinas em redes diferentes e o ARP
Vamos agora analisar o que acontece com o ARP em um cenário diferente do que usamos nos exemplos anteriores, onde todas as máquinas estavam na mesma rede. Nesse nosso cenário, que é mostrado na Figura 13, as máquinas A e C estão em duas redes diferentes, e a máquina B é agora um roteador que possui duas placas de rede, uma conectada a cada rede.
Figura 13 - ARP com máquinas em redes diferentes
Observe que a placa de rede eth0 de B possui IP 10.1.1.1 e Ethernet AA:AA:AA:00:01:01, e a placa eth1 possui IP 10.2.2.1 e Ethernet AA:AA:AA:00:02:01. Além disso, o Gateway (roteador padrão) da máquina A é 10.1.1.1 e o Gateway da máquina C é 10.2.2.1. O que será que acontece quando A realiza um ping para C? Qual endereço Ethernet será colocado na Tabela ARP de A?
Vamos olhar logo como a tabela ARP fica, e depois explicamos. Veja na Figura 14 a tabela cache de A após o ping para C.
Figura 14 - Tabela ARP após ping para máquina em outra rede
Entendeu o que aconteceu? Ou seja, se tentamos nos comunicar com a máquina C, por que apareceram os endereços IP e Ethernet do roteador (máquina B)?
A resposta é que como A e C estão em redes diferentes, não há como enviar o pacote IP diretamente para C. Esse pacote precisa ser enviado para o roteador da rede onde A se encontra. Se tiver com dúvidas quanto a esse este assunto, volte na parte de roteamento da disciplina de Sistemas de Conectividade e faça uma revisão. Assim sendo, não faria sentido enviar uma ARP tentando descobrir o Ethernet de C.
Para enviar o pacote IP para o roteador é necessário colocar o endereço Ethernet do roteador no campo de destino do quadro Ethernet. É aqui que o ARP entra. Como a máquina B sabe o endereço IP do roteador da sua rede, ela envia uma requisição ARP perguntando por esse IP. Na verdade ela não quer enviar nenhum pacote para o endereço IP do roteador, ela quer apenas descobrir seu Ethernet!
A Figura 15 mostra os pacotes capturados (apenas os primeiros pacotes) na máquina B, quando a máquina A enviou um ping para C. Veja que B recebe uma requisição ARP vinda de A (10.1.1.2) para seu IP (10.1.1.1), e envia a resposta. Observe também que, embora os pacotes de ping sejam enviados ao roteador (para seu Ethernet), naturalmente o endereço IP de destino do pacote é o IP de C (10.2.2.2).
Figura 15 - Mensagens ARP quando as máquinas origem e destino estão em redes diferentes
Resumo
Nesta aula você aprendeu que o protocolo ARP traduz endereços da camada de rede para endereços da camada de enlace (endereços MAC), e que na maioria das redes esses protocolos são o IP e o Ethernet. Aprendeu que esse protocolo envia uma mensagem ARP Resquest para o endereço de broadcast da rede perguntando quem tem um determinado endereço IP. Viu que, após isso, a máquina que possui esse IP envia uma resposta diretamente para quem enviou a solicitação, contendo o Ethernet associado ao IP informado. Você aprendeu também que para reduzir o tráfego gerado na rede, e o tempo para obter a informação, o ARP faz uso de uma tabela cache (chamada de tabela ARP) que mantém os endereços (IP e Ethernet) recentemente descobertos.
Acesse o Laboratório 1 desta aula (Aula 1) no Virtualbox e realize os seguintes procedimentos.
1. Verifique a tabela ARP da máquina A.
2. Coloque o tcpdump para executar na máquina B. Execute um ping da máquina A para a máquina C. Depois verifique como ficaram as tabelas ARP das máquinas A, B, e C.
3. Verifique os pacotes capturados no passo anterior pelo tcpdump e veja se foram trocados os pacotes que você esperava.
4. Execute o ping de A para C novamente e veja os pacotes capturados em B.
5. Na máquina A, exclua a entrada referente ao IP de C e execute o ping novamente de A para C. Mais uma vez analise os pacotes capturados em B.
Referencias
FOROUZAN, B. Comunicação de dados e redes de computadores. 3. ed. Porto Alegre: Bookman, 2006.
KUROSE, J.; ROSS, K. Redes de computadores e a internet. 5. ed. São Paulo: Addison Wesley, 2010.
TANENBAUM, Andrew S. Redes de computadores. 4. ed. Rio de Janeiro: Editora Elsevier, 2003.
Voltar
Imprimir
Topo
Na disciplina Sistemas de Conectividade você aprendeu o que é uma rede e como as máquinas são capazes de se comunicar. Aprendeu também que o modelo OSI divide as funções de uma rede em sete camadas, mas naquela disciplina mantivemos o foco no estudo das camadas: física, enlace e rede. Caso não lembre, é importante retomar o estudo destes temas, pois precisaremos deles nesta disciplina.
Agora você sabe que atualmente as redes utilizam o modelo TCP/IP, que, diferentemente do modelo OSI, possui apenas a camada de aplicação acima da camada de transporte.
O foco desta disciplina é estudar detalhadamente os principais protocolos da camada de aplicação da pilha TCP/IP.
Para que as aulas fiquem mais interessantes e lhe ajudem a colocar seu conhecimento em prática, além de estudar os protocolos propriamente ditos, você aprenderá a instalar os serviços que são implementados com eles, como por exemplo web, e-mail, DNS, entre outros. Antes de estudarmos os protocolos de aplicação, iremos complementar nossos estudos sobre a camada de rede, iniciados na disciplina anterior, e estudar os protocolos UDP e TCP da camada de transporte.
Portanto, caso você tenha achado a disciplina de Sistemas de Conectividade muito teórica, e se sentido um pouco frustrado por não ter aprendido a configurar muitas coisas de uma rede de verdade, anime-se, porque esta disciplina é bastante prática! Você aprenderá tanto a teoria de cada assunto explicado como a realizar configurações reais nas máquinas. A ideia é que ao término desta disciplina você consiga realmente configurar uma rede real!
Para tornar esta disciplina bastante prática, você irá utilizar algumas ferramentas que são utilizadas por muitas pessoas que trabalham com informática atualmente. O interessante é que, além de aprender algo que será bastante útil quando você for trabalhar com informática, essas ferramentas são bastante adequadas para estudarmos redes de computadores.
Por isso, nesta aula e na próxima, vamos estudar algumas dessas ferramentas e como elas serão usadas para criar os ambientes que utilizaremos como exemplo durante as aulas desta disciplina. Nesta aula estudaremos um dos assuntos que têm recebido maior destaque atualmente, e que se faz cada vez mais presente nas empresas, que são as máquinas virtuais.
Ao término desta disciplina você será capaz de:
• Entender o que é uma máquina virtual.
• Instalar várias máquinas virtuais em um mesmo computador usando o VirtualBox.
• Aprender os modos de rede suportados pelas máquinas virtuais criadas com o VirtualBox.
Máquinas virtuais
Tradicionalmente, se você precisasse de duas “máquinas” independentes, cada uma executando sua própria cópia do sistema operacional, você utilizaria dois computadores diferentes para esta finalidade. Supondo, por exemplo, que você quisesse ter uma máquina com o sistema operacional Windows e outra com o Linux, você compraria dois computadores e instalaria o Windows em um e o Linux em outro.
À medida que o hardware dos computadores evoluiu, cada máquina passou a ter capacidade de processamento muito grande, que muitas vezes não é utilizada na sua totalidade pelos programas executados na máquina.
Para aproveitar esses recursos que ficam ociosos, foi criado um mecanismo que permite executar mais de um sistema operacional em um mesmo computador, sendo que cada um tem a impressão de que a máquina (o hardware) é apenas dele. Ou seja, cada sistema operacional se comporta realmente como se fosse uma máquina fisicamente separada. Os sistemas operacionais não sabem que estão compartilhando um mesmo computador!
O mecanismo que citamos no parágrafo anterior chama-se virtualização, e é uma das grandes áreas da computação atualmente. Muitas empresas já utilizam virtualização, e ao invés de terem um número elevado de computadores atuando como servidores, elas têm um número bem menor de máquinas reais, sendo que em cada uma delas são criadas e executadas diversas máquinas virtuais diferentes. Como cada máquina virtual executa seu próprio sistema operacional, elas podem usar o mesmo sistema operacional, ou sistemas operacionais diferentes. O importante é que elas se comportam como se fosse máquinas reais diferentes.
Uma das grandes vantagens da virtualização é que os recursos de hardware são melhores utilizados. Suponha que você tem uma máquina real com velocidade de processamento de X GHz e Y GB de memória RAM, e nesta máquina real são criadas duas máquinas virtuais. Você pode alocar, por exemplo, X/2 GHz de processamento e Y/2 de Memória para cada máquina. A vantagem é que você pode dizer que se alguém não estiver usando toda a capacidade que lhe foi reservada, esse recurso seja utilizado pela outra máquina virtual! Se as máquinas fossem realmente dois computadores separados essa tarefa normalmente não teria como ser feita.
Figura 1 – Máquinas virtuais em uma mesma máquina real
A forma mais comum de utilizar o esquema descrito acima é utilizar um software de virtualização sobre o qual os outros sistemas operacionais são executados. Nas máquinas de empresas, onde normalmente vão ser criadas várias máquinas virtuais em um único computador real, esse software de virtualização é, ele próprio, um sistema operacional. A Figura 1 ilustra este processo, onde em:
a) é mostrada a arquitetura do ambiente de máquinas virtuais, e
b) são mostrados exemplos de programas utilizados, tanto para o software de virtualização como nas máquinas virtuais.
Como exemplos do software de virtualização podemos citar o VMware [https://www.vmware.com/br/] ou o Xen [https://www.xen.org/]. Esses softwares são sistemas operacionais que suportam virtualização, portanto eles são instalados no computador real (naturalmente, um deles em cada máquina real).
A máquina virtual 1 poderia estar executando o sistema operacional Windows e a máquina virtual 2 um Linux, ou as duas poderiam estar executando Linux, ou as duas Windows. Na verdade, qualquer sistema operacional pode ser instalado nas máquinas virtuais, pois, como dissemos, ele não toma conhecimento que está sendo executado sobre uma máquina virtual. Isso acontece porque o software de virtualização cria um hardware virtual de modo que o sistema operacional da máquina virtual enxerga realmente como se existisse um computador.
No começo desta aula dissemos que você iria utilizar máquinas virtuais. Por isso, talvez você esteja preocupado pensando que vai ter que apagar o sistema operacional da máquina que utiliza para instalar um sistema operacional com suporte à virtualização. Calma! Isso seria complicar as coisas para você, e não é isso que queremos.
A boa notícia e que existem softwares de virtualização para serem executados sobre o sistema operacional que você já utiliza. Ou seja, esses softwares não são sistemas operacionais! Assim, seja qual for o seu sistema operacional, é possível instalar um software de virtualização nele e criar as máquinas virtuais. Para efeitos de instalação, esse software de virtualização é um programa como outro qualquer. Ou seja, você o instala como faz com qualquer outro programa. A Figura 2 mostra este modelo.
Figura 2 – Software de virtualização sobre um sistema operacional
Veja que o programa de virtualização é apenas um software a mais que está instalado no seu sistema operacional.
A caixa “Prog”, na Figura 2(a), mostra que existem vários outros programas na máquina – como o Office, mostrado em 2(b) – que executam diretamente sobre o sistema operacional principal. Além disso, mostramos Windows como o sistema operacional principal da máquina, mas também poderia ter sido utilizado outro, como o Linux, por exemplo. Basta que exista um software de virtualização para ele. O software mostrado na Figura 2(b), chamado VirtualBox [https://www.virtualbox.org/], existe tanto para Linux como para Windows, e é o software que utilizaremos nesta disciplina. Vamos agora realizar uma atividade para treinar um pouco o seu conhecimento.
1. Acesse o site do VirtualBox e do VMware e verifique se eles possuem versões que executam como sistema operacional (modelo apresentado na Figura 1) e versões para serem executadas sobre um sistema operacional já utilizado (modelo apresentado na Figura 2).
2. Caso eles (ou algum deles) suportem a versão para executar sobre um sistema operacional já existente, veja quais são os sistemas operacionais suportados.
“Se existe essa versão que eu posso instalar sobre o meu sistema operacional, por que alguém iria usar a outra, que requer a instalação de um sistema operacional específico?”
A resposta é desempenho e gerenciamento dos recursos de hardware, que são mais completos na versão do software que é um sistema operacional. Assim, quando você pretende criar diversas máquinas virtuais sobre o mesmo computador, como é o caso de muitas empresas, utilize a versão que é um sistema operacional.
Quando for criar uma, ou mesmo poucas máquinas virtuais, mas que não venham a ter um uso muito intenso, você pode utilizar a versão que executa sobre o seu sistema operacional.
Portanto, fique tranquilo. Como para os exemplos que utilizaremos nesta disciplina vamos criar poucas máquinas virtuais, tipicamente duas ou três, e essas máquinas não vão ter uma carga de processamento elevada, podemos usar tranquilamente um software de virtualização sobre o nosso próprio sistema operacional. Como dissemos anteriormente, iremos utilizar o VirtualBox.
DICA
Sites interessantes:
• (Português)
• (Português)
• (Português)
• (Inglês)
VirtualBox
Nesta seção abordaremos a instalação do VirtualBox, que executa sobre o seu sistema operacional já instalado. Uma coisa interessante é que a instalação do VirtualBox pode ser um pouco diferente dependendo do seu sistema operacional, porém a criação de uma máquina virtual segue o mesmo procedimento – quer você esteja usando a versão para Linux, quer para Windows. Além da instalação propriamente dita do VirtualBox (utilizaremos a versão 3.x), você também aprenderá a criar e configurar uma máquina virtual.
Para melhor entendermos o que é e como funciona uma máquina virtual, primeiro temos que compreender o que é uma máquina host e uma máquina guest.
Uma máquina host é uma máquina hospedeira, ou seja, aquela que receberá as máquinas convidadas (guest). Dizendo de outra forma, a máquina host é a máquina real onde o sistema operacional principal está instalado. Olhe novamente a Figura 2(b). A máquina host é a máquinapropriamente dita, compreendida pelo hardware e pelo sistema operacional mostrado no retângulo chamado “Windows”.
As máquinas guest são as máquinas instaladas dentro do software de virtualização. Na Figura 2(b) esse software de virtualização é representado pelo retângulo “Virtualbox”, e as máquinas guest sãorepresentadas pelos retângulos “Linux”e “Win”.
Desse modo, a máquina host será responsável por reservar parte dos seus recursos para cada máquina convidada, e essa reserva é feita no momento da criação dessas máquinas. Apesar de serem especificados no momento da criação da máquina guest, esses recursos podem ser alterados posteriormente.
Suponho que você esteja ansioso para ver como criar e usar essas máquinas virtuais. Então vamos começar vendo como fazer a instalação do Virtualbox, que é um processo bastante simples. Depois veremos um roteiro passo a passo como criar as máquinas virtuais dentro dele.
Como dissemos, existem versões do Virtualbox para diversos sistemas operacionais. Quando for utilizá-lo escolha a versão para o sistema operacional que você utiliza. A seguir mostramos exemplos de executáveis do virtualBox para alguns sistemas operacionais.
Figura 3 – Executáveis do Virtualbox para diferentes sistemas operacionais
Vamos agora ver como instalar o VirtualBox no Ubuntu. Neste caso você nem precisa saber o nome do executável, basta utilizar o mecanismo de instalação de programas do Ubuntu (o que é feito, por exemplo, usando-se o comando apt-get install).
Portanto, para instalar, faça o seguinte:
1° abra o terminal(gome-terminal) ou xterm;
2º entre em modo super usuário(root) com: sudo su e digite a sua senha;
3º digite o comando a seguir para iniciar a instalação: apt-get install virtualbox-ose
4º aceite a licença e pronto. Máquina hospedeira pronta.
A Figura 4 mostra este processo após a abertura do terminal (que foi descrita no 1º passo).
Naturalmente, o nome da máquina e do usuário que irão aparecer para você serão diferentes.
ATENÇÃO
Lembre-se que a instalação é feita na máquina host, que poderia ser uma máquina na sua casa, ou uma máquina de um laboratório de informática da sua escola. Portanto, o nome da máquina e o nome do usuário dependem da máquina onde você está instalando o Virtualbox.
Figura 4 – Instalação do Virtualbox no Ubuntu usando o comando apt-get
Agora que o Virtualbox está instalado, veremos como criar uma máquina virtual convidada (guest). As operações mostradas a seguir são iguais para todos os sistemas operacionais.
Primeiro inicie o Virtualbox, clicando no menu “Aplicativos” do Linux (canto superior esquerdo da tela), depois em “Acessórios” e finalmente em “Virtualbox OSE”.
Após isso, aparecerá a tela do Virtualbox com um ambiente semelhante ao mostrado na Figura 5. O ambiente abaixo mostra que nosso host tem duas máquinas virtuais guest instaladas (“Ubuntu9.10” e “Windows XP”). Após uma nova instalação, evidentemente não haverá nenhuma máquina criada e essa parte estará em branco.
Figura 5 – Tela inicial do VirtualBox
Como exemplo, criaremos mais uma máquina virtual com o nome Máquina_A.
Para isso, clicamos no botão Novo ou no menu Aquivo(F) e depois clicamos em Novo. A próxima tela que surgirá é mostrada na Figura 6, onde se deve clicar em Próximo(N).
Figura 6 – Primeira tela no processo de criação de uma máquina virtual
O próximo passo consiste em definirmos o nome da máquina guest e o sistema operacional que será utilizado, conforme é mostrado na Figura 7. Chamaremos a nossa máquina de “Maquina_A” e escolheremos o sistema operacional “Linux/Ubuntu”. Observe que existem várias versões do Windows e várias versões do Linux, além de outros sistemas operacionais. Escolha o que você pretende instalar na máquina virtual que está criando. Portanto, atenção! Não pense que ele já ira instalar o sistema operacional. Quando terminar de criar a máquina virtual, você é que terá de instalar o sistema operacional escolhido na máquina virtual.
Figura 7 – Definição do nome da máquina e do sistema operacional
O próximo passo é bastante importante e consiste em dimensionamos a memória da máquina real que será reservada para a máquina virtual, conforme mostrado na Figura 8. Para escolher um valor apropriado analise três coisas:
i. quanto de memória disponível existe em seu computador (máquina real);
ii. qual o sistema operacional que a máquina virtual irá executar (escolhido na etapa anterior);
iii. quais aplicações serão executadas na máquina virtual, ou seja, qual a finalidade desta máquina.
Caso esteja criando uma máquina apenas para estudos, utilize o valor sugerido pelo VirtualBox. Apesar de ser um parâmetro muito importante, não se preocupe demais com ele neste passo, porque você poderá alterá-lo a qualquer momento depois que a máquina for criada.
Figura 8 – Definindo a memória que será alocada para a máquina virtual
Agora, alocamos um espaço em disco para nossa máquina virtual. Como normalmente você não terá um disco rígido exclusivo para ser utilizado pela máquina virtual, o VirtualBox cria um arquivo na máquina host que serve como o disco rígido da máquina virtual.
Pois é, o sistema operacional que você instalar na máquina virtual, e todos os arquivos que criar, serão armazenados dentro de um único arquivo da máquina real (host). Conforme mostrado na Figura 9, selecione “Disco Rígido de Boot (Primário Master)” e “Criar novo disco rígido” para que o arquivo que representará seu disco rígido seja criado.
Figura 9 – Definição do disco rígido da máquina virtual
Não se preocupe se parecer confuso o fato de seu disco rígido ser um único arquivo. Você não precisará lidar com isso para utilizar sua máquina virtual, pois ela verá um disco rígido normal. Clique em próximo e será mostrada a tela apresentada na Figura 10.
Figura 10 – Início do assistente para configuração do novo disco rígido
Como pode ver, essa tela apenas avisa que iremos entrar no assistente para configuração do disco rígido da máquina virtual.
Clique em próximo para que seja apresentada a tela mostrada na Figura 11, onde deve ser definido como será a alocação de espaço no disco real da máquina host para o disco virtual. Isso é chamado de tipo de armazenamento, que pode ser fixo ou dinâmico.
No fixo, você define exatamente quanto de espaço do disco da máquina host será reservado para a máquina convidada. O problema deste método é que se sua máquina convidada precisar de mais espaço não há como aumentar o tamanho deste disco, embora seja possível criar outros discos virtuais. O método dinâmico funciona da seguinte forma: você define um tamanho padrão, e se houver necessidade de mais espaço o virtual Box solicitará ao sistema operacional host mais espaço para sua máquina convidada, fazendo o disco dela aumentar de tamanho. Esse método é muito mais flexível e é o método mais indicado. Portanto, selecione “Armazenamento dinamicamente expansível” na tela mostrada na Figura 11 e clique em Próximo.
Figura 11 – Configuração do espaço utilizado pelo disco virtual
Nesta etapa deve-se definir o tamanho inicial do disco para o guest. Sugerimos utilizar o padrão 8GB, mas do mesmo modo que a definição do tamanho da memória, o valor mais adequado dependerá da finalidade que a máquina terá.
Figura 12 – Definição do tamanho do disco da máquina convidada
Agora é só clicar em “Finalizar” na tela mostrada na Figura 13 e pronto. Terminamos! A máquina virtual convidada (guest) está criada.
Figura 13 – Concluindo a criação da máquina convidada
Como dissemos, a criação da máquina convidada não instala o sistema operacional que escolhemos automaticamente. Portanto, a próxima etapa é instalar o sistema operacional na máquina virtual.
Para isso, vá à tela principal do VirtualBox, conforme mostrado na Figura 14, e clique na máquina recém-criada. Depois clique no botão “Configurações” que está ao lado do botão “Novo”.
Figura 14 – Máquina convidada recém-criada
Será apresentada a tela mostrada na Figura 15, onde podemos alterar as configurações da máquina virtual criada. Podemos entrar nesta opção a qualquer momento, desde que a máquina convidada não esteja sendo executada, como é o nosso caso, uma vez que ela acabou de ser criada.
Vamos clicar em “Sistema” nas opções mostradas na parte esquerda da tela. Isso nos permitirá definir a ordem de boot da máquina, ou seja, por quais dispositivos a máquina tentará iniciar quando a iniciarmos.
Lembre-se que em uma máquina real fazemos isso entrando na BIOS da máquina (normalmente apertando a tecla enquanto a máquina está iniciando).
Para que possamos fazer a instalação de um novo sistema operacional a partir do CD/DVD é importante que na lista “Ordem de Boot” a opção “CD/DVD” apareça mais acima que “Disco Rígido”. A ordem mostrada pode ser alterada clicando-se no item desejado, por exemplo, “CD/DVD”, e depois clicando-se nas setas que aparecem ao lado.
Figura 15 – Configuração da ordem de boot
Após termos verificado que “CD/DVD” está acima de “Disco Rígido”, podemos fechar a tela de configuração.
Agora podemos colocar o CD (ou DVD) contendo o sistema operacional que queremos instalar na unidade e clicar no botão “Iniciar” na tela principal do VirtualBox. Veja que do mesmo modo que aconteceria em uma máquina real, nossa máquina convidada irá tentar (e conseguir) inicializar pelo CD. A partir deste ponto você continua a instalação como faria em qualquer máquina real, pois, como dissemos, o sistema operacional sendo instalado não sabe da existência da máquina virtual.
Depois que terminar a instalação e retirar o CD da unidade, sempre que precisar iniciar a máquina convidada criada basta clicar no nome dela e depois no botão “Iniciar”, na tela principal do VirtualBox. Como não vai mais haver um CD na unidade, e vai haver um sistema operacional instalado no disco rígido da máquina convidada, a inicialização ocorrerá pelo disco rígido.
Mudamos o boot para o CD, mas o sistema depois de instalado não necessitará mais de iniciar pelo CD, certo? Como faríamos para alterar para o boot pelo disco?
Pense no caso de você não ter o sistema operacional queimado no CD, mas sim uma iso, ou seja, uma imagem do sistema em sua máquina. Como faríamos para instalar a partir da *.iso?
Caso haja alguma dúvida, utilize este vídeo para te guiar:
•
Configuração de rede no VirtualBox
Resolvemos criar uma seção separada para explicar a configuração de rede das máquinas virtuais criadas no VirtualBox porque isso é algo de fundamental importância para nossa disciplina.
Pretendemos que todos os exemplos que utilizarmos nesta disciplina possam ser reproduzidos com uma rede formada apenas por máquinas virtuais criadas no VirtualBox. Por isso, é muito importante que você entenda como é a configuração de rede das máquinas virtuais para que possa realizar as práticas sugeridas nas aulas.
Na tela principal do VirtualBox, clique no botão “Configurações” e depois em Rede, para que apareça a tela mostrada na Figura 16. Nesta tela podemos dizer quantas placas de rede vão existir na máquina convidada. São suportadas até quatro placas. Para ativar uma placa basta clicar em uma das abas identificadas por Adaptador X (onde X pode ser 1, 2, 3 ou 4) e clicar em “Habilitar placa”.
Figura 16 – Configuração das placas de rede de uma máquina virtual
Quando habilitamos uma placa, devemos escolher o modo como a placa irá funcionar, no campo identificado como “Conectado a:”. As opções e a forma como cada uma trabalha são as seguintes:
• Não conectado. Neste modo sua placa de rede estará desconectada de qualquer rede. Fazendo uma analogia, imagine uma máquina real que possui uma placa de rede Ethernet, mas que não possui nenhum cabo de rede conectado nela. Você pode até colocar um endereço IP nesta placa, mas não terá como se comunicar com nenhuma outra máquina.
• NAT. Neste modo é como se existisse uma rede entre a placa de rede da máquina convidada e a placa de rede da máquina host, e a máquina host realizasse NAT. Você estudará NAT (Network Address Translation– Tradução de endereços de Rede) na Aula 4. A máquina host fornece a configuração IP da máquina convidada através de um servidor DHCP que a máquina host executa (você estudará DHCP em uma aula posterior nesta disciplina). Este servidor DHCP é iniciado automaticamente pelo VirtualBox. A coisa mais importante para você saber sobre este modo é que ele permite que a máquina convidada acesse as máquinas da rede onde a máquina host está. Além disso, se a máquina host tiver acesso à Internet, a máquina convidada também terá. A Figura 17 ilustra essa configuração.
Figura 17 – Máquina virtual usando placa de rede em modo NAT
• Placa em Modo Bridge. Este modo é semelhante ao NAT, pois é como se existisse uma rede entre a máquina host e a máquina convidada. Porém, ao invés da máquina host realizar NAT, ela atua como se fosse uma bridge (ponte) entre a rede da máquina host e a rede da máquina convidada. Com isso é como se a máquina convidada estivesse na mesma rede que a máquina host está. A diferença é que a configuração IP da máquina convidada não será fornecida pela máquina host. Deve ser configurada manualmente ou fornecida pelo servidor DHCP da rede onde a máquina host se encontra. Da mesma forma que no modo NAT, neste modo a máquina convidada pode acessar as máquinas da rede da máquina host, e a Internet, caso esse acesso esteja disponível para aquelas máquinas.
• Rede Interna. Este é o modo que você mais utilizará para praticar os exemplos que utilizaremos nesta disciplina. Felizmente ele é o mais simples de entender. Neste modo você cria redes completamente isoladas da rede real e da máquina host. Quando você seleciona este modo aparece uma caixa de texto chamada “Nome”. Isso é o nome da rede à qual a máquina pertencerá. Coloque qualquer nome que desejar. Depois que colocar um nome uma vez, ele aparecerá no menu quando for configurar outras máquinas neste mesmo modo (Rede Interna). Todas as máquinas que possuírem o mesmo nome neste campo conseguirão se comunicar. É como se estivessem ligadas em um mesmo hub. A Figura 18 mostra quatro máquinas virtuais dentro de uma única máquina real. As máquinas virtuais (convidadas) 1 e 2 foram configuradas para pertencerem a uma rede chamada “Rede 1”, enquanto as máquinas virtuais 3 e 4 pertencem à rede “Rede 2”. Desse modo, as máquinas 1 e 2 podem se comunicar entre si, e o mesmo ocorre entre as máquinas 3 e 4. Mas uma máquina de uma rede não pode se comunicar com nenhuma máquina da outra rede.
Figura 18 – Máquinas virtuais utilizando o modo “Rede Interna”
• Placa de rede exclusiva de hospedeiro (Host-Only). Neste modo a máquina convidada pode se comunicar apenas com a máquina host.
Observe que podemos ter mais de uma placa de rede em uma mesma máquina convidada. Desse modo, cada placa de rede pode usar um modo diferente. Um cenário interessante seria, por exemplo, criarmos uma segunda placa de rede na Máquina Virtual 1 da Figura 18 e a colocarmos em modo NAT. Isso permitira que as máquinas da rede 1 acessassem as máquinas reais da rede onde a máquina host pertence e a Internet.
Práticas usando o VirtualBox
Durante a disciplina utilizaremos vários exemplos de redes para explicarmos o funcionamento de protocolos e para explicar como configurar e testar as diversas aplicações. O material contido no texto é suficiente para você entender o que pretenderemos explicar. Entretanto, seria muito interessante que você conseguisse reproduzir os procedimentos que realizarmos, e uma forma muito conveniente de fazer isso é utilizando máquinas virtuais. Recomendamos fortemente que você acesse este link para ver instruções de como fazer isso.
Aviso: Acesse a máquina virtual do servidor apenas para se acostumarem com ela, testem como iniciar, desligar, e como trabalhar com a interface gráfica. Uma vez que você se desconectar do servidor, será perdido tudo que foi feito, porque sempre a cada nova conexão é criada uma máquina nova (com a configuração padrão) para você. Portanto, você precisa realizar toda a atividade de uma vez. Sabemos que isso não é o ideal, mas não dispomos de hardware suficiente para todos, esta foi a forma que encontramos para viabilizar as máquinas virtuais.
Resumo
Nesta aula você aprendeu que a tecnologia chamada de virtualização permite que criemos várias máquinas virtuais em uma única máquina real, e que cada máquina virtual pode executar qualquer sistema operacional. Ou seja, podemos ter uma máquina virtual Windows e duas máquinas Linux, por exemplo, sendo executadas em um único computador. Você aprendeu, também, que para isso funcionar é necessário um software de virtualização, e que esse software pode ser apenas um programa que é instalado sobre um sistema operacional, ou pode ele próprio ser um sistema operacional. Finalmente, você aprendeu que existem diversas formas de uma máquina virtual utilizar a placa de rede da máquina host, e em um desses modos é possível conectar as diversas máquinas virtuais criadas em um mesmo de modo a formar uma rede de computadores. Nesta aula vimos como software de virtualização o VirtualBox.
1. Utilize alguma máquina com acesso à Internet para conectar na máquina Windows lab.metropoledigital.ufrn.br (chamaremos esta máquina de servidor) usando o programa Vmware Viewer. Veja instruções de como fazer isso no link
(https://www.metropoledigital.ufrn.br/aulas_avancado/
web/disciplinas/rede_comp/praticas.html).
2. Utilize a aplicação de configuração dos laboratórios, que já é iniciada automaticamente após se conectar no servidor, e escolha a atividade “Autoavaliação” da Aula 1.
3. Nessa aula não existe uma tarefa a ser realizada na Maquina-A. Ela serve para você se familiarizar com o ambiente que irá utilizar nas aulas, ou seja, com a forma de conectar no servidor, como selecionar a aula desejada, e como utilizar as máquinas virtuais. Portanto, você deve apenas analisar os menus, e verificar como liga e desliga a máquina virtual. Para explicação sobre o ambiente gráfico das máquinas virtuais (https://www.metropoledigital.ufrn.br/aulas_avancado/
web/disciplinas/rede_comp/blackbox.html). Observe que nesta aula existe apenas uma máquina virtual disponível. Nas demais aulas normalmente você utilizará duas ou mais máquinas virtuais.
4. Instale o VirtualBox em um computador.
5. Crie uma máquina virtual no VirtualBox e instale o sistema operacional Ubuntu.
6. Clone a máquina criada na Questão 2. Este vídeo irá te guiar caso seja necessário:https://www.youtube.com/watch?v=3vxeOgicTDw.
7. Configure as placas de rede de cada máquina para o modo “Rede Interna”, utilizando como nome da rede “Rede1”. Utilize como endereços IP 192.168.1.1 e 192.168.1.2, e como máscara, nas duas máquinas, 255.255.255.0. Realize um ping da máquina 192.168.1.2 para 192.168.1.1. Deve funcionar, ou seja, o ping deve obter resposta!
Referencias
INTEL. Virtualização. Disponível em: . Acesso em: 8 nov. 2010.
OLIVEIRA, R.; CARISSIMI, A.; TOSCANI, Simão. Sistemas operacionais. Porto Alegre: Editora Bookman, 2009.
TUTORIAL VirtualBox: como instalar e configurar uma máquina virtual. Disponível em: . Acesso em: 8 nov. 2010.
[TUTORIAL] Máquina Virtual VMware. Disponível em: . Acesso em: 8 nov. 2010.
VIRTUALBOX. Disponível em: . Acesso em: 2 set. 2010.
VMWare. Disponível em: . Acesso em: 2 set. 2010.
XEN. Disponível em: . Acesso em: 2 set. 2010.
Esta aula é a última das três aulas desta disciplina que são dedicadas a lhe ensinar a trabalhar com ferramentas que além de serem muito utilizadas pelas pessoas que administram redes de computadores, são utilizadas nesta disciplina como forma de lhe proporcionar a prática dos conteúdos ministrados.
Nesta aula estudaremos um tipo de ferramenta que consegue capturar pacotes transmitidos em uma rede. Esse tipo de programa é muito útil para análise da rede e detecção de problemas. Veremos um programa que trabalha em modo texto, o Tcpdump,e outro que utiliza uma interface gráfica, o Wireshark.
Ao final desta aula você será capaz de:
• Utilizar a ferramenta Wireshark para capturar pacotes na rede.
• Utilizar a ferramenta Tcpdump para capturar pacotes na rede.
• Entender a forma como os pacotes são exibidos, de modo que possa interpretar as informações mostradas nos pacotes capturados.
• Identificar em que máquina da rede executar a ferramenta de captura de pacotes.
Captura de pacotes
Como você estudou na disciplina de Sistemas de Conectividade, quando se deseja transmitir uma mensagem pela rede, cada camada TCP/IP na máquina de origem acrescenta um cabeçalho a essa informação. Na máquina de destino as camadas equivalentes retiram esses cabeçalhos.
Você viu também que o conjunto cabeçalho + mensagem de cada camada recebe um nome. Na camada de enlace o chamamos de quadro, na camada de rede de pacote, na camada de transporte de segmento e na camada de aplicação de mensagem.
Nesta aula você estudará uma ferramenta que permite a captura dos quadros transmitidos e recebidos por uma placa de rede.
Como um quadro contém um pacote, que por sua vez pode conter um segmento, que por sua vez pode conter uma mensagem, esse tipo de ferramenta é genericamente chamada de ferramenta de captura de pacotes,e não captura de quadros.
Desse modo, as ferramentas de captura de pacotes nos mostram informações de todas as camadas do modelo TCP/IP que estão presentes no pacote capturado.
Suponha, por exemplo, que você capturou um pacote gerado pela aplicação ping em uma máquina com uma placa de rede Ethernet. Como a informação enviada pelo ping é uma mensagem do protocolo ICMP, que é transmitida dentro de um pacote IP, que por sua vez é transmitido dentro de um quadro Ethernet, a ferramenta de captura irá lhe mostrar informações sobre os cabeçalhos Ethernet, IP e ICMP.
Como outro exemplo, suponha que você capturou informações transmitidas entre um browser e um servidor Web. Como a Web utiliza o protocolo HTTP (um protocolo de aplicação), que é transmitido dentro de segmentos TCP (protocolo de transporte), e cada segmento TCP é transmitido dentro de um pacote IP, que é transmitido dentro de um quadro Ethernet, a ferramenta de captura irá lhe mostrar informações sobre os cabeçalhos Ethernet, IP, TCP e HTTP.
Ressaltamos que a ferramenta de captura de pacotes mostra as informações dos cabeçalhos, mas naturalmente ela mostra todos os dados contidos no pacote.
Lembre-se também que embora o comportamento padrão de uma placa de rede seja descartar todos os quadros que não são destinados a ela, nem ao endereço de broadcast, pode-se configurar a placa para receber todos os quadros, o que caracteriza o modo promíscuo.
Como já visto em Sistemas de Conectividade, isso se chama modo promíscuo, ou modo espião. Quando executamos uma ferramenta de captura de pacotes normalmente ela trabalha utilizando o modo espião. Evidentemente, para poder usar esse modo, é necessário que o usuário seja administrador da máquina.
Você deve estar perguntando: “em que máquina eu devo executar a ferramenta de captura de pacotes?”. Pois bem, isso vai depender da finalidade para a qual você está executando a ferramenta. Mas lembre-se de que os dados devem passar por essa máquina para poderem ser capturados. Supondo que você pretende analisar uma comunicação entre as máquinas A e B, as alternativas são:
i. Em um roteador no caminho entre A e B;
ii. na máquina A;
iii. na máquina B;
iv. caso a rede onde A (ou B) se encontra use um hub, em uma outra máquina ligada no mesmo hub;
v. caso A (ou B) esteja em uma rede sem fio, nessa mesma rede sem fio (desde que a rede não esteja usando criptografia).
Wireshark
O Wireshark é um dos programas de captura de pacotes mais utilizados. Ele mostra os dados e as informações dos cabeçalhos dos protocolos contidos nos pacotes capturados.
Por ser um software Open source, o usuário pode modificar o código para melhor se adaptar às suas necessidades, assim como a documentação que está sob os termos da GNU (General Public License), ou seja, permite sua cópia, modificação e distribuição. Mas não se assuste! Dificilmente alguém precisa fazer isso, e você vai usar o programa sem precisar fazer modificação alguma nele!
Existem versões do Wireshark para as plataformas Windows, Linux, MacOs, Solaris, FreeBSD, entre outros. Isso é muito bom, porque evita que você tenha que aprender a utilizar vários programas diferentes para realizar a mesma tarefa.
O programa wireshark é muito usado por profissionais de redes, como:
• Administradores, com o objetivo de solucionar problemas na rede;
• Engenheiros de segurança, com o objetivo de verificar possíveis problemas na segurança;
• Desenvolvedores, para encontrar possíveis bugs na implementação do protocolo;
• Estudantes, como o objetivo de melhorar o entendimento acerca dos protocolos utilizados em redes de computadores.
Vale salientar que o Wireshark também é muito usado pelos hackers para fins ilícitos, ou seja, para fins que contrariam a lei, pois com ele é possível encontrar falhas nas implementações dos protocolos, capturar senhas e obter outras informações.
Instalação do Wireshark
Nesta seção mostraremos como realizar a instalação do Wireshark, como usar o menu e alguns elementos básicos da sua interface gráfica.
Utilizamos para esta aula a distribuição do GNU/Linux Ubuntu 9.10 e 10.04LTS, mas os passos são os mesmos para qualquer distribuição Linux baseada no Debian. Ilustraremos parte das imagens com letras do alfabeto latino (A-Z) para que você se situe melhor em relação à explicação.
Várias distribuições Linux, como é o caso do Ubuntu, mantêm todos os seus programas disponíveis em diversos servidores na Internet, e possuem um sistema de instalação de programas (chamado Gerenciador de Pacotes) que faz o download dos arquivos a serem instalados diretamente destes servidores. Ou seja, não é necessário que você faça o download dos arquivos e depois execute o programa de instalação. Você pode utilizar o gerenciador de pacotes, que se chama “apt”, para procurar os programas disponíveis e mandar instalar o programa desejado. Ele será então baixado da Internet e instalado. O gerenciador pode ser executado através do modo texto com o comando apt-get install, ou através do modo gráfico usando o menu Aplicativos->Central de Programas Ubuntu.Veremos os dois modos a seguir.
Temos duas observações importantes sobre o Gerenciador de Pacotes do Linux. A primeira é que você já o utilizou nas duas aulas anteriores para instalar os programas Virtualbox e Opensh-server. A segunda observação é que nesse contexto que estamos falando no momento (Gerenciador de Pacotes), o termo Pacotese refere a Programas (e não a um quadro de rede).
Para a instalação em modo texto inicialmente você deve abrir um terminal. Isso pode ser feito usando o menu mostrado na Figura 1. Para a melhor visualização do processo, você pode assistir este vídeo: , que mostra os passos da instalação do Wireshark no Ubuntu.
Figura 1 – Imagem de abertura do Terminal (gnome-terminal).
Para a instalação e execução do Wireshark o usuário deverá ter permissão máxima, ou seja, ser super usuário (root). O comando Linux que transforma o usuário em superusuário é o sudo su, conforme mostrado na Figura 2. Lembramos que as operações usadas nesta aula são aceitas em qualquer distribuição baseada no debian.
Figura 2 – Acesso como superusuário.
Na Figura 3 é apresentado o comando usado (apt-get install) para instalar um aplicativo existente nos repositórios Linux através do gerenciador de pacotes (programas) apt. Caso deseje mais informações sobre o apt, você pode consultar a página .
Figura 3 – Instalação a partir do apt-get
Como dissemos, também é possível instalar o Wireshark a partir do modo gráfico, conforme mostrado nas Figuras 4, 5 e 6. Inicialmente abra a Central de Programas do Ubuntu, clicando em Aplicativos->Central de Programas Ubuntu,conforme mostrado em a na Figura 4.
Figura 4 – Instalação por meio da Central de Programas do Ubuntu
Depois, digite a palavra wireshark no campo indicado com a letra b na Figura 5, para mostrar os programas com esse nome que estão disponíveis no repositório Linux.
Figura 5 – Localização do programa Wireshark para ser instalado
Clique então sobre o programa Wireshark que será mostrado, e depois clique em instalar, como mostrado em c na Figura 6.
Figura 6 – Inicializando a instalação do Wireshark
Utilizando o Wireshark
Após a instalação do wireshark, vamos agora executá-lo e aprender a utilizá-lo. Lembramos que a execução do Wireshark deverá ser como superusuário (root), de modo que você deve digitar o comando sudo su antes de executar o wireshark. Para iniciar o programa usamos o comando wireshark.
Porém, desta forma o programa ficará atrelado ao Terminal, ou seja, se o terminal for encerrado o programa também o será. Outra forma de executar o programa é acrescentar o caractere & após seu nome, fazendo com que o programa execute em background (segundo plano), liberando, assim, o terminal para que você possa utilizá-lo. O comando ficaria assim: wireshark & , como mostrado na Figura 7.
Figura 7 – Execução do Wireshark
Ao executar o comando mostrado na Figura 7, o wireshark irá iniciar e teremos a tela mostrada na Figura 8.
A chave apontada pela letra a nessa Figura mostra as interfaces presentes no computador que podem ser usadas para capturar os pacotes. Basta clicar sobre o nome da interface para que a captura de pacotes seja iniciada. Saiba que os nomes das interfaces podem mudar de computador para computador, pois elas dependem do hardware presente em sua máquina e como o sistema operacional o chama. A interface deve ser a usada para ter acesso à rede.
No Linux o nome das placas de rede Ethernet são eth0, eth1, e assim sucessivamente, e as placas de rede sem fio (wireless) são chamadas de wlan0, wlan1, e assim sucessivamente.
Vale lembrar que você pode escolher capturar os pacotes em modo promíscuo (promiscuous mode) ou não promíscuo.
No modo promíscuo, a interface aceitará todos os pacotes da rede que chegarem nela, mesmo os que não são destinados à mesma. O modo desejado é informado no filtro, que será explicado posteriormente.
Figura 8 – Tela inicial do Wireshark
1. Para que serve colocar o caractere & após o nome do programa Wireshark quando vamos executar esse programa através do terminal?
2. O que significa modo promíscuo?
Menus
Agora que você já sabe instalar, executar e escolher a interface de rede de onde capturar os pacotes, vamos mostrar em detalhes as opções disponíveis no menu principal do Wireshark, que é mostrado na Figura 9. Clicar em qualquer uma das palavras desse menu irá levar a um outro menu mais específico, que é descrito a seguir.
Figura 9 – Menu do Wireshark
File (Arquivo): É possível salvar as informações capturadas em um arquivo para que possam ser analisadas posteriormente. Este menu contém itens que possibilitam salvar as informações em um arquivo, abrir um arquivo salvo anteriormente, imprimir, exportar (salvar em um formato padrão, como txt). Além disso, existe a opção sair, que fecha o programa.
Edit (Editar): Este menu contém itens que possibilitam encontrar um pacote específico dentre todos os pacotes capturados. Para isso aplicamos um filtro, que consiste em especificar alguma informação sobre o pacote desejado. Após aplicar o filtro apenas os pacotes que “casam” com ele são exibidos. Outra opção muito importante deste menu é Preferências, que permite configurar várias coisas sobre a aparência e o modo de funcionamento do programa.
View (Visualizar): Este menu contém itens que controlam a exibição dos dados capturados, como por exemplo a coloração de pacotes, ampliação da fonte, exibição do pacote em uma janela separada, entre outros.
Go (Ir): Este menu contém itens que permitem ir para um pacote específico.
Capture (Captura): Este menu contém itens que lhe permitem iniciar e parar a captura de pacotes, além de definir filtros a serem aplicados na captura. Enquanto os filtros utilizados no menu Edit (Submenu Find Packet – Localizar pacotes)controlam os pacotes que são exibidos na tela, os filtros especificados no submenu Options deste menu controlam os pacotes que serão capturados. O submenu “Capture Filters” (Filtros de captura) deste menu permite que você crie novos filtros. Na sessão “Filtros” desta aula daremos mais detalhes sobre eles.
Analyze (Analisar): Este menu contém itens que permitem manipular filtros de tela, ativar ou desativar a dissecção de protocolos. Você não precisa se preocupar muito com esse menu porque normalmente ele não é muito utilizado.
Statistic (Estatística): Este menu contém itens que exibem janelas com estatísticas diversas, incluindo um resumo dos pacotes que foram capturados, hierarquia de protocolos e muito mais.
Telephony (Telefonia): Este menu contém itens que exibem várias estatísticas relacionadas com janelas de telefonia, incluindo uma análise de mídia, diagramas de fluxo e muito mais. Você não precisa se preocupar muito com esse menu porque normalmente ele não é muito utilizado.
Tools (Ferramentas): Este menu contém várias ferramentas disponíveis no Wireshark, como a criação de Regras de ACL do Firewall.
Help (Ajuda): Este menu contém itens para ajudar o usuário, por exemplo, no acesso a uma lista dos protocolos suportados, páginas de manual ou o acesso online às páginas relacionadas.
Talvez depois de olhar tantas opções de menu você esteja achando que utilizar o Wireshark é muito complicado. Não se preocupe, com o tempo você verá que na prática a maioria dessas opções não é usada frequentemente. Muitas vezes você apenas clica no nome da interface para iniciar a captura e clica nos pacotes que deseje ver mais detalhes. Realmente a utilização do Wireshark é bem simples! Olhe a descrição dos botões apresentada a seguir que você já verá um número bem menor de opções, mas que fornecem a maioria das operações que você vai precisar.
1. Abra o Wireshark como administrador ou superusuário.
2. Escolha a interface de rede que está utilizando para comunicar. Ex.: Eth0.
3. Tente identificar os pacotes que são capturados. Ex: ICMP causado pelo ping.
Botões de atalho
Algumas das operações discutidas acima, na Figura 9, podem ser executadas a partir de um atalho, como mostraremos agora.
Figura 10 – Aba de botões de atalho
: Captura de interfaces.
: Mostra a opção de captura.
: Inicia a captura.
: Para a captura.
: Reinicia a captura.
Listagem dos pacotes capturados
A parte mais importante que você precisa saber é analisar os pacotes.
Portanto, vamos agora começar a ver como o Wireshark mostra os pacotes para você. Nessa seção você verá como o Wireshark lhe apresenta a lista dos pacotes capturados, e na próxima seção aprenderá a ver os detalhes de cada pacote.
A listagem dos pacotes capturados é mostrada na Figura 11. Essa tela irá aparecer após você iniciar a captura dos pacotes, que pode ser feita, como já dissemos, clicando no nome da interface, selecionando uma opção do menu ou clicando em um botão.
Figura 11 – Painel Lista de Pacotes
A seguir discutiremos o que significam os campos identificados com as letras de “a” até “f” na Figura 11.
a No. : Número do pacote na lista dos pacotes capturados. Como você pode perceber, esse número é sequencial, e é incrementado cada vez que um pacote é capturado.
b Time: Tempo de timestamp do pacote. Informa o instante decorrido desde o início da captura até o momento em que o referido pacote foi capturado. É útil, por exemplo, para você analisar o tempo decorrido entre dois pacotes quaisquer, como o tempo decorrido entre o envio de um pacote que solicitou uma página web a um servidor e o pacote de resposta, contendo a página, enviado pelo servidor.
c Source: Endereço IP de origem, ou seja, qual máquina transmitiu o pacote.
d Destination: Endereço de destino, ou seja, para qual máquina o pacote deve ser entregue.
e Protocol: Protocolo usado na transferência do pacote.
f Info: Informações adicionais sobre o conteúdo do pacote. As informações que são mostradas dependem do tipo de protocolo sendo utilizado (informado no item anterior).
1. O que significa o campo “Source” na Figura 11?
2. O que significa o campo “Destination” na Figura 11?
Analisando um pacote detalhadamente
A listagem mostrada na Figura 11 é importante para lhe dar uma visão mais geral da comunicação, pois ela permite identificar quais pacotes foram transmitidos e em que ordem. Mas muitas vezes é necessário analisar detalhes de alguns pacotes. Na Figura 11, mostramos apenas uma parte da tela do Wireshark que aparece após a captura dos pacotes. Para mostrarmos a tela completa, onde podemos ver detalhes de cada pacote, vamos realizar um ping entre duas máquinas e capturar os pacotes. Assuma uma rede composta pelas três máquinas mostradas na Figura 12.
Figura 12 – Três máquinas em uma rede
Imagine que a máquina B realizou um ping para a máquina A, conforme mostrado na Figura 13. O ping usa as mensagens “Echo Request” e “Echo Response” do protocolo ICMP. Desse modo, a máquina que realiza ping envia para a outra a mensagem “Echo Request”, e a máquina que recebe esta mensagem envia de volta a mensagem “Echo Response”.
Figura 13 – Máquina B realizou um ping para a máquina A
O ping é útil para verificarmos se conseguimos nos comunicar com uma determinada máquina e para termos uma ideia do tempo em que a comunicação demora.
Por isso, em uma saída típica do comando ping, como a que pode ser vista na Figura 13, ele informa se recebeu o “Echo Reply” para cada pacote transmitido (icmp_seq=), e quanto tempo depois do envio do “Echo Request” essa resposta foi recebida (time=).
Desse modo, vemos que para os quatro primeiros pacotes transmitidos, as respostas foram recebidas. Veja que o tempo em que cada resposta (Echo Reply) chegou é diferente, pois ele depende do tráfego presente na rede durante aquela comunicação.
Por padrão, o ping envia pacotes contendo 64 bytes, mas esse valor pode ser alterado. Quando estiver apenas interessado em verificar se consegue se comunicar com outra máquina, 64 bytes está bom. Mas quando estiver interessado em analisar o tempo em que os pacotes demoram para serem transmitidos, é bom aumentar o tamanho dos pacotes para que eles estejam mais próximos do tamanho real utilizado pela maioria das aplicações. Um bom valor para utilizar seria, por exemplo, 1400 bytes. Basta acrescentar “-s tam” ao ping, onde “Tam” é o tamanho do pacote em bytes. Ex. ping –s 1400 10.1.1.1
Após essa pequena “pausa” para falarmos do ping, vamos agora voltar ao Wireshark e a questão de como podemos ver os detalhes de cada pacote. Lembrando que cada pacote ICMP é enviado dentro de um pacote IP, veja na Figura 14 a tela completa do Wireshark após a captura dos pacotes de ping realizada de B para A.
Figura 14 – Pacotes capturados de um ping de B para A com o Wireshark
Na Figura 14 você pode ver que a tela onde os pacotes capturados são exibidos é formada por três partes, a, b e c. Em a vemos a mesma parte da tela do Wireshark que foi mostrada na Figura 11, sendo que agora reduzimos seu tamanho para vermos também as informações mostradas em b e c.
Em a podemos ver que o primeiro pacote capturado foi um pacote ICMP (campo Protocol) do tipo Echo Request (campoInfo) enviado pela máquina com IP 10.1.1.2 (campo source) para a máquina 10.1.1.1 (campo destination). A segunda linha em a mostra que 10.1.1.1 enviou a resposta quando haviam passado 0.000067 segundos (campo Time) desde que a captura de pacotes tinha sido iniciada.
A parte identificada por b mostra informações individuais do pacote, separando essas informações de acordo com os cabeçalhos de cada protocolo existente no pacote. Cada linha mostra informações sobre um protocolo. Desse modo, a segunda linha de b mostra informações sobre o quadro Ethernet, a terceira linha sobre a o protocolo IP e a quarta linha sobre o protocolo ICMP. A primeira linha mostra informações relacionadas principalmente ao tempo em que o pacote foi capturado.
Em c o conteúdo do pacote é mostrado exatamente como ele é recebido, ou seja, como uma sequência de bytes. Essas informações são utilizadas para realizar análises mais profundas nos protocolos. Normalmente você vai analisar apenas as informações mostradas em a e b.
As informações mostradas em b e c são referentes ao pacote que estiver selecionado em a. Para selecionar um pacote em a basta clicar nele uma vez. Na Figura 14 o pacote selecionado em a é o de número 2. Se você clicar duas vezes sobre um pacote em a as informações contidas em b e c também serão mostradas, só que em uma outra janela.
Podemos expandir as informações mostradas em b para cada protocolo, ou seja, ver as informações de cada protocolo em detalhes. Nas próximas quatro figuras expandimos um item de b por vez. Todas as informações mostradas são referentes ao pacote de número 2, que é um pacote ICMP de Echo Reply enviado de 10.1.1.1 para 10.1.1.2.
Na Figura 15 expandimos a primeira linha em b, de modo que você pode ver que os detalhes mostrados são referentes principalmente à hora em que o pacote foi capturado, seu tamanho e quais protocolos estão contidos no pacote.
Figura 15 – Informações básicas sobre o pacote capturado
Na Figura 16 expandimos a segunda linha em b, que mostra informações sobre a camada de enlace utilizada para transmitir o quadro. Você pode ver que se tratava de um quadro Ethernet.
Desse modo, são mostrados os valores contidos nos campos endereço de destino (Destination) e endereço de origem (Source) do quadro, além do valor do campo de tipo (Type). Pelos valores mostrados você vê que o quadro foi enviado da máquina cujo endereço Ethernet da placa de rede é AA:AA:AA:00:00:01 para a máquina com endereço Ethernet AA:AA:AA:00:00:02.
Se você olhar a Figura 12, verá que esses são os endereços das máquinas A e B, respectivamente. Ou seja, da máquina que recebeu o ping para a que o enviou. O valor 0x0800 contido no campo de tipo (Type) mostra que o conteúdo do quadro Ethernet é um pacote IP. 0x0800 é o valor em hexadecimal do código do protocolo IP.
Figura 16 – Informações da camada de enlace
Ao expandimos a terceira linha em b, vemos as informações referentes ao cabeçalho IP, conforme mostrado na Figura 17. Não vamos descrever todos os campos, mas você pode observar que o pacote foi enviado a partir do endereço IP (Source) 10.1.1.1 para a máquina com o endereço 10.1.1.2.
Além disso, você pode observar que o campo Protocol contém o código do protocolo ICMP, que é o número 0x01 (em hexadecimal). Lembre-se que este campo indica qual é o protocolo contido na parte de dados do pacote IP!
Figura 17 – Informações do protocolo IP
Finalmente, ao expandirmos a quarta linha de b vemos as informações referentes ao cabeçalho do protocolo ICMP, conforme mostrado na Figura 18. Os campos Type e Code, ambos com o valor zero, significam que se trata de uma pacote “Echo Reply”. O valor 1 no campo “Sequence number” (Número de sequência) mostra que se trata de uma resposta relativa ao primeiro pacote enviado pela máquina 10.1.1.2.
Figura 18 – Informações do protocolo ICMP
Utilizando filtros
Como explicamos anteriormente, o Wireshark permite que você utilize filtros para selecionar quais pacotes serão capturados, ou para selecionar entre os pacotes já capturados quais serão exibidos na tela. Para o primeiro caso utilize o menu “Edit->Find Packet”, e depois clique no botão “Filter”. Para o segundo caso clique no menu “Capture->Options” e depois clique no botão “Filter”.
O Wireshark já vem com uma série de filtros, e você ainda pode criar seus próprios filtros através do menu “Capture-> Capture Filters”.
Um filtro nada mais é do que uma regra contendo nomes de campos dos protocolos contidos nos pacotes e os valores que cada campo deve conter. Se um pacote contém o valor especificado no filtro para o referido campo ele “casa” com o filtro.
Um exemplo de filtro simples pode ser que o endereço IP do pacote seja X.X.X.X (substituindo X.X.X.X pelo endereço desejado). Outro filtro simples pode ser que o protocolo seja TCP e a porta seja 80.
A tela onde se escolhe um filtro para aplicar ou se permite a criação de um novo filtro é a mesma, e está mostrada na Figura 19.
Figura 19 – Filtros no Wireshark
Veja ainda na Figura 19 que, ao clicarmos sobre um filtro na parte inferior da tela, aparece o texto (string) que equivale a este filtro.
Com o tempo você pode começar a aprender esta “linguagem” e preferir escrever as regras do filtro ao invés de selecioná-las na tela mostrada na Figura 19. Conforme mostrado na Figura 20, existe um campo na interface do Wireshark que lhe permite escrever os filtros usados para selecionar os pacotes exibidos. No exemplo, o filtro faz com que sejam exibidos apenas os pacotes do protocolo ARP. Você estudará esse protocolo na próxima aula.
Figura 20 – Especificando um filtro através de texto
Recursos disponíveis por plataforma
Saiba que nem todas as interfaces (Bluetooth, Ethernet, USB, WLAN, Loopback etc.) são suportadas nas versões do Wireshark para todos os sistemas operacionais. Verifique se a interface que pretende utilizar é suportada no seu sistema operacional no link . Adiantamos que Ethernet e WLAN são suportadas no Windows, Linux e Mac.
Tcpdump
Uma das ferramentas de captura de pacotes mais tradicionais no Linux é o tcpdump [4]. Apesar de não possuir uma interface gráfica, ele ainda é até hoje muito utilizado.
Lembra-se da linguagem de filtros do Wireshark? Pois é, digamos que no tcpdump essa é a única forma de definir os filtros.
Caso esteja pensando por que você iria deixar de usar uma ferramenta que possui uma ótima interface gráfica para usar uma em modo texto, temos duas respostas.
A primeira é agilidade. É bem mais rápido digitar um comando do que abrir um programa gráfico e utilizar seus menus.
A segunda é que muitas vezes você precisa capturar pacotes em servidores que não têm uma interface gráfica instalada. Mas não se preocupe. Normalmente nesses casos os filtros que você vai precisar usar são bem simples.
Você normalmente vai estar mais interessado em verificar se determinados pacotes chegaram até a máquina onde você está executando a ferramenta do que propriamente em analisar detalhadamente os campos do pacote. Nesses casos, a interface gráfica realmente não faz tanta diferença.
Vamos capturar os mesmos pacotes do exemplo mostrado na Figura 13, onde a máquina B, que possui o endereço IP 10.1.1.2, enviou um ping para a máquina A, que possui o endereço IP 10.1.1.1. A Figura 21 mostra o comando e a saída do tcpdump.
Figura 21 – Pacotes capturados com tcpdump
Veja que a sintaxe é bem simples. O “-i eth0” é para indicar de qual placa de rede os pacotes devem ser capturados. Caso não fosse informado, o padrão é capturar da eth0. Portanto, nesse caso bastava termos digitado “tcpdump”.
Além disso, você pode observar que as informações exibidas são praticamente as mesmas do Wireshark (só que mais resumidas), com a diferença que não aparecem os nomes dos campos. A Tabela 1 mostra outros exemplos do uso do tcpdump.
Comando Significado
tcpdump src 10.1.1.1 and icmp Pacotes ICMP cujo IP de origem seja 10.1.1.1.
Tcpdump dst 10.1.1.2 and tcp and dst port 80 Pacotes cujo endereço IP de destino seja 10.1.1.2, o protocolo de transporte seja TCP e a porta de destino seja 80.
Tcpdump host 10.1.1.1 Pacotes cujo endereço IP de origem ou o de destino seja 10.1.1.1.
Tabela 1 – Exemplos do uso do tcpdump
Resumo
Nesta aula você aprendeu um novo tipo de ferramenta, que são as ferramentas de captura de pacotes. Estudou qual a finalidade delas e aprendeu a utilizar dois programas diferentes: o Wireshark e o tcpdump. Aprendeu que essas ferramentas mostram as informações dos cabeçalhos de cada protocolo existente no pacote e possuem uma linguagem de filtro para se especificar quais pacotes devem ser capturados. Também analisou em detalhes como o programa ping, que utiliza o protocolo ICMP, funciona.
1. Através de qual menu é possível especificar um filtro para selecionar entre todos os pacotes capturados quais devem ser mostrados na tela?
2. Qual a expressão de texto para um filtro que deve capturar apenas pacotes IP transmitidos ou recebidos do IP 192.168.1.2 (Dica: olhe os filtros que já existem)?
3. O que significa o campo “Time” na lista de pacotes capturados?
4. É possível utilizar o Wireshark para capturar pacotes transmitidos entre quaisquer duas máquinas da sua rede sem executá-lo como root (administrador)?
5. Acesse o Laboratório1 desta aula (Aula 3) no Virtualbox. Sabendo que essa rede utiliza um hub, realize um ping da máquina A para a máquina B, e tente capturar os pacotes ICMP transmitidos na máquina C. Isso será possível?
Referencias
KUROSE, James. Redes de computadores e a internet: uma abordagem Top-down. 4. ed. São Paulo: Perason Education, 2010. p.572-573.
TCPDUMP. Disponível em: . Acesso em: 23 jul. 2010.
WIKIPÉDIA. Promiscuous mode. Disponível em: . Acesso em: 22 jul. 2010.
WIRESHARK. Disponível em: . Acesso em: 21 jul. 2010.
Esta aula é a última das três aulas desta disciplina que são dedicadas a lhe ensinar a trabalhar com ferramentas que além de serem muito utilizadas pelas pessoas que administram redes de computadores, são utilizadas nesta disciplina como forma de lhe proporcionar a prática dos conteúdos ministrados.
Nesta aula estudaremos um tipo de ferramenta que consegue capturar pacotes transmitidos em uma rede. Esse tipo de programa é muito útil para análise da rede e detecção de problemas. Veremos um programa que trabalha em modo texto, o Tcpdump,e outro que utiliza uma interface gráfica, o Wireshark.
Ao final desta aula você será capaz de:
• Utilizar a ferramenta Wireshark para capturar pacotes na rede.
• Utilizar a ferramenta Tcpdump para capturar pacotes na rede.
• Entender a forma como os pacotes são exibidos, de modo que possa interpretar as informações mostradas nos pacotes capturados.
• Identificar em que máquina da rede executar a ferramenta de captura de pacotes.
Captura de pacotes
Como você estudou na disciplina de Sistemas de Conectividade, quando se deseja transmitir uma mensagem pela rede, cada camada TCP/IP na máquina de origem acrescenta um cabeçalho a essa informação. Na máquina de destino as camadas equivalentes retiram esses cabeçalhos.
Você viu também que o conjunto cabeçalho + mensagem de cada camada recebe um nome. Na camada de enlace o chamamos de quadro, na camada de rede de pacote, na camada de transporte de segmento e na camada de aplicação de mensagem.
Nesta aula você estudará uma ferramenta que permite a captura dos quadros transmitidos e recebidos por uma placa de rede.
Como um quadro contém um pacote, que por sua vez pode conter um segmento, que por sua vez pode conter uma mensagem, esse tipo de ferramenta é genericamente chamada de ferramenta de captura de pacotes,e não captura de quadros.
Desse modo, as ferramentas de captura de pacotes nos mostram informações de todas as camadas do modelo TCP/IP que estão presentes no pacote capturado.
Suponha, por exemplo, que você capturou um pacote gerado pela aplicação ping em uma máquina com uma placa de rede Ethernet. Como a informação enviada pelo ping é uma mensagem do protocolo ICMP, que é transmitida dentro de um pacote IP, que por sua vez é transmitido dentro de um quadro Ethernet, a ferramenta de captura irá lhe mostrar informações sobre os cabeçalhos Ethernet, IP e ICMP.
Como outro exemplo, suponha que você capturou informações transmitidas entre um browser e um servidor Web. Como a Web utiliza o protocolo HTTP (um protocolo de aplicação), que é transmitido dentro de segmentos TCP (protocolo de transporte), e cada segmento TCP é transmitido dentro de um pacote IP, que é transmitido dentro de um quadro Ethernet, a ferramenta de captura irá lhe mostrar informações sobre os cabeçalhos Ethernet, IP, TCP e HTTP.
Ressaltamos que a ferramenta de captura de pacotes mostra as informações dos cabeçalhos, mas naturalmente ela mostra todos os dados contidos no pacote.
Lembre-se também que embora o comportamento padrão de uma placa de rede seja descartar todos os quadros que não são destinados a ela, nem ao endereço de broadcast, pode-se configurar a placa para receber todos os quadros, o que caracteriza o modo promíscuo.
Como já visto em Sistemas de Conectividade, isso se chama modo promíscuo, ou modo espião. Quando executamos uma ferramenta de captura de pacotes normalmente ela trabalha utilizando o modo espião. Evidentemente, para poder usar esse modo, é necessário que o usuário seja administrador da máquina.
Você deve estar perguntando: “em que máquina eu devo executar a ferramenta de captura de pacotes?”. Pois bem, isso vai depender da finalidade para a qual você está executando a ferramenta. Mas lembre-se de que os dados devem passar por essa máquina para poderem ser capturados. Supondo que você pretende analisar uma comunicação entre as máquinas A e B, as alternativas são:
i. Em um roteador no caminho entre A e B;
ii. na máquina A;
iii. na máquina B;
iv. caso a rede onde A (ou B) se encontra use um hub, em uma outra máquina ligada no mesmo hub;
v. caso A (ou B) esteja em uma rede sem fio, nessa mesma rede sem fio (desde que a rede não esteja usando criptografia).
Wireshark
O Wireshark é um dos programas de captura de pacotes mais utilizados. Ele mostra os dados e as informações dos cabeçalhos dos protocolos contidos nos pacotes capturados.
Por ser um software Open source, o usuário pode modificar o código para melhor se adaptar às suas necessidades, assim como a documentação que está sob os termos da GNU (General Public License), ou seja, permite sua cópia, modificação e distribuição. Mas não se assuste! Dificilmente alguém precisa fazer isso, e você vai usar o programa sem precisar fazer modificação alguma nele!
Existem versões do Wireshark para as plataformas Windows, Linux, MacOs, Solaris, FreeBSD, entre outros. Isso é muito bom, porque evita que você tenha que aprender a utilizar vários programas diferentes para realizar a mesma tarefa.
O programa wireshark é muito usado por profissionais de redes, como:
• Administradores, com o objetivo de solucionar problemas na rede;
• Engenheiros de segurança, com o objetivo de verificar possíveis problemas na segurança;
• Desenvolvedores, para encontrar possíveis bugs na implementação do protocolo;
• Estudantes, como o objetivo de melhorar o entendimento acerca dos protocolos utilizados em redes de computadores.
Vale salientar que o Wireshark também é muito usado pelos hackers para fins ilícitos, ou seja, para fins que contrariam a lei, pois com ele é possível encontrar falhas nas implementações dos protocolos, capturar senhas e obter outras informações.
Instalação do Wireshark
Nesta seção mostraremos como realizar a instalação do Wireshark, como usar o menu e alguns elementos básicos da sua interface gráfica.
Utilizamos para esta aula a distribuição do GNU/Linux Ubuntu 9.10 e 10.04LTS, mas os passos são os mesmos para qualquer distribuição Linux baseada no Debian. Ilustraremos parte das imagens com letras do alfabeto latino (A-Z) para que você se situe melhor em relação à explicação.
Várias distribuições Linux, como é o caso do Ubuntu, mantêm todos os seus programas disponíveis em diversos servidores na Internet, e possuem um sistema de instalação de programas (chamado Gerenciador de Pacotes) que faz o download dos arquivos a serem instalados diretamente destes servidores. Ou seja, não é necessário que você faça o download dos arquivos e depois execute o programa de instalação. Você pode utilizar o gerenciador de pacotes, que se chama “apt”, para procurar os programas disponíveis e mandar instalar o programa desejado. Ele será então baixado da Internet e instalado. O gerenciador pode ser executado através do modo texto com o comando apt-get install, ou através do modo gráfico usando o menu Aplicativos->Central de Programas Ubuntu.Veremos os dois modos a seguir.
Temos duas observações importantes sobre o Gerenciador de Pacotes do Linux. A primeira é que você já o utilizou nas duas aulas anteriores para instalar os programas Virtualbox e Opensh-server. A segunda observação é que nesse contexto que estamos falando no momento (Gerenciador de Pacotes), o termo Pacotese refere a Programas (e não a um quadro de rede).
Para a instalação em modo texto inicialmente você deve abrir um terminal. Isso pode ser feito usando o menu mostrado na Figura 1. Para a melhor visualização do processo, você pode assistir este vídeo: , que mostra os passos da instalação do Wireshark no Ubuntu.
Figura 1 – Imagem de abertura do Terminal (gnome-terminal).
Para a instalação e execução do Wireshark o usuário deverá ter permissão máxima, ou seja, ser super usuário (root). O comando Linux que transforma o usuário em superusuário é o sudo su, conforme mostrado na Figura 2. Lembramos que as operações usadas nesta aula são aceitas em qualquer distribuição baseada no debian.
Figura 2 – Acesso como superusuário.
Na Figura 3 é apresentado o comando usado (apt-get install) para instalar um aplicativo existente nos repositórios Linux através do gerenciador de pacotes (programas) apt. Caso deseje mais informações sobre o apt, você pode consultar a página .
Figura 3 – Instalação a partir do apt-get
Como dissemos, também é possível instalar o Wireshark a partir do modo gráfico, conforme mostrado nas Figuras 4, 5 e 6. Inicialmente abra a Central de Programas do Ubuntu, clicando em Aplicativos->Central de Programas Ubuntu,conforme mostrado em a na Figura 4.
Figura 4 – Instalação por meio da Central de Programas do Ubuntu
Depois, digite a palavra wireshark no campo indicado com a letra b na Figura 5, para mostrar os programas com esse nome que estão disponíveis no repositório Linux.
Figura 5 – Localização do programa Wireshark para ser instalado
Clique então sobre o programa Wireshark que será mostrado, e depois clique em instalar, como mostrado em c na Figura 6.
Figura 6 – Inicializando a instalação do Wireshark
Utilizando o Wireshark
Após a instalação do wireshark, vamos agora executá-lo e aprender a utilizá-lo. Lembramos que a execução do Wireshark deverá ser como superusuário (root), de modo que você deve digitar o comando sudo su antes de executar o wireshark. Para iniciar o programa usamos o comando wireshark.
Porém, desta forma o programa ficará atrelado ao Terminal, ou seja, se o terminal for encerrado o programa também o será. Outra forma de executar o programa é acrescentar o caractere & após seu nome, fazendo com que o programa execute em background (segundo plano), liberando, assim, o terminal para que você possa utilizá-lo. O comando ficaria assim: wireshark & , como mostrado na Figura 7.
Figura 7 – Execução do Wireshark
Ao executar o comando mostrado na Figura 7, o wireshark irá iniciar e teremos a tela mostrada na Figura 8.
A chave apontada pela letra a nessa Figura mostra as interfaces presentes no computador que podem ser usadas para capturar os pacotes. Basta clicar sobre o nome da interface para que a captura de pacotes seja iniciada. Saiba que os nomes das interfaces podem mudar de computador para computador, pois elas dependem do hardware presente em sua máquina e como o sistema operacional o chama. A interface deve ser a usada para ter acesso à rede.
No Linux o nome das placas de rede Ethernet são eth0, eth1, e assim sucessivamente, e as placas de rede sem fio (wireless) são chamadas de wlan0, wlan1, e assim sucessivamente.
Vale lembrar que você pode escolher capturar os pacotes em modo promíscuo (promiscuous mode) ou não promíscuo.
No modo promíscuo, a interface aceitará todos os pacotes da rede que chegarem nela, mesmo os que não são destinados à mesma. O modo desejado é informado no filtro, que será explicado posteriormente.
Figura 8 – Tela inicial do Wireshark
1. Para que serve colocar o caractere & após o nome do programa Wireshark quando vamos executar esse programa através do terminal?
2. O que significa modo promíscuo?
Menus
Agora que você já sabe instalar, executar e escolher a interface de rede de onde capturar os pacotes, vamos mostrar em detalhes as opções disponíveis no menu principal do Wireshark, que é mostrado na Figura 9. Clicar em qualquer uma das palavras desse menu irá levar a um outro menu mais específico, que é descrito a seguir.
Figura 9 – Menu do Wireshark
File (Arquivo): É possível salvar as informações capturadas em um arquivo para que possam ser analisadas posteriormente. Este menu contém itens que possibilitam salvar as informações em um arquivo, abrir um arquivo salvo anteriormente, imprimir, exportar (salvar em um formato padrão, como txt). Além disso, existe a opção sair, que fecha o programa.
Edit (Editar): Este menu contém itens que possibilitam encontrar um pacote específico dentre todos os pacotes capturados. Para isso aplicamos um filtro, que consiste em especificar alguma informação sobre o pacote desejado. Após aplicar o filtro apenas os pacotes que “casam” com ele são exibidos. Outra opção muito importante deste menu é Preferências, que permite configurar várias coisas sobre a aparência e o modo de funcionamento do programa.
View (Visualizar): Este menu contém itens que controlam a exibição dos dados capturados, como por exemplo a coloração de pacotes, ampliação da fonte, exibição do pacote em uma janela separada, entre outros.
Go (Ir): Este menu contém itens que permitem ir para um pacote específico.
Capture (Captura): Este menu contém itens que lhe permitem iniciar e parar a captura de pacotes, além de definir filtros a serem aplicados na captura. Enquanto os filtros utilizados no menu Edit (Submenu Find Packet – Localizar pacotes)controlam os pacotes que são exibidos na tela, os filtros especificados no submenu Options deste menu controlam os pacotes que serão capturados. O submenu “Capture Filters” (Filtros de captura) deste menu permite que você crie novos filtros. Na sessão “Filtros” desta aula daremos mais detalhes sobre eles.
Analyze (Analisar): Este menu contém itens que permitem manipular filtros de tela, ativar ou desativar a dissecção de protocolos. Você não precisa se preocupar muito com esse menu porque normalmente ele não é muito utilizado.
Statistic (Estatística): Este menu contém itens que exibem janelas com estatísticas diversas, incluindo um resumo dos pacotes que foram capturados, hierarquia de protocolos e muito mais.
Telephony (Telefonia): Este menu contém itens que exibem várias estatísticas relacionadas com janelas de telefonia, incluindo uma análise de mídia, diagramas de fluxo e muito mais. Você não precisa se preocupar muito com esse menu porque normalmente ele não é muito utilizado.
Tools (Ferramentas): Este menu contém várias ferramentas disponíveis no Wireshark, como a criação de Regras de ACL do Firewall.
Help (Ajuda): Este menu contém itens para ajudar o usuário, por exemplo, no acesso a uma lista dos protocolos suportados, páginas de manual ou o acesso online às páginas relacionadas.
Talvez depois de olhar tantas opções de menu você esteja achando que utilizar o Wireshark é muito complicado. Não se preocupe, com o tempo você verá que na prática a maioria dessas opções não é usada frequentemente. Muitas vezes você apenas clica no nome da interface para iniciar a captura e clica nos pacotes que deseje ver mais detalhes. Realmente a utilização do Wireshark é bem simples! Olhe a descrição dos botões apresentada a seguir que você já verá um número bem menor de opções, mas que fornecem a maioria das operações que você vai precisar.
1. Abra o Wireshark como administrador ou superusuário.
2. Escolha a interface de rede que está utilizando para comunicar. Ex.: Eth0.
3. Tente identificar os pacotes que são capturados. Ex: ICMP causado pelo ping.
Botões de atalho
Algumas das operações discutidas acima, na Figura 9, podem ser executadas a partir de um atalho, como mostraremos agora.
Figura 10 – Aba de botões de atalho
: Captura de interfaces.
: Mostra a opção de captura.
: Inicia a captura.
: Para a captura.
: Reinicia a captura.
Listagem dos pacotes capturados
A parte mais importante que você precisa saber é analisar os pacotes.
Portanto, vamos agora começar a ver como o Wireshark mostra os pacotes para você. Nessa seção você verá como o Wireshark lhe apresenta a lista dos pacotes capturados, e na próxima seção aprenderá a ver os detalhes de cada pacote.
A listagem dos pacotes capturados é mostrada na Figura 11. Essa tela irá aparecer após você iniciar a captura dos pacotes, que pode ser feita, como já dissemos, clicando no nome da interface, selecionando uma opção do menu ou clicando em um botão.
Figura 11 – Painel Lista de Pacotes
A seguir discutiremos o que significam os campos identificados com as letras de “a” até “f” na Figura 11.
a No. : Número do pacote na lista dos pacotes capturados. Como você pode perceber, esse número é sequencial, e é incrementado cada vez que um pacote é capturado.
b Time: Tempo de timestamp do pacote. Informa o instante decorrido desde o início da captura até o momento em que o referido pacote foi capturado. É útil, por exemplo, para você analisar o tempo decorrido entre dois pacotes quaisquer, como o tempo decorrido entre o envio de um pacote que solicitou uma página web a um servidor e o pacote de resposta, contendo a página, enviado pelo servidor.
c Source: Endereço IP de origem, ou seja, qual máquina transmitiu o pacote.
d Destination: Endereço de destino, ou seja, para qual máquina o pacote deve ser entregue.
e Protocol: Protocolo usado na transferência do pacote.
f Info: Informações adicionais sobre o conteúdo do pacote. As informações que são mostradas dependem do tipo de protocolo sendo utilizado (informado no item anterior).
1. O que significa o campo “Source” na Figura 11?
2. O que significa o campo “Destination” na Figura 11?
Analisando um pacote detalhadamente
A listagem mostrada na Figura 11 é importante para lhe dar uma visão mais geral da comunicação, pois ela permite identificar quais pacotes foram transmitidos e em que ordem. Mas muitas vezes é necessário analisar detalhes de alguns pacotes. Na Figura 11, mostramos apenas uma parte da tela do Wireshark que aparece após a captura dos pacotes. Para mostrarmos a tela completa, onde podemos ver detalhes de cada pacote, vamos realizar um ping entre duas máquinas e capturar os pacotes. Assuma uma rede composta pelas três máquinas mostradas na Figura 12.
Figura 12 – Três máquinas em uma rede
Imagine que a máquina B realizou um ping para a máquina A, conforme mostrado na Figura 13. O ping usa as mensagens “Echo Request” e “Echo Response” do protocolo ICMP. Desse modo, a máquina que realiza ping envia para a outra a mensagem “Echo Request”, e a máquina que recebe esta mensagem envia de volta a mensagem “Echo Response”.
Figura 13 – Máquina B realizou um ping para a máquina A
O ping é útil para verificarmos se conseguimos nos comunicar com uma determinada máquina e para termos uma ideia do tempo em que a comunicação demora.
Por isso, em uma saída típica do comando ping, como a que pode ser vista na Figura 13, ele informa se recebeu o “Echo Reply” para cada pacote transmitido (icmp_seq=), e quanto tempo depois do envio do “Echo Request” essa resposta foi recebida (time=).
Desse modo, vemos que para os quatro primeiros pacotes transmitidos, as respostas foram recebidas. Veja que o tempo em que cada resposta (Echo Reply) chegou é diferente, pois ele depende do tráfego presente na rede durante aquela comunicação.
Por padrão, o ping envia pacotes contendo 64 bytes, mas esse valor pode ser alterado. Quando estiver apenas interessado em verificar se consegue se comunicar com outra máquina, 64 bytes está bom. Mas quando estiver interessado em analisar o tempo em que os pacotes demoram para serem transmitidos, é bom aumentar o tamanho dos pacotes para que eles estejam mais próximos do tamanho real utilizado pela maioria das aplicações. Um bom valor para utilizar seria, por exemplo, 1400 bytes. Basta acrescentar “-s tam” ao ping, onde “Tam” é o tamanho do pacote em bytes. Ex. ping –s 1400 10.1.1.1
Após essa pequena “pausa” para falarmos do ping, vamos agora voltar ao Wireshark e a questão de como podemos ver os detalhes de cada pacote. Lembrando que cada pacote ICMP é enviado dentro de um pacote IP, veja na Figura 14 a tela completa do Wireshark após a captura dos pacotes de ping realizada de B para A.
Figura 14 – Pacotes capturados de um ping de B para A com o Wireshark
Na Figura 14 você pode ver que a tela onde os pacotes capturados são exibidos é formada por três partes, a, b e c. Em a vemos a mesma parte da tela do Wireshark que foi mostrada na Figura 11, sendo que agora reduzimos seu tamanho para vermos também as informações mostradas em b e c.
Em a podemos ver que o primeiro pacote capturado foi um pacote ICMP (campo Protocol) do tipo Echo Request (campoInfo) enviado pela máquina com IP 10.1.1.2 (campo source) para a máquina 10.1.1.1 (campo destination). A segunda linha em a mostra que 10.1.1.1 enviou a resposta quando haviam passado 0.000067 segundos (campo Time) desde que a captura de pacotes tinha sido iniciada.
A parte identificada por b mostra informações individuais do pacote, separando essas informações de acordo com os cabeçalhos de cada protocolo existente no pacote. Cada linha mostra informações sobre um protocolo. Desse modo, a segunda linha de b mostra informações sobre o quadro Ethernet, a terceira linha sobre a o protocolo IP e a quarta linha sobre o protocolo ICMP. A primeira linha mostra informações relacionadas principalmente ao tempo em que o pacote foi capturado.
Em c o conteúdo do pacote é mostrado exatamente como ele é recebido, ou seja, como uma sequência de bytes. Essas informações são utilizadas para realizar análises mais profundas nos protocolos. Normalmente você vai analisar apenas as informações mostradas em a e b.
As informações mostradas em b e c são referentes ao pacote que estiver selecionado em a. Para selecionar um pacote em a basta clicar nele uma vez. Na Figura 14 o pacote selecionado em a é o de número 2. Se você clicar duas vezes sobre um pacote em a as informações contidas em b e c também serão mostradas, só que em uma outra janela.
Podemos expandir as informações mostradas em b para cada protocolo, ou seja, ver as informações de cada protocolo em detalhes. Nas próximas quatro figuras expandimos um item de b por vez. Todas as informações mostradas são referentes ao pacote de número 2, que é um pacote ICMP de Echo Reply enviado de 10.1.1.1 para 10.1.1.2.
Na Figura 15 expandimos a primeira linha em b, de modo que você pode ver que os detalhes mostrados são referentes principalmente à hora em que o pacote foi capturado, seu tamanho e quais protocolos estão contidos no pacote.
Figura 15 – Informações básicas sobre o pacote capturado
Na Figura 16 expandimos a segunda linha em b, que mostra informações sobre a camada de enlace utilizada para transmitir o quadro. Você pode ver que se tratava de um quadro Ethernet.
Desse modo, são mostrados os valores contidos nos campos endereço de destino (Destination) e endereço de origem (Source) do quadro, além do valor do campo de tipo (Type). Pelos valores mostrados você vê que o quadro foi enviado da máquina cujo endereço Ethernet da placa de rede é AA:AA:AA:00:00:01 para a máquina com endereço Ethernet AA:AA:AA:00:00:02.
Se você olhar a Figura 12, verá que esses são os endereços das máquinas A e B, respectivamente. Ou seja, da máquina que recebeu o ping para a que o enviou. O valor 0x0800 contido no campo de tipo (Type) mostra que o conteúdo do quadro Ethernet é um pacote IP. 0x0800 é o valor em hexadecimal do código do protocolo IP.
Figura 16 – Informações da camada de enlace
Ao expandimos a terceira linha em b, vemos as informações referentes ao cabeçalho IP, conforme mostrado na Figura 17. Não vamos descrever todos os campos, mas você pode observar que o pacote foi enviado a partir do endereço IP (Source) 10.1.1.1 para a máquina com o endereço 10.1.1.2.
Além disso, você pode observar que o campo Protocol contém o código do protocolo ICMP, que é o número 0x01 (em hexadecimal). Lembre-se que este campo indica qual é o protocolo contido na parte de dados do pacote IP!
Figura 17 – Informações do protocolo IP
Finalmente, ao expandirmos a quarta linha de b vemos as informações referentes ao cabeçalho do protocolo ICMP, conforme mostrado na Figura 18. Os campos Type e Code, ambos com o valor zero, significam que se trata de uma pacote “Echo Reply”. O valor 1 no campo “Sequence number” (Número de sequência) mostra que se trata de uma resposta relativa ao primeiro pacote enviado pela máquina 10.1.1.2.
Figura 18 – Informações do protocolo ICMP
Utilizando filtros
Como explicamos anteriormente, o Wireshark permite que você utilize filtros para selecionar quais pacotes serão capturados, ou para selecionar entre os pacotes já capturados quais serão exibidos na tela. Para o primeiro caso utilize o menu “Edit->Find Packet”, e depois clique no botão “Filter”. Para o segundo caso clique no menu “Capture->Options” e depois clique no botão “Filter”.
O Wireshark já vem com uma série de filtros, e você ainda pode criar seus próprios filtros através do menu “Capture-> Capture Filters”.
Um filtro nada mais é do que uma regra contendo nomes de campos dos protocolos contidos nos pacotes e os valores que cada campo deve conter. Se um pacote contém o valor especificado no filtro para o referido campo ele “casa” com o filtro.
Um exemplo de filtro simples pode ser que o endereço IP do pacote seja X.X.X.X (substituindo X.X.X.X pelo endereço desejado). Outro filtro simples pode ser que o protocolo seja TCP e a porta seja 80.
A tela onde se escolhe um filtro para aplicar ou se permite a criação de um novo filtro é a mesma, e está mostrada na Figura 19.
Figura 19 – Filtros no Wireshark
Veja ainda na Figura 19 que, ao clicarmos sobre um filtro na parte inferior da tela, aparece o texto (string) que equivale a este filtro.
Com o tempo você pode começar a aprender esta “linguagem” e preferir escrever as regras do filtro ao invés de selecioná-las na tela mostrada na Figura 19. Conforme mostrado na Figura 20, existe um campo na interface do Wireshark que lhe permite escrever os filtros usados para selecionar os pacotes exibidos. No exemplo, o filtro faz com que sejam exibidos apenas os pacotes do protocolo ARP. Você estudará esse protocolo na próxima aula.
Figura 20 – Especificando um filtro através de texto
Recursos disponíveis por plataforma
Saiba que nem todas as interfaces (Bluetooth, Ethernet, USB, WLAN, Loopback etc.) são suportadas nas versões do Wireshark para todos os sistemas operacionais. Verifique se a interface que pretende utilizar é suportada no seu sistema operacional no link . Adiantamos que Ethernet e WLAN são suportadas no Windows, Linux e Mac.
Tcpdump
Uma das ferramentas de captura de pacotes mais tradicionais no Linux é o tcpdump [4]. Apesar de não possuir uma interface gráfica, ele ainda é até hoje muito utilizado.
Lembra-se da linguagem de filtros do Wireshark? Pois é, digamos que no tcpdump essa é a única forma de definir os filtros.
Caso esteja pensando por que você iria deixar de usar uma ferramenta que possui uma ótima interface gráfica para usar uma em modo texto, temos duas respostas.
A primeira é agilidade. É bem mais rápido digitar um comando do que abrir um programa gráfico e utilizar seus menus.
A segunda é que muitas vezes você precisa capturar pacotes em servidores que não têm uma interface gráfica instalada. Mas não se preocupe. Normalmente nesses casos os filtros que você vai precisar usar são bem simples.
Você normalmente vai estar mais interessado em verificar se determinados pacotes chegaram até a máquina onde você está executando a ferramenta do que propriamente em analisar detalhadamente os campos do pacote. Nesses casos, a interface gráfica realmente não faz tanta diferença.
Vamos capturar os mesmos pacotes do exemplo mostrado na Figura 13, onde a máquina B, que possui o endereço IP 10.1.1.2, enviou um ping para a máquina A, que possui o endereço IP 10.1.1.1. A Figura 21 mostra o comando e a saída do tcpdump.
Figura 21 – Pacotes capturados com tcpdump
Veja que a sintaxe é bem simples. O “-i eth0” é para indicar de qual placa de rede os pacotes devem ser capturados. Caso não fosse informado, o padrão é capturar da eth0. Portanto, nesse caso bastava termos digitado “tcpdump”.
Além disso, você pode observar que as informações exibidas são praticamente as mesmas do Wireshark (só que mais resumidas), com a diferença que não aparecem os nomes dos campos. A Tabela 1 mostra outros exemplos do uso do tcpdump.
Comando Significado
tcpdump src 10.1.1.1 and icmp Pacotes ICMP cujo IP de origem seja 10.1.1.1.
Tcpdump dst 10.1.1.2 and tcp and dst port 80 Pacotes cujo endereço IP de destino seja 10.1.1.2, o protocolo de transporte seja TCP e a porta de destino seja 80.
Tcpdump host 10.1.1.1 Pacotes cujo endereço IP de origem ou o de destino seja 10.1.1.1.
Tabela 1 – Exemplos do uso do tcpdump
Resumo
Nesta aula você aprendeu um novo tipo de ferramenta, que são as ferramentas de captura de pacotes. Estudou qual a finalidade delas e aprendeu a utilizar dois programas diferentes: o Wireshark e o tcpdump. Aprendeu que essas ferramentas mostram as informações dos cabeçalhos de cada protocolo existente no pacote e possuem uma linguagem de filtro para se especificar quais pacotes devem ser capturados. Também analisou em detalhes como o programa ping, que utiliza o protocolo ICMP, funciona.
1. Através de qual menu é possível especificar um filtro para selecionar entre todos os pacotes capturados quais devem ser mostrados na tela?
2. Qual a expressão de texto para um filtro que deve capturar apenas pacotes IP transmitidos ou recebidos do IP 192.168.1.2 (Dica: olhe os filtros que já existem)?
3. O que significa o campo “Time” na lista de pacotes capturados?
4. É possível utilizar o Wireshark para capturar pacotes transmitidos entre quaisquer duas máquinas da sua rede sem executá-lo como root (administrador)?
5. Acesse o Laboratório1 desta aula (Aula 3) no Virtualbox. Sabendo que essa rede utiliza um hub, realize um ping da máquina A para a máquina B, e tente capturar os pacotes ICMP transmitidos na máquina C. Isso será possível?
esta aula você aprenderá um protocolo que é de fundamental importância para que a pilha de protocolos TCP/IP possa ser utilizada com qualquer tecnologia de rede física, como Ethernet ou as redes sem fio 802.11, por exemplo. Verá que este protocolo se chama ARP (Address Resolution Protocol, ou seja, Protocolo de Resolução de Endereços), e tem como principal função descobrir o endereço MAC da máquina para qual um dado pacote IP deve ser entregue. Você aprenderá porque isso é necessário e como essa tarefa é realizada.
• Aprender que o protocolo ARP é utilizado para traduzir endereços de rede para endereços de enlace, e que normalmente traduz um endereço IP para um endereço Ethernet.
• Entender por que a tradução de endereços de rede para endereços de enlace é necessária.
• Entender como a tradução de endereços de rede para endereços de enlace é realizada.
• Utilizar uma ferramenta para monitorar o processo de tradução de endereços.
Por que o protocolo ARP é necessário
Você sabe que nas redes que utilizam o protocolo IP, como é o caso da Internet e da maioria das redes das empresas atualmente, os dados são transmitidos entre as máquinas em pacotes IP, e que cada pacote contém o endereço IP da máquina que está enviando o pacote e o endereço IP da máquina para a qual ele deve ser entregue. A Figura 1 mostra o pacote IP que é gerado quando uma máquina A quer enviar dados para uma máquina C. Naturalmente os demais campos do cabeçalho IP e os cabeçalhos das camadas de transporte e de aplicação foram omitidos.
Figura 1 - Transmissão usando um pacote IP
Acontece, como você também já sabe, que não existe nenhuma placa de rede que fale IP, que é um protocolo da camada de rede. As placas de rede implementam a camada de enlace, portanto, comunicam-se enviando quadros no formato definido pela sua tecnologia, como, por exemplo, Ethernet ou 802.11. Naturalmente, do mesmo modo que os pacotes IP contêm campos para os endereços IP, os quadros também contêm os endereços de enlace (chamados endereços MAC) da máquina que gerou o quadro e da máquina para a qual ele deve ser entregue. Lembre-se de que endereço MAC é o mesmo que endereço da placa de rede.
O pacote IP é transmitido dentro da parte de dados do quadro utilizado pela placa de rede. Assim sendo, para que o pacote IP seja entregue à máquina desejada, precisamos colocar no campo de endereço MAC de destino do quadro o endereço MAC da máquina que possui o IP com quem queremos falar. O problema é que o usuário não sabe o endereço MAC da máquina com quem quer falar, ele conhece apenas o endereço IP dela! A Figura 2 mostra como o pacote IP da Figura 1 realmente precisaria ser transmitido. Vamos assumir que a rede utilizada é da tecnologia Ethernet.
Figura 2 - Enviando um pacote IP dentro do Ethernet
Veja que o campo Endereço Ethernet de origem é preenchido com o endereço da placa de rede da máquina local (de onde o pacote será enviado), mas o endereço Ethernet de destino não é conhecido. Portanto, é necessário que exista algum mecanismo automático para se descobrir o endereço Ethernet associado a um endereço IP. Esse mecanismo existe e é o ARP (Protocolo para Resolução de Endereços, do inglês Address Resolution Protocol).
Embora o ARP seja um protocolo genérico que é capaz de traduzir endereços de qualquer protocolo de rede para endereços de qualquer protocolo de enlace, normalmente seu uso mais frequente é traduzir endereços IP para endereços Ethernet, ou endereços IP para endereços MAC 802.11 nas redes sem fio.
Nos nossos exemplos iremos utilizar a tradução de endereços IP para Ethernet, mas os mesmos procedimentos explicados se aplicam para outros protocolos e tecnologias de enlace.
Em nossos exemplos utilizamos endereços Ethernet que tenham algo em comum com o endereço IP da máquina, para que fique mais fácil de você lembrar. O último byte do endereço Ethernet, por exemplo, normalmente será igual ao último byte do endereço IP. Mas lembre-se de que, na realidade, os endereços Ethernet não mantêm nenhuma relação com o IP. Quando você compra uma placa de rede ela já tem seu endereço Ethernet!
Para finalizar esta seção, veja na Figura 3 onde o protocolo ARP se situa na pilha de protocolos TCP/IP.
Figura 3 - Posição do ARP na pilha de protocolos TCP/IP
Funcionamento do ARP
Vamos agora entender como o ARP consegue descobrir o endereço Ethernet associado a um endereço IP. Antes dessa explicação é importante que você se lembre que uma máquina pode enviar um quadro Ethernet para uma única outra máquina ou para todas as outras máquinas da rede. No primeiro caso, o endereço da placa de rede da máquina de destino é colocado no campo de endereço de destino do quadro, e este quadro é entregue apenas à máquina de destino. No seguindo caso, o campo endereço de destino do quadro é preenchido com o endereço especialFF:FF:FF:FF:FF:FF, chamado “Endereço de Broadcast”, fazendo com que o quadro seja entregue a todas as máquinas da rede.
O ARP se aproveita dessa capacidade de enviar um quadro para todas as máquinas da rede para resolver o seu problema de forma muito simples. Ele apenas envia uma mensagem em broadcast (ou seja, para todas as máquinas da rede) dizendo: “Por favor, quem tem o endereço IP X.X.X.X, informe qual é seu endereço Ethernet”. Evidentemente, X.X.X.X é substituído pelo endereço IP para o qual ela quer descobrir o Ethernet. Como todas as máquinas recebem esta pergunta, a máquina que tiver o endereço IP X.X.X.X responde informando seu Ethernet. É importante observar que essa resposta não é enviada em broadcast! Ela é enviada diretamente para quem fez a pergunta. Isso é possível porque o endereço de quem fez a pergunta está no quadro Ethernet que o destino recebeu, no campo endereço de origem.
A mensagem ARP é transmitida dentro da parte de dados do Ethernet, portanto, o campo tipo do quadro Ethernet contém o código do protocolo ARP, que é 0x0806 (em hexadecimal). Além disso, naturalmente, o pacote IP só será transmitido após o envio do quadro ARP e do recebimento da resposta. Ainda sobre o valor do campo tipo, nos nossos exemplos, quando mostrarmos um quadro utilizaremos a palavra “ARP” ao invés do código numérico, pois fica mais fácil de entender. Mas lembre-se que de fato é utilizado o valor numérico!
A Figura 4 mostra como ocorre a comunicação mostrada na Figura 2, onde a máquina 10.1.1.1 quer transmitir um pacote IP para a máquina 10.1.1.3, e, para isso, utiliza o ARP para descobrir seu endereço Ethernet. Na Figura 4(a) a máquina “A” envia uma mensagem ARP em broadcast perguntando quem tem o IP 10.1.1.3. Veja que o campo tipo do quadro Ethernet contém a identificação do protocolo ARP, e que todas as outras máquinas da rede, no caso, B e C, recebem o quadro, uma vez que ele foi enviado para o endereço de broadcast (FF:FF:FF:FF:FF:FF).
Figura 4(a) - Envio de requisição ARP para descobrir o endereço Ethernet
Na Figura 4(b) vemos que apenas a máquina C responde à mensagem ARP, pois ela possui o endereço IP para o qual se deseja descobrir o endereço Ethernet. As outras máquinas, no caso a máquina B, descartam a mensagem ARP. Você pode observar ainda que apenas a máquina A recebe esta resposta, pois o quadro é enviado diretamente para o seu endereço (AA:AA:AA:01:01:01).
Figura 4(b) - Envio de resposta ARP informando o endereço Ethernet
Finalmente, na Figura 4(c), vemos que após receber a resposta ARP informando qual é o endereço Ethernet (AA:AA:AA:00:00:03) associado ao endereço IP de C (10.1.1.3), o pacote IP que precisa ser enviado para ela é colocado dentro de um quadro Ethernet e enviado.
Figura 4(c) - Envio do pacote IP após utilização do ARP
1. Quais os endereços colocados nos camposendereço de origem e endereço de destino de um quadro Ethernet contendo uma mensagem de requisição ARP?
2. Qual o valor do campo de tipo de um quadro Ethernet contendo uma mensagem de resposta ARP?
Formato das Mensagens ARP
Na seção anterior nós descrevemos as mensagem ARPs contendo apenas dois campos: um para o endereço IP e outro para o endereço Ethernet. Na verdade, como o ARP pode funcionar com vários protocolos de camada de rede e vários protocolos de camada de enlace, as mensagens ARP possuem campos para identificar quais protocolos são utilizados.
Antes de vermos esses campos, saiba que existem apenas dois tipos de mensagem, uma para perguntar pelo endereço Ethernet associado a um IP, chamada ARP Request, e outra, chamada ARP Reply, para responder essa requisição, onde a máquina informa o Ethernet associado ao IP. Além disso, as duas possuem exatamente os mesmos campos, sendo diferenciadas pelo valor contido em um dos campos do quadro, que indica o tipo de operação. A Tabela 1 mostra os campos de uma mensagem ARP e o significado de cada um.
Nome do Campo Tamanho
(em bytes) Descricao
Tipo Hardware 2 Código da tecnologia da camada de enlace (Ex: Ethernet. 0x0001 - hexadecimal)
Tipo Protocolo 2 Código do Protocolo de Rede (Ex: IP. 0x0800 - hexadecimal)
Tam End. Hw 1 Tamanho do endereço de enlace (em bytes). Se for Ethernet, contém o valor 6.
Tam End. Proto 1 Tamanho do endereço de Rede (em bytes). Se for IP, contém o valor 4.
Operação 2 Código do tipo de mensagem: 0x0001 para o ARP Request, 0x0002 para o ARP Reply.
Endereço Hardware Origem - Endereço de Enlace da origem. O tamanho deste campo é o valor do campo “Tam End. Hw”
Endereço Protocolo Origem - Endereço de Rede da origem. O tamanho deste campo é o valor do campo “Tam End. Proto”
Endereço Hardware destino - Endereço de Enlace da origem. Se for Ethernet, o tamanho é 6 bytes.
Endereço Protocolo Destino - Endereço de Enlace da origem. Se for IP, o tamanho é 4 bytes.
Tabela 1 - Campos do quadro ARP
Para entendermos melhor como os campos de endereço são utilizados, vamos ver os valores que realmente são enviados nos campos de endereço das mensagens ARP trocadas entre as máquinas A e C do exemplo mostrado na sessão anterior – Figuras 3(a) e 3(b). As duas mensagens são enviadas em quadros Ethernet contendo no campo de tipo o código do ARP (0x0806 – Hexadecimal), sendo que o ARP Resquest é enviado para o endereço de broadcast Ethernet, enquanto o ARP reply é enviado diretamente para o endereço Ethernet de A.
Arp Request
Enviada por A ARP Reply
Enviada por C
Endereço Hardware Origem AA:AA:AA:00:00:01 AA:AA:AA:00:00:03
Endereço Protocolo Origem 10.1.1.1 10.1.1.3
Endereço Hardware destino 00:00:00:00:00:00:00 AA:AA:AA:00:00:01
Endereço Protocolo Destino 10.1.1.3 10.1.1.1
Tabela 2 - Valores dos campos de endereço para a comunicação entre A e C
Observe que no ARP Resquest o endereço IP de origem é preenchido com zeros, pois é exatamente este endereço que desejamos descobrir.
1. Em um quadro que contém uma mensagem ARP, qual campo devemos olhar para saber se é uma mensagem ARP Request ou ARP Reply?
Cache ARP
Embora o modelo descrito na seção anterior resolva o problema da resolução de endereços, ele apresenta dois efeitos colaterais negativos. O primeiro ocorre pelo fato de enviar mensagens pela rede, pois isso faz com que haja um tempo (atraso) até que a resposta do ARP chegue, causando um atraso no envio do pacote que se deseja transmitir. O segundo efeito negativo se deve ao fato das mensagens serem transmitidas a todas as máquinas na rede. Isso aumenta o volume de tráfego nessa rede, podendo levar a uma redução no seu desempenho. O ideal é que a maior parte da capacidade de transmissão de uma rede seja destinada aos dados das aplicações dos usuários. Quanto mais informações para outras finalidades a rede transmitir, como é o caso do ARP, menos banda de rede sobre para os usuários.
Para minimizar os dois problemas citados, o ARP utiliza uma tabela (chamada de cache arp) onde ele guarda as informações que já descobriu. As duas principais colunas desta tabela são endereço IP e endereço MAC. Desse modo, cada linha desta tabela contém um endereço IP e o seu endereço MAC (tipicamente um endereço Ethernet ou 802.11).
Usando a tabela, o funcionamento do ARP fica da seguinte maneira: quando uma máquina precisa enviar um pacote para um determinada endereço IP, ela primeiro verifica se este endereço IP já se encontra na tabela ARP. Se ele existir lá, basta obter seu endereço Ethernet a partir da tabela. Neste caso, nenhuma mensagem é enviada. Caso o endereço IP não exista na tabela, aí sim, é enviada a mensagem ARP (ARP request) pela rede. Quando a resposta do ARP chegar (ARP Reply), além de ser utilizada para o envio do pacote IP, é inserida uma entrada na tabela cache associando o IP e o Ethernet. A Figura 5 mostra um fluxograma que descreve o funcionamento do ARP.
Figura 5 - Fluxograma do ARP usando a tabela cache
Veja que o fluxograma mostra que pode existir uma situação onde enviamos uma requisição ARP e não recebemos resposta. Isso é normal, e acontecerá sempre que tentarmos acessar um endereço IP para o qual não existe nenhuma máquina na nossa rede. Isso acontecerá, por exemplo, quando a máquina que você tenta acessar está desligada. Nesses casos, embora não tenha sido mostrado no fluxograma, também será inserida uma entrada na tabela cache para o endereço IP, mas não haverá um endereço Ethernet associado. Essa entrada servirá apenas para vermos que já tentamos nos comunicar com aquele IP e não conseguimos resposta. Portanto, sempre que alguém precisar se comunicar com esse IP, uma nova requisição ARP será enviada pela rede!
É importante observar que as entradas cadastradas na tabela cache não podem ficar lá para sempre. Para entender por que, suponha, por exemplo, que descobrimos que o endereço IP 200.1.1.1 está associado ao endereço Ethernet AA:AA:AA:01:01:01 e inserimos esta entrada na tabela cache. Descobrimos também que o endereço IP 200.2.2.2 está associado ao endereço Ethernet AA:AA:AA:02:02:02 e inserimos esta entrada na tabela cache. Podem acontecer as seguintes duas situações que levariam a um erro:
• depois de algum tempo, as máquinas podem ter sido reinicializadas e terem obtido outros endereços IP. Suponha que após a reinicialização a máquina com endereço Ethernet AA:AA:AA01:01:01, obteve-se o endereço IP 200.2.2.2 e a máquina com endereço Ethernet AA:AA:AA:02:02:02 obteve o endereço IP 200.1.1.1. Se você usasse as informações que estão na tabela cache, quando tentasse transmitir um pacote para o endereço IP 200.1.1.1 você o enviaria para o endereço Ethernet AA:AA:AA:01:01:01, o que está errado! Como esse endereço MAC agora está associado ao IP 200.2.2.2, você enviaria o pacote para a máquina errada!
• a placa de rede da máquina 200.1.1.1 que possuía endereço Ethernet AA:AA:AA01:01:01 pode ter dado algum problema e ter sido trocada por outra. Como o endereço Ethernet é um endereço gravado na própria placa, a nova placa de rede terá outro endereço Ethernet! Portanto, se continuasse usando as informações armazenadas na tabela cache inicialmente, você não conseguiria mais se comunicar com a máquina 200.1.1.1.
Para minimizar os dois problemas citados, cada linha da tabela cache possui uma terceira coluna, que guarda uma informação de tempo, chama timestamp. Essa coluna contém o instante do tempo em que a entrada foi inserida na tabela. Assim, se depois de certo tempo em que foi inserida a entrada não for utilizada, ela é removida. Além disso, mesmo as entradas utilizadas são removidas depois de certo tempo (que naturalmente é maior que o das entradas não utilizadas). Por fim, saiba que a tabela cache de ARP é normalmente chamada apenas de “Tabela ARP”.
1. Para que serve a Tabela ARP?
Manipulando a cache
Podemos facilmente listar o conteúdo da tabela ARP a partir de comandos do sistema operacional. O comando para listar o conteúdo da tabela é: arp –n. Vamos usar este comando vendo alguns exemplos práticos.
Quando tudo dá certo
Supondo que temos uma rede como a mostrada na Figura 3. Vamos ver o que acontece quando a máquina A (10.1.1.1) vai enviar um ping para a máquina C (10.1.1.3).
Suponha que a máquina A acabou de ser ligada e ainda não se comunicou com ninguém. Desse modo, antes de executar o comando ping na máquina A podemos ver que sua tabela ARP está vazia, digitando o comando arp –n. Veja na Figura 6 que nada é mostrado.
Figura 6 - Tabela ARP vazia
A seguir, o usuário da máquina A realiza o comando ping para a máquina C. Como podemos ver na Figura 7, a máquina C enviou as respostas, de modo que o comando foi bem sucedido.
Figura 7 - Comando Ping executado com sucesso
Como a máquina A precisou descobrir o Ethernet associado ao endereço de C (10.1.1.3) para poder lhe enviar os pacotes, ela lhe enviou primeiro uma mensagem ARP e colocou a resposta na Tabela ARP (cache). Podemos verificar isso digitando o comando arp –n na máquina A, conforme mostrado na Figura 8.
Figura 8 - Tabela ARP contendo o endereço Ethernet associado ao IP 10.1.13
A coluna Address mostra o endereço IP ao qual o Ethernet mostrado na coluna HWaddress está associado. A colunaHWtype diz que o tipo do endereço da coluna HWaddress é um endereço Ethernet, e a coluna Iface diz qual das placas de rede da máquina A está conectada na rede onde a máquina C se encontra (lembre-se que se a máquina A fosse um roteador ela teria mais de uma placa de rede).
Como já explicamos antes, essa entrada fica guardada na Tabela ARP por certo tempo (tipicamente dois minutos) e depois é apagada. Durante o tempo em que ela está na cachê, se a máquina A tentar se comunicar com a máquina C, não será necessário enviar uma nova mensagem ARP. Depois que ela for excluída a próxima tentativa de comunicação com C irá gerar novamente uma mensagem ARP e a resposta será incluída na Cache. O processo continua sempre desse modo, com as informações sendo incluídas e apagadas da cache. Portanto, se esperássemos aproximadamente 2 minutos e executássemos o comando arp –n novamente na máquina A, veríamos que sua tabela ARP estaria vazia novamente.
Otimização do ARP
Normalmente uma máquina que recebe um pacote IP de outra envia pacotes de volta para esta máquina. Assim sendo, quando uma máquina recebe uma requisição ARP ela pode já inserir o endereço IP e o Ethernet da máquina que lhe enviou o quadro na sua tabela cache. Isso evita que ela precise enviar uma requisição ARP para a máquina de origem quando tentar se comunicar com ela.
Desse modo, no exemplo que mostramos – a máquina A enviando um ping para a máquina C –, a máquina C, ao receber a requisição ARP perguntando pelo seu IP (10.1.1.3), já insere o endereço IP (10.1.1.1) e o Ethernet (AA:AA:AA:00:00:01) da máquina A na sua cache. Assim, quando C for responder ao ping, o endereço Ethernet de A já vai ser conhecido e não será necessário enviar uma nova requisição ARP. Na Figura 9, mostramos a tabela ARP da máquina C após receber o ping de A. Veja que foi inserida uma entrada para o IP e Ethernet de A.
Figura 9 - Tabela Cache da Máquina C após receber ping de A
Talvez você esteja se perguntando: “Espere aí, como tenho certeza se essa entrada foi inserida automaticamente quando C recebeu o ARP ou após ele tentar enviar a resposta do ping?”
Se você pensou isso, tem razão. Apenas olhando a tabela não dá para saber, pois quando C tentasse enviar a resposta do ping, ele iria primeiro enviar uma mensagem ARP para A, de modo que a tabela seria preenchida do mesmo jeito!
Para termos certeza que C não enviou nenhuma mensagem de requisição ARP, basta capturarmos os quadros transmitidos. Isso pode ser feito em A, em C, ou em qualquer máquina da rede, uma vez que os quadros são enviados em broadcast. Vamos capturar na máquina B – veja Figura 4(c). Na Figura 10, que mostra os quadros capturados durante o envio e a resposta do ping de A para C, você pode ver que em nenhum momento C envia mensagens de requisição ARP para A! Ele envia apenas a resposta ao pedido feito por A.
A linha 4 da Figura 10 mostra a mensagem de ARP Request (requisição), onde 10.1.1.1 perguntou quem tem (Who-has) o IP 10.1.1.3. A linha 5, mostra o ARP Reply (resposta), onde 10.1.1.3 responde dizendo que o endereço Ethernet é (is-at) AA:AA:AA:00:00:03. As demais 6 linhas representam os três pacotes ping trocados entre as máquinas. Desse modo, as linhas 6 e 7 são referentes ao primeiro pacote ping (veja a indicação seq 1), e mostram, respectivamente, a requisição ping enviada de 10.1.1.1 para 10.1.1.3 e a resposta enviada de 10.1.1.3 para 10.1.1.1.
Figura 10 - Captura de quadros na rede durante a comunicação entre A e C
Quando não obtemos resposta
Vamos ver agora como fica a tabela ARP quando tentamos nos comunicar com alguém que não responde a mensagem ARP (provavelmente porque a máquina está desligada, ou porque digitamos um endereço IP que não pertence a ninguém da rede).
Figura 11 - Tabela ARP com endereço Ethernet não localizado
Veja na Figura 11 que inicialmente enviamos um ping para o endereço IP 10.1.1.5, para o qual sabemos não existir nenhuma máquina com este endereço na rede. A resposta do ping, “Destination Host Unreachable”, significa “Máquina de Destino Inalcançável”, ou seja, ninguém respondeu ao ping enviado. A verdade é que o ping nem mesmo chegou a ser enviado! Como a máquina de origem e a de destino pertencem à mesma rede (10.1.1.0), a máquina A enviou primeiro uma mensagem ARP perguntando pelo Ethernet de 10.1.1.5, mas ninguém respondeu! O valor “(incomplete)“ na coluna HWaddress mostra que não foi possível descobrir o endereço Ethernet associado ao IP 10.1.1.5. Como esta entrada na tabela está “incompleta”, sempre que alguém tentar se comunicar com o endereço IP 10.1.1.5 uma nova mensagem ARP será enviada.
Alterando a tabela ARP
Além de verificar o conteúdo da cache também é possível excluir alguma entrada ou cadastrar uma entrada de modo permanente. Saiba, entretanto, que normalmente você não precisa utilizar esses comandos, pois o ARP funciona sem requer nenhuma configuração.
O cadastro permanente de endereços na cache é chamado estático e asentradas inseridas desta forma nunca são apagadas depois de certo tempo. Embora forneça um nível maior de segurança que o modo dinâmico, pois dificulta a tentativa de alguém em se passar por um determinado endereço, é menos flexível que o modo dinâmico. – se a máquina mudar seu IP ou Ethernet, você terá que mudar o registro manualmente. O comando para inserir um registro associando o endereço Ethernet xx:xx:xx:xx:xx:xx com o IP A.B.C.D é: arp –s A.B.C.D xx:xx:xx:xx:xx:xx.
A exclusão de registros da cache é muito utilizada quando você quer fazer testes, e eventualmente quando você detecta que algum endereço na cache ainda não foi atualizado após você trocar a placa de rede de alguma máquina. A Figura 12 mostra como é possível excluir o endereço Ethernet associado a um IP. Veja que após a exclusão o endereço aparece como “incompleto”.
Figura 12 - Excluindo um endereço Ethernet da tabela ARP
Máquinas em redes diferentes e o ARP
Vamos agora analisar o que acontece com o ARP em um cenário diferente do que usamos nos exemplos anteriores, onde todas as máquinas estavam na mesma rede. Nesse nosso cenário, que é mostrado na Figura 13, as máquinas A e C estão em duas redes diferentes, e a máquina B é agora um roteador que possui duas placas de rede, uma conectada a cada rede.
Figura 13 - ARP com máquinas em redes diferentes
Observe que a placa de rede eth0 de B possui IP 10.1.1.1 e Ethernet AA:AA:AA:00:01:01, e a placa eth1 possui IP 10.2.2.1 e Ethernet AA:AA:AA:00:02:01. Além disso, o Gateway (roteador padrão) da máquina A é 10.1.1.1 e o Gateway da máquina C é 10.2.2.1. O que será que acontece quando A realiza um ping para C? Qual endereço Ethernet será colocado na Tabela ARP de A?
Vamos olhar logo como a tabela ARP fica, e depois explicamos. Veja na Figura 14 a tabela cache de A após o ping para C.
Figura 14 - Tabela ARP após ping para máquina em outra rede
Entendeu o que aconteceu? Ou seja, se tentamos nos comunicar com a máquina C, por que apareceram os endereços IP e Ethernet do roteador (máquina B)?
A resposta é que como A e C estão em redes diferentes, não há como enviar o pacote IP diretamente para C. Esse pacote precisa ser enviado para o roteador da rede onde A se encontra. Se tiver com dúvidas quanto a esse este assunto, volte na parte de roteamento da disciplina de Sistemas de Conectividade e faça uma revisão. Assim sendo, não faria sentido enviar uma ARP tentando descobrir o Ethernet de C.
Para enviar o pacote IP para o roteador é necessário colocar o endereço Ethernet do roteador no campo de destino do quadro Ethernet. É aqui que o ARP entra. Como a máquina B sabe o endereço IP do roteador da sua rede, ela envia uma requisição ARP perguntando por esse IP. Na verdade ela não quer enviar nenhum pacote para o endereço IP do roteador, ela quer apenas descobrir seu Ethernet!
A Figura 15 mostra os pacotes capturados (apenas os primeiros pacotes) na máquina B, quando a máquina A enviou um ping para C. Veja que B recebe uma requisição ARP vinda de A (10.1.1.2) para seu IP (10.1.1.1), e envia a resposta. Observe também que, embora os pacotes de ping sejam enviados ao roteador (para seu Ethernet), naturalmente o endereço IP de destino do pacote é o IP de C (10.2.2.2).
Figura 15 - Mensagens ARP quando as máquinas origem e destino estão em redes diferentes
Resumo
Nesta aula você aprendeu que o protocolo ARP traduz endereços da camada de rede para endereços da camada de enlace (endereços MAC), e que na maioria das redes esses protocolos são o IP e o Ethernet. Aprendeu que esse protocolo envia uma mensagem ARP Resquest para o endereço de broadcast da rede perguntando quem tem um determinado endereço IP. Viu que, após isso, a máquina que possui esse IP envia uma resposta diretamente para quem enviou a solicitação, contendo o Ethernet associado ao IP informado. Você aprendeu também que para reduzir o tráfego gerado na rede, e o tempo para obter a informação, o ARP faz uso de uma tabela cache (chamada de tabela ARP) que mantém os endereços (IP e Ethernet) recentemente descobertos.
Acesse o Laboratório 1 desta aula (Aula 1) no Virtualbox e realize os seguintes procedimentos.
1. Verifique a tabela ARP da máquina A.
2. Coloque o tcpdump para executar na máquina B. Execute um ping da máquina A para a máquina C. Depois verifique como ficaram as tabelas ARP das máquinas A, B, e C.
3. Verifique os pacotes capturados no passo anterior pelo tcpdump e veja se foram trocados os pacotes que você esperava.
4. Execute o ping de A para C novamente e veja os pacotes capturados em B.
5. Na máquina A, exclua a entrada referente ao IP de C e execute o ping novamente de A para C. Mais uma vez analise os pacotes capturados em B.
Na disciplina Sistemas de Conectividade nós estudamos o modelo OSI e o modelo TC/IP. Embora você tenha aprendido a função de todas as camadas, estudamos em detalhes apenas as seguintes camadas: física, enlace e rede. Para isso, estudamos protocolos como o Ethernet e o 802.11, que implementam as camadas física e de enlace, e o protocolo IP, que implementa a camada de rede. Além disso, na aula passada, você estudou o ARP que proporciona a integração do protocolo de rede com o de enlace. Nesta aula estudaremos dois protocolos que implementam a camada de transporte na pilha TCP/IP. Eles são o User Datagram Protocol (UDP – Protocolo de Datagrama do Usuário) e o Transmission Protocol Protocol (TCP – Protocolo de Controle da Transmissão). Saiba que praticamente todos os programas que você utiliza quando está acessando a Internet usam um desses dois protocolos.
Após o final desta aula você será capaz de:
• Entender como o protocolo TCP funciona, e o que ele oferece aos desenvolvedores de aplicações.
• Entender como o protocolo UDP funciona, e o que ele oferece aos desenvolvedores de aplicações.
• Saber qual protocolo de transporte utilizar quando for escrever um programa que transmita informações pela rede.
• Entender como os programas utilizam a camada de transporte.
A camada de transporte
Na Aula 5 da disciplina Sistemas de Conectividade, nós explicamos o modelo OSI e as principais funções de cada camada. Nesta aula vamos analisar em mais detalhes as principais funções que podem ser desempenhadas pela camada de transporte. É importante observar que algumas funções devem ser desempenhadas por qualquer protocolo de transporte, enquanto outras são opcionais. Por isso, existem vários protocolos de transporte e você deve escolher o que pretende utilizar nas suas aplicações. Após explicarmos os protocolos existentes vamos lhe dar parâmetros para ajudá-lo a fazer essa escolha.
Observe que enquanto a escolha dos protocolos de enlace e de rede é determinada pela rede onde a máquina será utilizada, a escolha do protocolo de transporte é de inteira responsabilidade do desenvolvedor da aplicação. O protocolo de transporte é apenas software, e esse software precisa estar instalado apenas nas máquinas que vão se comunicar pela rede. Ou seja, ele não precisa estar instalado nos roteadores ao longo do caminho, como acontece com o protocolo de rede! Isso acontece porque as informações dos cabeçalhos de transporte só precisam ser analisadas pela máquina que gera o pacote e pela máquina para quem ele é destinado.
Atualmente, praticamente todas as máquinas já vêm com os protocolos TCP e UDP instalados. Portanto, como normalmente você vai usar um deles, muito provavelmente você nunca vai precisar instalar um protocolo de transporte!
É muito importante que você compreenda como a camada de transporte funciona, por dois motivos. O primeiro é que dependendo da linguagem de programação que você utilize para escrever seus programas, você pode ter que lidar diretamente com detalhes da camada de transporte. Mesmo que você use uma linguagem de programação que esconda esses detalhes, proporcionando-lhe uma visão de “mais alto nível”, como se costuma dizer, o programa ainda vai estar usando a camada de transporte. Portanto, é importante que você saiba como ele está utilizando a rede. O segundo motivo é que para identificar problemas na comunicação feita pelos programas você vai acabar utilizando uma ferramenta como o Wireshark, estudado na Aula 3. Como você viu naquela aula, ele mostra detalhes dos pacotes transmitidos e é importante, por exemplo, que você saiba quais pacotes deveriam ter sido transmitidos pelo seu programa para poder identificar possíveis problemas.
Na próxima seção vamos analisar uma funcionalidade que deve ser fornecida por qualquer protocolo da camada de transporte. As demais funcionalidades que podem ser fornecidas por um protocolo de camada de transporte serão explicadas nas seções que abordam o TCP e o UDP.
Número de portas
Você já sabe que enquanto a camada de enlace possibilita que duas máquinas se comuniquem na mesma rede, a camada de rede permite que máquinas em redes diferentes se comuniquem. Assim sendo, você aprendeu que o protocolo IP é capaz de encaminhar um pacote IP para qualquer máquina na Internet, e para que isso seja possível, ele define uma forma de identificar cada máquina, que é o endereço IP.
A questão é que identificar a máquina para quem um pacote deve ser entregue normalmente é apenas uma parte do trabalho, pois geralmente os pacotes precisam ser entregues a programas (aplicações) que executam nas máquinas. Assim sendo, é necessário que exista algum mecanismo para identificar também cada aplicação que pretende transmitir/receber pacotes pela rede. Veja na Figura 1 que apenas com as informações do cabeçalho IP não é possível determinar para qual aplicação na máquina com endereço IP 10.1.1.1 o pacote deve ser entregue. Ou seja, o sistema operacional recebe o pacote ao ver que ele está destinado ao seu endereço IP, mas não tem como determinar para qual aplicação ele é.
Figura 1 - Como saber para qual aplicação entregar um pacote?
Para resolver esse problema, a camada de transporte oferece um mecanismo de identificação das aplicações chamado deporta. Uma porta nada mais é que um número (de dois bytes) que identifica cada aplicação. Na verdade, a porta identifica um “canal de comunicação” dentro da aplicação, uma vez que uma mesma aplicação pode utilizar várias portas.
A Figura 2 mostra uma máquina com duas aplicações, uma está utilizando a porta 25 e a outra a porta 80. Do mesmo modo que o cabeçalho de rede contém os endereços IP de origem e destino, o cabeçalho de transporte contém as portas de origem e destino (que de certo modo equivalem a endereços das aplicações dentro de cada máquina). Assim sendo, o número contido no campo referente à Porta de Destino é utilizado para identificar a aplicação para quem o pacote deve ser entregue. No caso da Figura 2, o pacote será entregue ao servidor Web, pois ele está registrado na porta 80, que é o número da porta de destino contido no pacote.
Figura 2 - Identificando a aplicação através do número de porta
Definindo qual número de porta utilizar
Agora você precisa entender como é definido o número de porta que cada aplicação vai utilizar. A atribuição de portas as aplicações funciona da seguinte maneira:
• Uma aplicação que pretende transmitir e/ou receber informações pela rede solicita uma porta ao sistema operacional. Ela pode informar o número da porta desejado ou deixar que o sistema operacional escolha uma.
• Caso a aplicação tenha informado o número de porta desejado, o sistema operacional analisa sua lista de números de portas ainda não atribuídas para as aplicações para ter certeza que o número solicitado está livre. Se ele estiver livre, esse número de porta é atribuído à aplicação. Caso o número solicitado já esteja sendo utilizado, será gerado um erro. Quando a aplicação não sugere nenhum número de porta, o sistema operacional escolhe um número dessa lista e o atribui à aplicação.
• O sistema operacional retira da lista de portas livres o número da porta fornecido à aplicação.
• O sistema operacional insere em uma lista de portas utilizadas o número da porta fornecido e o programa que solicitou a porta.
Como você pode observar na Figura 2, quando uma máquina transmite um pacote ela insere no cabeçalho de transporte o seu número de porta e o número da porta da aplicação com quem ela deseja se comunicar.
A afirmação anterior levanta duas questões muito importantes. A primeira é que tanto a aplicação cliente (que envia o pacote) quanto a servidora (que receberá o pacote) precisam de números de portas. Portanto, as duas realizaram o procedimento de pedir um número de porta ao sistema operacional. A segunda questão é como as aplicações sabem o número de porta utilizado pela outra, uma vez que o cliente e o servidor quase sempre utilizam portas diferentes. Vamos responder a essa segunda questão a seguir.
Porta nas aplicações que atuam como servidores
Os servidores utilizam um número de porta padronizado, ou seja, cada tipo de aplicação da Internet (web, e-mail, dns etc.) utiliza uma porta específica. Pegue como exemplo dois tipos de aplicações da Internet que você utiliza: e-mail e web. Os números de porta utilizados na Figura 2 não foram números inventados. Todos os servidores de e-mail utilizam a porta 25, e todos os servidores web utilizam a porta 80. Desse modo, quando um programa cliente de e-mail vai conectar em um servidor ele envia os pacotes para a porta 25. Do mesmo modo, quando o seu browser vai acessar um servidor web ele envia os pacotes para a porta 80 do servidor.
Se você criar uma aplicação você pode definir a porta que ela vai utilizar e deixar essa informação disponível para todos. Isso foi feito para as aplicações de banco de dados, por exemplo. O servidor de banco de dados SQL Server, por exemplo, utiliza a porta 1433, enquanto o Servidor de banco de dados MySQL utiliza a porta 3306.
Você pode estar pensando: como esse número de porta é utilizado, se você nunca o informa em nenhuma aplicação que utiliza? No browser, por exemplo, você coloca apenas o nome da máquina que quer conectar. A questão é que quando você não informa nenhum número de porta, os programas o inserem automaticamente nos pacotes que eles geram. O número de porta inserido é sempre o número de porta padrão para aquele tipo de aplicação. Quando a aplicação for um browser, o número inserido será 80, que é o número da porta padrão utilizada pelos servidores web.
Uma vez que os programas servidores sempre utilizam a mesma porta, talvez você já tenha percebido que eles sempre solicitam um número de porta específico ao sistema operacional. Os servidores web, por exemplo, solicitam a porta 80, e os servidores de e-mail solicitam a porta 25.
Como a maioria das aplicações padrão da Internet – e-mail, web, dns, FTP, entre outras – utilizam portas abaixo de 1024, para que um programa possa solicitar uma porta abaixo desse número você precisa estar logado como administrador da máquina. Isso foi feito para evitar que um programa de usuário obtenha a porta utilizada por um desses serviços e, quando a aplicação referente ao serviço for iniciada, a porta já esteja sendo utilizada pela aplicação do usuário. Essas portas abaixo de 1024 são chamadas de portas reservadas.
Acesse o site https://www.iana.org/assignments/port-numbers para conhecer os números de portas e suas descrições.
Porta nas aplicações que atuam como clientes
Naturalmente as aplicações “clientes” também precisam de um número de porta, mas esse número de porta não precisa ser fixo, como no caso das aplicações “servidoras”. Desse modo, as aplicações cliente não especificam a porta que pretendem utilizar. Ao invés disso, elas deixam que o sistema operacional lhes forneça uma porta qualquer. A porta oferecida pelo sistema operacional é sempre maior ou igual que 1024, para evitar conflito com as portas reservadas.
A questão é que o cliente sempre envia primeiro um pacote para outra máquina (o servidor), para só depois receber algum pacote. Como o número da porta que a aplicação que envia o pacote está utilizando (no caso o cliente) é inserido no pacote (no campo Porta de Origem), a aplicação que o recebe vai saber qual porta o cliente está utilizando. A Figura 3 ilustra este fato. Quando o browser na máquina com endereço IP 10.1.1.2 (cliente) quer acessar o servidor web na máquina com endereço IP 10.1.1.1 (servidor), ele envia seus pacotes para a porta 80, pois essa é a porta padrão de qualquer servidor web. Como o servidor web só envia alguma coisa para o browser após receber algum pacote dele, e esse pacote contém o número da porta utilizada pelo cliente (no caso 1300), o servidor pode obter o número da porta dos pacotes recebidos.
Figura 3 - Como o servidor descobre a porta do cliente
As aplicações cliente normalmente não solicitam a porta assim que são iniciadas. Ao invés disso, elas só solicitam a porta no momento que precisam transmitir alguma coisa. Após o término da transmissão elas liberam a porta. Além disso, qualquer aplicação pode usar mais de uma porta, como já dissemos antes. No caso do browser, imagine se você estiver fazendo o download de dois arquivos simultaneamente. Cada download estará usando uma porta diferente no cliente. O mesmo acontece quando você abre várias abas no browser para acessar diversas páginas – cada aba vai utilizar uma porta diferente.
1. O que são portas na camada de transporte?
2. Como o servidor descobre a porta de um cliente?
3. Se um programa executado por um usuário normal solicitar a porta 80 ao sistema operacional, a porta será atribuída a ele?
O Protocolo TCP
O protocolo TCP é o protocolo de transporte mais utilizado na Internet. A maioria das aplicações que você conhece como e-mail, web, FTP, P2P, entre outras, utiliza TCP, e nesta seção você vai entender o porquê. Vamos analisar separadamente cada uma das funcionalidades oferecidas pelo TCP, mas inicialmente você já deve saber que o TCP procura tornar a rede por onde os pacotes serão transmitidos confiável. Lembre-se que a camada de rede IP não é confiável, pois os pacotes IP podem ser perdidos e podem chegar fora de ordem no destino. Portanto, as duas principais funções do TCP são:
• garantir que os pacotes TCP sejam entregues à aplicação de destino na mesma ordem em que foram transmitidos pela aplicação de origem;
• garantir que todos os pacotes transmitidos sejam recebidos.
Além das duas funções acima, o TCP também oferece outras funcionalidades, como, por exemplo, garantir que a máquina de origem envie os pacotes em uma taxa que o receptor possa processá-los. A isso dá-se o nome de controle de fluxo, e você pode obter mais informações no endereço:
https://pt.wikipedia.org/wiki/Transmission_Control_Protocol
Vamos agora começar as funcionalidades do TCP.
Protocolo orientado à conexão
Para conseguir realizar todas essas tarefas o TCP precisa manter uma série de informações sobre a comunicação que está ocorrendo. Por isso, ele requer que uma conexão seja estabelecida entre as duas máquinas que desejam se comunicar, antes que as informações possam realmente ser transmitidas.
Estabelecer uma conexão significa que uma máquina vai pedir para conversar com a outra, de modo que ambas se preparem para controlar a comunicação que irá acontecer. Esse controle se refere, por exemplo, à criação de variáveis para armazenar informações sobre o andamento da comunicação.
Entre outras informações, o cabeçalho TCP possui um campo formado por diversos bits (chamados de flags) que indicam o tipodo pacote sendo transmitido. Esse tipo pode ser, por exemplo, se é um pacote de pedido de conexão ou um pacote de confirmação. A combinação dos flags definidos (possuem o valor 1) é que indica o tipo do pacote.
Para estabelecer uma conexão são trocados três pacotes, conforme mostrado na Figura 4, onde a máquina A estabelece uma conexão com a máquina B. Veja que a máquina A envia um pacote de solicitação de conexão (flag SYN definido), a máquina B responde aceitando a conexão (flags SYN e ACK definidos) e finalmente a máquina A avisa que recebeu a confirmação da conexão (pacote com apenas o flag ACK definido). Esse procedimento é chamado de Three-way-handshake em referência ao fato de serem trocados três pacotes para estabelecer a conexão.
Figura 4 - Estabelecimento de uma conexão TCP
Os três pacotes trocados durante a fase de estabelecimento da conexão contêm apenas o cabeçalho TCP e não contêm nada na parte de dados! Só após o estabelecimento da conexão é que os dados são, de fato, transmitidos. Conforme estudaremos na próxima seção, o TCP confirma os pacotes recebidos. Portanto, a fase de troca de dados, ou seja, a comunicação propriamente dita é composta de pacotes de dados e as confirmações. Quando não se deseja mais transmitir nada a conexão é fechada. Como uma conexão TCP é full-duplex, ou seja, podem-se transmitir dados nos dois sentidos, cada máquina precisa solicitar o fechamento da conexão. Isso é feito por pacotes com o flag FIN definido.
A Figura 5 mostra as três fases de uma conexão TCP: estabelecimento de conexão, transferência de dados, encerramento da conexão. Evidentemente os pacotes mostrados na fase de dados são apenas um exemplo, pois os pacotes trocados dependem de cada situação. O importante é observar que cada máquina pode transmitir dados para a outra, independentemente de quem abriu a conexão.
Figura 5 - Três fases de uma comunicação utilizando o TCP
Segmentação e blocagem
Quando a camada de transporte recebe dados da camada de aplicação para serem transmitidos, ela acrescenta seu cabeçalho à informação recebida e passa a PDU resultante para a camada de rede. Sobre esse cabeçalho você já sabe que ele deve conter o número da porta de origem e da porta de destino.
Embora formalmente o correto seja chamar a PDU da camada de transporte de segmento, iremos usar o termo Pacote TCP para nos referirmos a uma PDU TCP, pois esse termo é mais comumente utilizado na prática. Do mesmo modo, quando estivermos estudando o UDP iremos utilizar o termo Pacote UDP para nos referirmos a uma PDU UDP.
Figura 6 - Criação de um pacote TCP a partir dos dados recebidos da camada de aplicação
A Figura 6 mostra que o pacote TCP é inserido dentro da parte de dados de um pacote IP. Chamamos essa parte de dados deDados’ para ressaltar que ela é composta pelos Dados passados pela camada de aplicação acrescidos do cabeçalho TCP.
Entretanto, nem sempre é gerado exatamente um pacote TCP para cada solicitação de transmissão feita pela camada de aplicação. O TCP pode decidir dividir os Dadospassados pela camada de aplicação em duas ou mais partes e enviar cada uma delas em um pacote TCP separado. Esse procedimento de divisão é chamado segmentação. A Figura 7 mostra o caso onde uma solicitação de transmissão da camada de aplicação foi dividida em dois pacotes TCP.
Figura 7 - Divisão de uma mensagem de aplicação em dois pacotes TCP
Esse processo é chamado segmentação e normalmente é realizado para impedir que o pacote IP que vai ser gerado fique muito grande e precise ser dividido (fragmentação IP) porque não caberia na parte de dados da camada de enlace onde vai ser transmitido – por exemplo, uma rede Ethernet.
No exemplo acima, uma mensagem de aplicação foi dividida em dois pacotes TCP, mas pode acontecer também de o TCP juntar duas ou mais mensagens de aplicação em um único pacote TCP. Tal procedimento é chamado Blocagem. Isso acontece devido ao fato de que enviar pacotes muito pequenos reduz o desempenho da rede porque aumenta a quantidade de bytes de cabeçalho transmitidos em relação aos bytes de dados do usuário. Portanto, gasta-se mais banda de rede para informações de controle, como é o caso dos cabeçalhos.
A Figura 8 mostra o caso onde o TCP decide juntar duas mensagens de aplicação em um único pacote TCP. Isso tipicamente ocorrerá quando o tamanho das mensagens de aplicação for muito pequeno.
Figura 8 - Junção de duas mensagens de aplicação em um pacote TCP
Ordenamento dos pacotes
Como os pacotes TCP são transmitidos dentro de pacotes IP, eles podem chegar fora de ordem na máquina de destino. Para resolver esses problemas o TCP numera os pacotes que transmite e insere o número de cada pacote em um campo no seu cabeçalho. Desse modo, a máquina de destino pode colocar os pacotes na ordem antes de passá-los para a camada de aplicação.
Suponha que a máquina A transmitiu os pacotes 1, 2 e 3 para a máquina B, mas eles chegaram na máquina B na ordem 1, 3 e 2. Ao receber o pacote 1 o TCP o entrega para a camada de aplicação. Depois disso ele recebe o pacote 3, mas como ainda não recebeu o pacote de número 2, ele guarda o pacote 3 em um buffer até que receba o pacote 2. Quando isso acontecer ele entrega o pacote 2 e o pacote 3 para a camada de aplicação, nessa ordem.
Embora tenhamos dito que o campo do cabeçalho TCP para identificar os pacotes numera cada pacote (pacote 1, pacote 2 etc.), na verdade ele indica, contando com o primeiro byte do pacote, quantos bytes já foram transmitidos. Desse modo, se desde o início da conexão já tiverem sido transmitidos 5.000 bytes de A para B, o próximo pacote que A transmitir terá como “número do pacote” 5001. Apesar dessa diferença, a forma de usar este valor é a mesma, como se ele realmente fosse o número do pacote. Além disso, cada máquina mantém o seu contador, pois o número de bytes transmitidos em cada sentido da conexão normalmente é diferente. Iremos continuar nos referindo a ele como número do pacote porque deixa o texto muito mais simples, e conceitualmente é a mesma coisa – a diferença diz respeito apenas à forma como a ideia é implementada.
Controle de erros
Ainda devido ao fato dos pacotes TCP serem transmitidos dentro de pacotes IP, eles podem ser perdidos. Para resolver esse problema, um mecanismo de confirmação dos pacotes recebidos é acrescentado ao esquema de numeração dos pacotes TCP.
Para cada pacote transmitido o TCP inicia um temporizador. Cada pacote precisa ser confirmado pelo receptor antes que o temporizador expire. Se o temporizador expirar sem que a confirmação tenha chegado, o pacote é retransmitido pelo próprio TCP. Isso significa que o TCP guarda todos os pacotes ainda não confirmados em um buffer para que possa retransmiti-los caso seja necessário. Isso tudo ocorre sem que a aplicação que enviou o dado tome conhecimento. Ou seja, suponha que sua aplicação solicitou ao TCP que transmitisse uma mensagem e o TCP a colocou em um pacote que foi enviado para a máquina destino. Caso esse pacote fosse perdido, o próprio TCP detectaria e o retransmitiria, sem que seu programa precisasse ficar sabendo que o erro aconteceu! Isso simplifica bastante a escrita de programas.
Uma coisa importante é que quando se confirma um pacote de número X, isso significa que todos os pacotes com números menores que X são também confirmados. Portanto, se uma máquina recebeu os pacotes 1, 2 e 4, ela não pode confirmar o 4, pois isso estaria confirmando também os pacotes 1, 2 e 3. Nesse caso, ela confirmaria os pacotes 1 e 2 e esperaria o pacote 3 chegar para poder confirmar o pacote 4.
Os pacotes de confirmação contêm o número do pacote sendo confirmado e o flag ACK definido (valor 1). Entretanto, uma confirmação pode ser enviada em um pacote exclusivo para essa finalidade, ou seja, em um pacote que não contém dados, ou pode ser enviada em um pacote contendo dados. Como todos os pacotes TCP contêm o campo de flag ACK e o campo para informar o número do pacote confirmado, normalmente as confirmações são enviadas pegando carona nos pacotes de dados. Só se envia um pacote exclusivo para confirmação quando não há dados para transmitir no sentido da conexão que se necessita transmitir a confirmação.
Controle de fluxo
Os pacotes TCP que chegam a uma máquina ficam em um buffer até que sejam lidos pela aplicação. Quando a aplicação demora a ler esses dados o buffer pode encher, e se isso acontecer, a máquina não terá onde colocar os dados que chegarem. Para evitar esse problema o TCP possui um mecanismo que controla a quantidade de dados que uma máquina pode enviar para outra.
Para isso existe um campo no cabeçalho TCP onde cada máquina informa para a outra a quantidade de espaço livre no seu buffer. Se uma máquina informar 0 (zero), a outra para de transmitir. Sempre que o valor informado for maior que zero, a máquina pode transmitir no máximo a quantidade de bytes informada.
Além deste mecanismo, o TCP possui outros mecanismos complexos, que não estudaremos, mas que permitem que o TCP adapte a taxa com que envia os pacotes dependendo de como está o tráfego na rede.
Formato do pacote TCP
A Figura 9 mostra o formato do cabeçalho TCP. Explicaremos apenas os principais campos.
Figura 9 - Formato do pacote TCP
Porta de Origem: Porta utilizada pela aplicação transmitindo o pacote.
Porta de Destino: Porta que identifica a aplicação para quem o pacote deve ser entregue.
Número de sequência: Número de sequência do pacote. Lembre-se que na verdade representa a posição do primeiro byte deste pacote dentro do fluxo de bytes já transmitidos. Se em uma conexão já tivessem sido transmitidos 8499 bytes, o Número deSequência do próximo pacote seria 8500.
Número de confirmação: Só é válido quando o flag ACK estiver definido, e indica o número do byte reconhecido. Suponha que se deseja confirmar um pacote recebido que tinha 9000 no campo Número de Sequência e possuía 500 bytes. O valor deste campo seria 9501, indicando que os bytes da conexão até o número 9500 já foram recebidos.
Tamanho do cabeçalho. Indica o tamanho do cabeçalho TCP (em número de palavras de 32 bits), ou seja, multiplique o valor do campo por 4 para obter o tamanho do cabeçalho em bytes. É necessário porque podem existir campos opcionais (por isso a indicação Opções no formato do quadro).
SYN. Se contém 1, indica que o pacote é um pedido de conexão.
ACK. Se contém 1, indica que é um pacote de confirmação. Se SYN também contém 1, indica que é uma confirmação de um pedido de conexão. Se SYN contém 0, é uma confirmação de dados, e o campo Número de Confirmação contém o número do pacote sendo confirmado.
FIN. Pedido de encerramento de conexão.
RST (Reset). Encerrando uma conexão porque algo estranho aconteceu na conexão. Protege contra ataques ou erros.
PSH (Push). Usado pelo remetente para solicitar que os dados sejam entregues à aplicação de destino o mais rápido possível, após o pacote chegar naquela máquina.
URG (Urgent). Indica que o valor do campo Ponteiro Urgente é válido.
Tamanho da janela. Usado para indicar o tamanho disponível no buffer (veja a explicação sobre controle de fluxo).
TCP Checksum. Campo de verificação de erros no cabeçalho TCP. Semelhante ao campo checksum do cabeçalho IP, por exemplo.
Ponteiro Urgente. Usado pela origem para indicar onde se encontra algum dado urgente dentro do segmento.
Opções. O cabeçalho TCP pode conter campos opcionais. O mais utilizado chama-se MSS (Max Segment Size – Tamanho máximo do segmento) e indica qual deve ser o tamanho máximo de cada pacote TCP gerado pela máquina para tentar evitar que os pacotes IP que vão conter os segmentos sejam fragmentados. O valor colocado neste campo é baseado no tamanho da parte de dados da camada de enlace da máquina gerando o pacote.
Dados. Não é um campo do cabeçalho! Ele apenas indica que após o cabeçalho TCP o pacote contém a mensagem recebida da camada de aplicação.
1. Quantos pacotes são necessários para abrir uma conexão TCP?
2. Algum pacote TCP pode ser transmitido sem nenhum byte na sua parte de dados?
3. Para que serve o campo “Tamanho da Janela” no cabeçalho TCP?
4. Explique qual é a função do controle de fluxo.
Protocolo UDP
O protocolo UDP é um protocolo de transporte bastante simples que procura oferecer às aplicações um serviço de entrega de pacotes básico. Este serviço consiste apenas em colocar a mensagem recebida da camada de aplicação dentro de um segmento (o chamaremos de pacote UDP), utilizando os números de portas para identificar as aplicações. Portanto, as características oferecidas pelo UDP são praticamente as mesmas que o próprio IP oferece, com a diferença que o pacote UDP utiliza números de porta para identificar as aplicações.
Uma boa forma de você entender o UDP é comparando-o com o TCP. A seguir listamos as principais diferenças entre os dois protocolos.
• O UDP não garante que os pacotes serão entregues na ordem em que foram transmitidos. Ou seja, os pacotes são passados para a camada de aplicação na máquina destino na ordem em que são recebidos por ela – e essa ordem pode ser diferente da que foram transmitidos.
• O UDP não garante a entrega de pacotes, pois ele não retransmite pacotes perdidos ou com erro. Na verdade a origem nem sabe se os pacotes foram perdidos. Como você verá mais adiante, existe um campo de checksum no pacote UDP que permite a detecção de pacotes que chegam com erro. Mas os pacotes com erro são descartados sem que esse fato seja avisado à máquina que transmitiu o pacote.
• Não existe nenhum mecanismo para controlar a taxa com que os pacotes são enviados para a máquina de destino. Eles são enviados na taxa que a aplicação os gerar.
• O UDP não realiza segmentação nem blocagem, ou seja, cada mensagem da camada de aplicação que é passada para o UDP gera exatamente um pacote UDP. A Figura 10 mostra esse procedimento. Observe que Dados’ é formado pelo conteúdo do cabeçalho UDP mais Dados.
Figura 10 - Cada mensagem de aplicação gera exatamente um pacote UDP
Normalmente quanto mais funcionalidades um protocolo tem, mais campos ele precisa ter no seu cabeçalho. Como o UDP não oferece muitas funcionalidades, isso se reflete no formato do pacote, fazendo com que ele seja bastante simples. A Figura 11 mostra o formato de um pacote UDP. O campo Tamanho da Mensagem é o tamanho total do pacote UDP em bytes.Observe queDados não é um campo do cabeçalho! Ele apenas indica que após o cabeçalho UDP, o pacote contém a mensagem recebida da camada de aplicação.
Figura 11 - Formato do pacote UDP
1. O protocolo UDP retransmite pacotes perdidos?
2. Quando uma máquina recebe um pacote UDP com erro, ela avisa à máquina que o enviou?
3. Se o tamanho de uma mensagem passada para o protocolo UDP for muito grande o UDP a divide para ser transmitida em dois ou mais pacotes UDP?
Escolhendo qual protocolo utilizar: TCP ou UDP
O fato do protocolo UDP ser muito mais simples do que o TCP não significa que ele é pior. É verdade que se você utilizar UDP e precisar de alguma característica que ele não fornece, como numeração dos pacotes, por exemplo, seu programa é que terá que implementar essa função. Por outro lado, o UDP é muito mais leve e rápido do que o TCP, pois seu cabeçalho é menor e ele precisa realizar menos operações. Algumas aplicações, por exemplo, suportam a perda de pacotes, como é o caso de aplicações que transmitem voz sobre o IP. Além disso, o UDP suporta multicast e broadcast que o TCP não suporta.
Podemos dizer que não existe um protocolo melhor ou pior, existe o mais adequado às necessidades de cada aplicação. Se sua aplicação, por exemplo, transmite pequenas quantidades de informação de cada vez e pode lidar com a perda de pacotes, considere a possibilidade de usar UDP. Caso sua aplicação precise de confiabilidade na entrega dos pacotes, ou seja, que eles cheguem na ordem correta e que os pacotes perdidos sejam retransmitidos, use TCP. A verdade é que a maioria das aplicações precisa de confiabilidade e, portanto, utilizam TCP.
Como exemplos de protocolos que utilizam UDP, podemos citar DNS, DHCP e SNMP. Como exemplos de protocolos que utilizam TCP, podemos citar SMTP, POP3, IMAP, HTTP, FTP, LDAP, SMB e SSH.
Como uma aplicação utiliza a camada de transporte
Você já sabe que os programas utilizam um protocolo de transporte para transmitirem suas informações. A forma exata que o seu programa terá depende da linguagem de programação que você estiver utilizando e da API de rede que você vai utilizar. Você pode usar sockets, RPC, RMI, entre outras abordagens. Não se preocupe com o que esses nomes significam nesse momento. O que importa é que existem várias formas de fazer um programa transmitir informações pela rede. Nessa seção não pretendemos, de modo algum, ensinar-lhe a programar em rede. Queremos apenas lhe dar uma noção de como a camada de transporte é utilizada pelos programas. Para isso, vamos utilizar uma linguagem bem simples, com nomes de funções fictícios, para exemplificar as funções que um programa utilizaria. Essas funções é que fazem a comunicação do programa com a camada de transporte.
Programa TCP cliente
Imagine um programa cliente que utiliza TCP para transmitir dados para um servidor, conforme mostrado na Figura 12. Naturalmente o servidor também utiliza TCP. Inicialmente o cliente estabelece uma conexão com o servidor utilizando a funçãoConectar. Depois o programa transmite dados para o servidor usando a função Enviar_dados. Essa função recebe como parâmetros a conexão por onde enviar os dados e os dados a serem transmitidos. Normalmente, após transmitir dados ele deve receber algum dado enviado como resposta aos dados transmitidos. Isso é feito com a função Receber_dados. Essa função recebe como parâmetro a conexão de onde ler os dados e um buffer para onde os dados recebidos devem ser copiados. Apesar de só aparecer uma chamada para cada uma das funções Enviar_dados e Receber_dados, tipicamente um programa chama essas funções diversas vezes. Quando a máquina não deseja mais transmitir (nem receber) dados, ela solicita o fechamento da conexão.
Figura 12 - Exemplo de programa cliente usando TCP
Para listar as conexões estabelecidas e qual programa está usando cada conexão na sua máquina Linux em um terminal, digite:
netstat -tnp
Programa TCP servidor
O código do programa servidor é ligeiramente diferente do cliente, pois ele precisa realizar algumas tarefas a mais que o cliente. O código do servidor é mostrado na Figura 13. Inicialmente é necessário solicitar a porta desejada ao sistema operacional. Depois disso o programa servidor tipicamente entra em loop infinito, uma vez que os servidores devem executar indefinidamente. Dentro desse loop o programa deve esperar que algum cliente conecte e aceite essa nova conexão. Depois deve ler os dados enviados pelo cliente, que tipicamente contêm alguma solicitação, e processar essa solicitação, que poderia ser, por exemplo, o pedido de uma página web. A seguir o servidor tipicamente envia dados para o cliente, por exemplo, a página web solicitada. De modo semelhante ao cliente, podem existir várias chamadas a Enviar_dados e Receber_dados dentro do loop do servidor. Finalmente, o servidor encerra a conexão e volta para o início do loop para esperar por novas conexões. Quando algum evento causar o encerramento do programa servidor ele libera a porta que havia solicitado ao sistema operacional.
Figura 13 - Exemplo de programa servidor usando TCP
Para listar as os programas que estão esperando conexões TCP, e em que portas, na sua máquina Linux em um terminal digite:
netstat –tlnp
Para programas que utilizam UDP, o comando é:
netstat -ulnp
Resumo
Nesta aula você aprendeu os dois principais protocolos de transporte utilizados na Internet, que são o TCP e o UDP, e viu indicações de quando utilizar cada um deles. Você aprendeu que o TCP é o protocolo mais utilizado porque ele oferece confiabilidade na transmissão dos pacotes, retransmitindo os pacotes perdidos e os entregando na mesma ordem em que são transmitidos. Viu também que algumas vezes é melhor utilizar um protocolo mais simples, como é o caso do UDP, seja porque ele é mais rápido que o TCP, porque gera menos sobrecarga, ou porque suporta multicast. Você aprendeu que um conceito básico para qualquer protocolo de transporte é a noção de porta, que serve para identificar as aplicações. Finalmente analisou a forma como os programas interagem com a camada de transporte.
Acesse o Laboratório 1 desta aula (Aula 5) no Virtualbox e realize os procedimentos descritos a seguir.
1. Execute o wireshark e o programa servudp1 na Máquina-A. Execute a aplicação cliudp1 na Máquina-B. Analisando as informações fornecidas pelo wireshark, responda:
a. Quantos pacotes foram transmitidos nos dois sentidos, ou seja, somando os pacotes transmitidos de B para A mais os pacotes de A para B?
b. Qual o conteúdo da parte de dados do(s) pacote(s) UDP transmitido(s) de B para A?
c. Quais as portas usadas na Máquina-A e na Máquina-B, respectivamente?
2. Execute o wireshark e o programa servtcp1 na Máquina-A. Execute a aplicação clitcp1 na Máquina-B. Analisando as informações fornecidas pelo wireshark, responda:
a. Quantos pacotes foram transmitidos nos dois sentidos, ou seja, somando os pacotes transmitidos de B para A mais os pacotes de A para B?
b. Qual o conteúdo da parte de dados do(s) pacote(s) TCP transmitido(s) de B para A?
c. Quais as portas usadas na Máquina-A e na Máquina-B, respectivamente?
d. Qual máquina, Máquina-A ou Máquina B, solicitou primeiro o encerramento da conexão?
Redes de Computadores
Aula 7 – Protocolo DHCP: distribuindo automaticamente configurações IP para as estações em uma LAN
Nesta aula você aprenderá um protocolo que auxilia enormemente os administradores de redes a atribuírem endereços IPs para os computadores em suas LANs. Verá que, além do endereço IP, é possível passar, via protocolo DHCP, diversas informações de configuração da rede para todo computador que é ligado à rede local. Este protocolo se chama DHCP (Dynamic Host Configuration Protocol, ou seja, Protocolo de Configuração Dinâmica de Computador), e tem como principal função distribuir automaticamente aos computadores que entram na rede todas as informações necessárias para o funcionamento correto na rede em questão.
• Entender a necessidade de um protocolo de configuração dinâmica para outros protocolos.
• Conhecer como o protocolo DHCP funciona e quais são as informações principais que devem ser repassadas às estações dos clientes.
• Saber como configurar um servidor de DHCP no Linux.
• Entender o funcionamento do protocolo observando sua execução entre um cliente e um servidor de DHCP.
Por que o protocolo DHCP é necessário
Você sabe que nas redes que utilizam o protocolo IP, como é o caso da Internet, os dados são transmitidos entre os computadores em pacotes IP, e que cada pacote deve conter o endereço IP da máquina que está enviando o pacote e o endereço IP da máquina para a qual ele deve ser entregue.
A Figura 1 mostra o pacote IP que é gerado quando uma máquina A quer enviar dados para uma máquina C. Naturalmente, os demais campos do cabeçalho IP e os cabeçalhos das camadas de transporte e de aplicação foram omitidos.
Figura 1 – Transmissão usando um pacote IP
Assim, toda máquina que for gerar algum pacote IP na rede deverá possuir um endereço IP atribuído unicamente a ela.
Como você já sabe, cada rede de computadores interligada à Internet possui uma faixa de endereços IPs, conhecida como prefixo do endereço de rede, reservada para esta rede.
O sufixo no endereço IP identifica a máquina (host) dentro daquela rede. No exemplo da Figura 1, o prefixo seria o endereço 10, e o sufixo a parte final dos endereços, 1.1.1 para a máquina A.
A atribuição dos sufixos a cada host em uma rede TCP/IP é uma tarefa delegada ao administrador da rede. Isto é, cabe ao administrador configurar em cada máquina qual endereço IP (prefixo + sufixo) a máquina usará em sua rede.
Dependendo do tamanho da rede, esta pode ser uma tarefa árdua. Em redes corporativas, com centenas de computadores a serem configurados manualmente, esta é uma atividade trabalhosa e, muitas vezes, problemática, pois a remoção e adição de novas estações na rede precisa ser coordenada com cuidado para não se ter desperdícios e nem conflitos de endereços.
Para complicar ainda mais esta organização dos endereços IPs nas redes, a popularização dos dispositivos móveis (notebooks, smartphones etc.) e o seu uso em nas LANs corporativas intensificou a dinamicidade (entrada e saída) de computadores nestas redes, dificultando enormemente a organização manual dos endereços IP feita pelo administrador.
Portanto, hoje em dia é praticamente imperativo em qualquer rede ter um sistema de distribuição de endereços IP para os computadores, facilitando sua administração no que diz respeito à configuração que deve ser feita em cada computador para que o mesmo possa conversar com os outros através dos protocolos da família TCP/IP.
Lembre-se de que somente o endereço IP não é suficiente para que um computador trabalhe em redes TCP/IP. É necessário também a máscara de rede e o endereço IP do gateway. Com a máscara de rede, o host terá condições de determinar o prefixo do endereço de sua rede, possibilitando identificar se um IP de destino de um pacote é de sua rede ou não. Caso não seja de sua rede, o host deverá encaminhar este pacote IP para o gateway de sua rede.
1. Imagine-se em um ambiente de rede com vários computadores e que não exista um servidor DHCP. Qual o principal problema que você (como administrador dessa rede) deverá encontrar?
2. Caso um cliente desta rede atribua um mesmo endereço IP de uma máquina já existente, você acha que ambas irão ter acesso? Por quê?
Funcionamento do DHCP
Agora que sabemos a falta que o DHCP pode acarretar em uma rede, iremos mostrar como tal protocolo funciona, para assim entendermos como ele resolve, de forma automática, o problema de atribuição de endereços IP para nossa rede.
Para automatizar a configuração dos dispositivos em uma rede, o IERF (Internet Engineering Task Force) desenvolveu oDynamic Host Configuration Protocol (DHCP).
Diferentemente do BOOTP, primeiro protocolo desenvolvido com esta finalidade de passar as configurações IP para os hosts na rede, o DHCP não exige que um administrador acrescente uma entrada para cada computador à base de dados que um servidor utiliza.
Em vez disso, o DHCP fornece um mecanismo, baseado em comunicação cliente/servidor, que permite que um computador cliente se junte a uma nova rede e obtenha um endereço IP a partir de um computador servidor de endereços sem intervenção manual.
O conceito foi chamado de plug-and-play networing. Mais importante, o DHCP acomoda computadores que executam software servidor e computadores que executam software cliente:
• Quando um computador que executa software cliente é movido para uma nova rede, o computador pode usar DHCP para obter informações de configuração sem intervenção manual.
• O DHCP permite que a um computador que não é móvel e executa software servidor seja atribuído um endereço IP permanente; o endereço não mudará quando o computador for reiniciado.
Para entender estas possibilidades de atribuição de endereços para estes dois tipos de computadores, é importante observarmos os tipos de alocação que o DHCP aceita, que podem ser alocação estática ou dinâmica.
Alocação de endereço estática
Nessa função, o DHCP possui um banco de dados que vincula endereços físicos (MAC) a endereços IP de maneira estática. Este é o tipo de alocação adequada para aqueles computadores ou dispositivos que executam software servidor. Isto porque, como esta amarração do endereço físico com o endereço IP é estática, não muda, o dispositivo sempre terá o mesmo endereço IP mesmo que ele seja desligado e ligado diversas vezes.
Este tipo de alocação é comumente usada em computadores servidores, nos quais os clientes precisam saber previamente seu endereço IP, e este não deve mudar com o tempo, pois implicaria na reconfiguração dos clientes no acesso ao servidor. Este cenário também se aplica a impressoras que possuem interface de rede LAN, nas quais é preciso configurar o protocolo de impressão com o endereço IP da impressora.
Alocação de endereço dinâmica
O DHCP tem um segundo banco de dados com um pool (faixa de valores) de endereços IP disponíveis. Este segundo banco de dados torna o DHCP dinâmico. Quando um cliente DHCP solicita um endereço IP, o servidor DHCP vai ao poolde endereços IP disponíveis (não utilizados) e atribui um endereço IP por um período de tempo negociável.
Quando um cliente DHCP envia um pedido a um servidor DHCP, este verifica primeiro seu banco de dados estático. Se existir no banco de dados estático uma entrada com o endereço físico do cliente que fez a solicitação, o endereço IP permanente deste cliente é retornado. Por outro lado, se a entrada não existir no banco de dados estático, o servidor seleciona um endereço IP do pool de disponíveis, atribui o endereço ao cliente e adiciona a entrada no banco de dados dinâmico.
O aspecto dinâmico do DHCP é necessário quando um host muda de uma rede para outra ou é conectado e desconectado de uma rede (como um assinante de um provedor de serviços). O protocolo DHCP fornece endereços IP temporários por um período de tempo limitado.
Os endereços atribuídos do pool são temporários. O servidor DHCP faz uma concessão por um período de tempo específico. Quando a concessão expira, o cliente precisa parar de usar o endereço IP ou renovar a concessão. O servidor tem a escolha de concordar ou não com a renovação. Se o servidor discordar, o cliente para de usar o endereço.
1. Qual o principal benefício de se ter um servidor de DHCP em uma rede de computadores?
2. É possível fixar o endereço IP em um determinado dispositivo da rede mesmo se esta está usando o DHCP?
3. Pesquise na Internet o protocolo BOOTP e veja qual era sua principal finalidade.
Estados de transição DHCP
O cliente DHCP muda de um estado para outro, dependendo das mensagens que recebe ou envia. Veja na Figura 2 os vários estados em que o cliente pode estar; note que a transição de estados ocorre através de trocas de mensagens.
Figura 2 – Diagrama de transição do DHCP. Fonte: Forouzan (2008).
Veja que o protocolo usa também um esquema de timeout (uma espécie de cronômetro) para fazer concessões. Mas o que acontece em cada estado? Para que eles servem? Veremos a seguir como um estado se comunica com o outro e suas respectivas funções.
Estado de inicialização
Quando o cliente DHCP inicia pela primeira vez, ele está no estado inicializando. O cliente difunde publicamente (porbroadcast) uma mensagem DHCPDISCOVER (uma mensagem de pedido com a opção DHCPDISCOVER) usando a porta UDP 67.
Estado selecionando
Após enviar a mensagem DHCPDISCOVER, o cliente vai para o estado selecionando. Os servidores que podem fornecer este tipo de serviço respondem com uma mensagem DHCPOFFER. Nessas mensagens, os servidores oferecem um endereço IP. Eles também podem oferecer a duração da concessão. O padrão é 1 hora.
O servidor que envia uma mensagem DHCPOFFER bloqueia o endereço IP oferecido para que ele não esteja disponível a outros clientes. O cliente escolhe uma das ofertas e envia uma mensagem DHCPREQUEST para o servidor selecionado. Então, ele vai para o estado solicitando. Entretanto, se o cliente não receber nenhuma mensagem DHCPOFFER, ele tenta mais quatro vezes, cada uma com duração de 2 segundos. Se não houver resposta a nenhuma dessas mensagens DHCPDISCOVER, o cliente fica em repouso por 5 minutos, antes de tentar novamente.
Estado solicitando
O cliente permanece no estado solicitando até receber uma mensagem DHCPACK do servidor que cria o vínculo entre o endereço físico do cliente e seu endereço IP. Após o recebimento da mensagem DHCPACK, o cliente vai para o estado vinculado.
Estado vinculado
Nesse estado, o cliente pode usar o endereço IP até que a concessão expire. Quando 50% do período de concessão for atingido, o cliente envia outra mensagem DHCPREQUEST para solicitar renovação. Então, ele vai para o estado renovando. Quando está no estado vinculado, o cliente também pode cancelar a concessão e ir para o estado inicializando.
Estado renovando
O cliente permanece no estado renovando até que um desses dois eventos aconteça. Ele pode receber uma mensagem DHCPACK, que renova o contrato de concessão. Nesse caso, o cliente zera seu cronômetro e volta para o estado vinculado. Ou então, se uma mensagem DHCPACK não for recebida e 87,5% do tempo de concessão expirou, o cliente volta para o estado revinculando.
Estado revinculando
O cliente permanece no estado revinculando até que um de três eventos ocorra. Se o cliente receber uma mensagem DHCPNACK ou a concessão expirar, ele volta para o estado inicializando e tenta obter outro endereço IP. Se o cliente receber uma mensagem DHCPACK, ele vai para o estado vinculado e zera o cronômetro.
1. Qual a primeira mensagem que um cliente envia ao tentar obter um endereço via DHCP? Ela é para um único computador? Por quê?
2. Ao entrar no estado renovando, um cliente fica aguardando a resposta do servidor. Caso essa resposta não chegue, qual o próximo estado a ser chamado? Baseado em quê ele toma esta decisão?
Trocando mensagens
Agora que conhecemos os estados e como as mensagens são trocadas entre eles, veremos um exemplo de como isso acontece para termos uma noção de como funciona tal procedimento.
A Figura 3 mostra a troca de mensagens relacionada ao diagrama de estado de transição, como visto na Figura 2.
Figura 3 – Sequência de troca de mensagens no DHCP. Fonte: Forouzan (2008).
Instalando e configurando o servidor DHCP
Agora vamos praticar os conceitos que vimos até agora. Imagine que temos duas máquinas na rede, chamadas máquina A e máquina B. A primeira coisa que precisamos é de um servidor de DHCP.
O software servidor DHCP no Linux é feito através do daemon (processo servidor) dhcpd, e o mesmo vem distribuído no pacote dhcp3-server, conforme podemos observar no comando da Figura 4 (sudo apt-cache search dhcpd), que procura todos os pacotes que possuem alguma referência a este arquivo.
É interessante que você, a partir de agora, siga a aula em um computador para poder realizar os comandos descritos a seguir e ter uma melhor ideia de como funcionam.
Figura 4 – Pacotes do Linux que possuem alguma referência ao servidor DHCP
Como podemos ver na saída de nossa busca, temos um cliente DHCP (dhcp3-client), um Servidor DHCP (dhcp3-server), uma ferramenta auxiliar ao tcpdump para análise de pacotes DHCP, entre outros.
Como estamos querendo instalar um servidor DHCP, vamos instalar então este pacote dhcp3-server através do procedimento mostrado na Figura 5. O comando abaixo assume que a máquina possui conectividade com a Internet.
Figura 5 – Instalando o servidor DHCP através do comando apt-get install
Observe na Figura 5 que, ao ser instalado o pacote, o Linux tentou iniciar o servidor de DHCP e esta ação falhou. Isto aconteceu porque o serviço DHCP ainda não está configurado para a rede em que a máquina está. Assim, vamos configurá-lo.
Arquivo de configuração do servidor DHCP
O arquivo que contém a configuração do servidor DHCP é o /etc/dhcp3/dhcpd.conf. Abra-o com o editor gedit. Observe pelos comentários nas linhas que começam com “#” que ele está bastante documentado.
A configuração neste arquivo é dividida em seções. Os parâmetros iniciais ou fora dos blocos subnet são definidos globalmente, isto é, independente de sub-redes.
Os parâmetros definidos dentro de um bloco subnet só se aplicam àquela sub-rede em particular. Isto é importante quando se tem um servidor de DHCP com várias placas de redes ligadas a diferentes sub-redes, sendo ele o servidor DHCP, e em cada rede as informações de concessão de endereços são diferentes.
Um exemplo de arquivo de configuração para um servidor de DHCP típico seria o da Figura 6.
Figura 6 – Exemplo do arquivo de configuração dhcpd.conf
Vamos explicar cada um destes parâmetros na Tabela 1.
Parâmetro Linha Descrição
server-identifier 01 Identifica o servidor de DHCP por um nome de computador.
default-lease-time 02 Duração em segundos da concessão de um endereço IP a um computador. No exemplo, 1 hora.
max-lease-time 03 Tempo máximo de concessão de um endereço IP. Após este tempo, se o computador não conseguir renovar esta concessão, ele deve liberar o endereço IP e tentar conseguir outro.
subnet ... netmask ... {
...
} 05 Bloco de parâmetros para a sub-rede especificada, incluindo sua máscara de rede. Os parâmetros definidos dentro deste bloco são específicos da sub-rede em questão.
range IP_inicial IP_final 06 Faixa de endereços IP a serem utilizadas pela alocação dinâmica de endereços. Os endereços inicial e final da faixa de valores devem ser informados.
option domain-name 08 Nome do domínio utilizado pelo serviço DNS, o qual será visto na próxima aula.
option domain-name-servers 09 Lista dos endereços dos servidores de DNS separados por vírgula, caso haja mais de um.
option routers 10 Lista dos endereços dos roteadores (gateways) separados por vírgula, caso haja mais de um.
option subnet-mask 11 Máscara de sub-rede utilizada na rede em questão.
host ... {
...
} 12 Parâmetros específicos para um dispositivo qualquer da rede. Neste bloco é possível fazer a alocação estática de um endereço IP para um computador.
hardware ethernet 13 Endereço físico (MAC) da interface de rede do host em questão.
fixed-address 14 Endereço IP estático a ser vinculado ao host.
option host-name 15 Nome do host na rede usada pelo serviço DNS. Não precisa ser o mesmo nome informado no parâmetro host. O nome, nesta opção, será o que aparecerá nos logs do servidor DHCP para as alocações ocorridas.
Tabela 1 – Parâmetros de configuração do servidor DHCP
Observe que os parâmetros devem ser finalizados com um ponto-e-vírgula. Os blocos devem iniciar com abre-parênteses e fecha-parênteses, como o bloco subnet entre as linhas 05 e 17, e o bloco host entre as linhas 12 e 16 da Figura 6.
1. Realize a instalação (sem configuração) de um servidor DHCP em uma máquina virtual como mostrado nesta sessão. Ela será necessária para nossa prática (configuração e testes) a seguir.
Prática de configuração e testes de um servidor DHCP
Em seu computador será necessário criar 2 máquinas virtuais para realização de nossos testes. Assumiremos que a máquina A será o servidor de DHCP (já instalado em nossa atividade da seção anterior), e a máquina B será o cliente. O endereço IP da máquina A é o 10.1.1.1 com máscara 255.255.255.0. Assim, a máquina B deverá conseguir um endereço IP nesta rede 10.1.1.0.
Alocação dinâminca
O primeiro teste que faremos será utilizando a alocação dinâmica. Isto é, a máquina B deverá pegar um endereço IP qualquer dentro da faixa de endereços configuradas no servidor DHCP da máquina A. A faixa que utilizaremos será a 10.1.1.100 a 10.1.1.200. Assumiremos também que o gateway (máquina intermediária geralmente destinada a interligar redes) desta rede será a máquina A e que ela também é o servidor de DNS para esta rede. Assim, o arquivo de configuração dhcpd.conf fica como o da Figura 7.
Figura 7 – Arquivo dhcpd.conf para a alocação dinâmica
Digite este texto da Figura 7 usando o gedit e salve-o como /etc/dhcp3/dhcpd.conf da máquina A. Em seguida, inicie o servidor de DHCP, conforme a Figura 8.
Figura 8 – Configurando e iniciando o servidor DHCP para alocação dinâmica
Vamos agora testar o servidor DHCP com a máquina B. Antes de ligarmos a máquina B, vamos parar o servidor DHCP na máquina A. Depois ligamos a máquina B. Ao final da inicialização da máquina B, se abríssemos um terminal, iríamos verificar que sua interface eth0 não possui nenhum IP! Depois iniciamos o servidor DHCP na máquina A, conforme Figura 9.
Figura 9 – Parando e iniciando o servidor DHCP entre a inicialização da máquina B
Na máquina B, vamos executar o comando dhclient, que é um software DHCP cliente, conforme a Figura 10. Veja que antes de executarmos esse comando a interface eth0 não tinha um endereço IP definido.
Figura 10 – Rodando o software DHCP cliente na máquina B
Observe, na Figura 10, a sequência de mensagens entre o cliente e o servidor DHCP, as quais correspondem às quatro primeiras mensagens da Figura 3, comentadas anteriormente. Isto é, o cliente envia por broadcast uma mensagem DHCPDISCOVER.
O servidor DHCP, ao receber esta mensagem, verifica o primeiro IP disponível para alocação, neste caso 10.1.1.100, e envia uma mensagem DHCPOFFER com este IP para o cliente. O cliente aceita a oferta e envia uma mensagem DHCPREQUEST do IP 10.1.1.100 para o servidor. Por fim, o servidor confirma a alocação deste IP para este cliente com uma mensagem DHCPACK com este IP.
Observe ainda que o cliente deverá realizar um pedido de renovação deste IP após 1385 segundos, conforme indicado pelo texto “renewal in 1385 seconds”.
Alocação estática
O segundo teste que faremos será utilizando a alocação estática. Isto é, a máquina B deverá pegar um endereço IP pré-configurado pelo servidor DHCP da máquina A, o qual observará o endereço físico (MAC) da máquina B para fazer esta amarração, ou seja, associar o IP ao seu MAC.
O endereço IP que utilizaremos para esta alocação estática será o 10.1.1.2, portanto, fora da faixa de endereços IP de alocação dinâmica.
É possível utilizar um endereço IP para alocação estática da faixa de endereços para alocação dinâmica? Sim. Isto é considerado como uma reserva de endereço IP dentro da faixa de endereços a serem alocados dinamicamente aos clientes. Ou seja, somente um determinado cliente poderá utilizar aquele IP, amarrando o seu endereço físico (MAC) com aquele endereço lógico (IP).
Assim, o arquivo de configuração dhcpd.conf fica como o da Figura 11.
Figura 11 – Arquivo dhcpd.conf para a alocação dinâmica
Na máquina A, vamos atualizar o arquivo /etc/dhcp3/dhcpd.conf conforme a Figura 11. Em seguida, reiniciamos o servidor de DHCP, conforme Figura 12.
Figura 12 – Atualizando a configuração e reiniciando o servidor DHCP
Agora, executamos novamente o DHCP cliente na máquina B e observamos o que acontece, conforme a Figura 13.
Figura 13 – Atualizando a alocação DHCP no cliente
Observe, na Figura 13, que o cliente envia uma mensagem DHCPREQUEST do IP 10.1.1.2 para o servidor e este confirma a alocação para este IP enviando uma mensagem DHCPACK para o cliente. E por que o cliente solicitou justamente este endereço IP do servidor?
No momento do reinício do servidor DHCP, este observou, pela nova configuração, que o cliente que já tinha um endereço IP alocado dinamicamente tem agora uma reserva de IP para ele. Isto provoca o envio pelo servidor de uma mensagem DHCPOFFER do endereço IP reservado para este cliente. O cliente poderá requisitar esta alocação deste novo IP com uma mensagem DHCPREQUEST quando expirar o tempo de concessão ou quando desejar renovar seu endereço, que foi o que aconteceu quando rodamos o comando dhclient.
1. Agora que você é capaz de instalar/configurar um servidor DHCP, analise os prós e contras em utilizar a alocação ESTÁTICA e DINÂMICA em uma rede de computadores.
2. Pesquise e cite exemplos de tipos/ambientes de redes em que uma abordagem de alocação será melhor empregada do que a outra.
Resumo
Nesta aula você aprendeu que existe um protocolo, chamado DHCP, para configurar as máquinas de uma rede automaticamente, no que diz respeito aos seus endereços IP, máscaras, gateways, entre outras informações. Você aprendeu também que o DHCP pode fornecer um endereço dinâmico para cada máquina, dentro de uma faixa de endereços configurados no servidor, ou pode sempre oferecer o mesmo endereço IP. Neste último caso, a vinculação do endereço IP a uma máquina é feita através do endereço MAC de sua placa de rede. Além disso, você estudou as mensagens que são trocadas pelo protocolo DHCP e aprendeu a configurar um servidor DHCP real.
Acesse o Laboratório1 desta aula (Aula7) no Virtualbox e realize os seguintes procedimentos.
1. Repita todos os passos vistos nesta aula para configurar seu servidor DHCP na máquina A e o cliente DHCP na máquina B.
2. Execute o analisador de protocolos digitando tcpdump –n na janela de terminal da máquina B.
3. Na máquina A, edite o arquivo /etc/dhcp3/dhcpd.confmudando o IP reservado para a máquina B, colocando agora 10.1.1.3. Reinicie o servidor DHCP na máquina A.
4. Na máquina B, abra outra janela de terminal e execute o comando dhclient. Observe as linhas que aparecem na janela com o tcpdump sendo executado.
5. Na máquina B, na janela de terminal em que rodou o dhclient, observe as mensagens DHCP trocadas entre o cliente e o servidor. Quais foram estas mensagens e por que elas foram enviadas?
Redes de Computadores
Aula 9 – Autenticação e compartilhamento de arquivos – Parte I
Com certeza você já está acostumado ao fato de que para utilizarmos um computador normalmente precisamos informar um nome de usuário e uma senha. Esse procedimento garante a nossa identificação e, com isso, permite que sejam aplicadas regras que controlam o que podemos fazer no computador, como, por exemplo, quais arquivos podemos acessar.
Nas redes das empresas, onde existem diversos computadores que podem ser acessados por diferentes pessoas, esses mecanismos de autenticação e controle de acesso são indispensáveis.
Além disso, como nessas redes uma pessoa pode usar diferentes computadores, é necessário que exista um mecanismo que disponibilize os arquivos desta pessoa na máquina onde ela estiver conectada em um dado momento.
Nesta aula estudaremos um protocolo chamado LDAP, que é muito utilizado para implementar os mecanismos de autenticação.
Após o final desta aula você será capaz de:
• Instalar um servidor LDAP na Linux.
• Configurar o servidor LDAP.
• Saber inserir e consultar dados no servidor LDAP usando programas de linha de comando.
• Saber inserir e consultar dados no servidor LDAP usando um programa com interface gráfica.
Autenticação de usuários e compartilhamento de arquivos
Nesta seção vamos estudar como funcionam os serviços de autenticação de usuários e de acesso aos seus arquivos. Inicialmente vamos ver como isso ocorre quando usamos uma única máquina, sem que ela esteja conectada em nenhuma rede. Depois veremos o que muda quando temos várias máquinas em rede.
Na primeira aula da disciplina Sistemas de Conectividade, falamos sobre esses serviços de autenticação e compartilhamento. Se desejar, leia novamente a parte referente a este assunto daquela aula.
Apenas uma máquina
Vamos entender agora como funciona a autenticação e o acesso aos arquivos quando usamos uma única máquina. Suponha que essa máquina é um computador que você tem na sua casa. Como provavelmente um irmão ou um de seus pais pode também querer usar o computador, é importante que cada pessoa tenha privacidade para seus arquivos, ou seja, cada pessoa só possa acessar seus próprios arquivos. Além disso, cada um pode querer personalizar a área de trabalho, ou seja, qual papel de parede quer utilizar e os ícones que quer que apareçam na tela.
Para que isso seja possível, é necessário primeiro ter como identificar cada pessoa (que é chamada de usuário), o que é feito através de um nome de usuário e uma senha.
Depois é necessário definir o que cada usuário pode fazer na máquina (permissões) e quais arquivos pode acessar.
Você pode dizer, por exemplo, que um usuário não pode acessar o CD (ou DVD), ou que não pode usar a impressora, mas normalmente a principal restrição é se ele pode ou não instalar programas na máquina. No que diz respeito aos arquivos, por padrão, cada usuário só pode acessar seus próprios arquivos. Naturalmente um usuário pode liberar o acesso a um ou mais de seus arquivos para outro usuário.
Um conjunto de permissões é chamado de Lista de Controle de Acesso, ou ACL.
Normalmente as ACLs são aplicadas a cada usuário individualmente. Para simplificar as coisas, são criados grupos e os usuários são inseridos nesses grupos. As ACLs são então definidas para os grupos, e consequentemente são aplicadas a todos os usuários de cada grupo. Em uma máquina tipicamente existem pelo menos dois grupos, um de usuários com direitos normais e outro para usuários com direitos de administrador.
Os usuários desse último grupo, administrador, normalmente têm acesso completo à máquina, ou seja, podem realizar qualquer operação, enquanto que usuários de outros grupos têm suas permissões reduzidas.
Figura 1 - Grupos de usuários: grupo comum e administradores
A Figura 1 mostra dois grupos, um chamado “alunos” e outro “administradores”. Observe que é possível um mesmo usuário pertencer a mais de um grupo, como é o caso do usuário “Pedro”. Naturalmente, neste caso os direitos dele serão obtidos considerando-se as permissões de todos os grupos aos quais ele pertence.
A Figura 2 mostra a aplicação de uma ACL para um grupo (alunos) e de outra ACL para um usuário individual.
No primeiro caso, as regras de acesso contidas na ACL são aplicadas a cada usuário do grupo, mas de um modo muito mais fácil de fazer do que se fosse necessário fazer isso individualmente para cada um deles.
Olhando para Figura 2, observe que “Pedro” terá permissão de instalar programas, pois embora essa permissão não lhe tenha sido atribuída pelas permissões do grupo, foi-lhe concedida pela atribuição das permissões individuais.
Figura 2 - Atribuição de permissões a um grupo de usuários e a um único usuário
Independentemente se as permissões são concedidas a um grupo ou a um usuário individual, o ponto mais importante para esta aula é que, no caso de uma máquina individual, as informações para autenticação do usuário (nome do usuário e senha), as permissões (ALCs) e os arquivos que o usuário pretende acessar estão todos na mesma máquina.
Sendo assim, após a pessoa que vai utilizar a máquina informar seu nome de usuário (username) e sua senha, o sistema operacional verifica se seu usuário existe e se a senha informada está correta
Após isso, sempre que o usuário tentar fazer alguma operação no computador, como acessar um arquivo, por exemplo, o sistema operacional verifica através das ACLs se o usuário tem permissão para realizar a operação.
No caso do Linux, as informações dos usuários, como seu username, por exemplo, estão no arquivo /etc/passwd, com exceção das senhas, que estão no arquivo /etc/shadow.
1. O que é uma ACL?
2. O que acontece se uma ACLs for atribuída a um grupo de usuários?
3. Suponha que você é casado e tem um filho de 8 anos que sabe mexer bastante no computador, mas você não quer que ele instale nenhum tipo de programa na máquina. No entanto, os outros membros da família podem continuar instalando o que quiserem. Indique o que fazer usando ACLs.
Máquinas em uma rede
Vamos agora analisar o caso onde existem várias máquinas na rede que o usuário pode utilizar. Isso acontece em várias empresas. Pense um laboratório de informática de uma escola onde os alunos vão estudar, por exemplo. Faça de conta que você é um desses alunos.
Evidentemente, em cada dia você poderia utilizar uma máquina diferente. Não dá para ter as informações sobre os usuários (username e senhas) nem seus arquivos gravados em apenas uma máquina, como é feito para uma máquina que não está em rede. Veja que também não faria sentido gravar uma cópia dessas informações em cada máquina, pois sempre que alguma informação fosse alterada na máquina que você estivesse trabalhando, todas as outras máquinas ficariam desatualizadas.
A solução é centralizar todas essas informações em uma única máquina (chamada servidor) e instalar um programa nas máquinas que os usuários vão utilizar (chamadas clientes) que dê a impressão de que tudo está acontecendo apenas na máquina local, onde ele está trabalhando.
Vamos agora ver o que “dar a impressão de que tudo está acontecendo na máquina local” significa, em termos de autenticação e do acesso aos arquivos.
Autenticação
Os nomes dos usuários (usernames) e suas senhas ficam gravados em um arquivo no servidor. Nos clientes o programa que verifica o username e senha dos usuários sabe disso, e sempre que uma pessoa tenta utilizar a máquina esse programa envia o username e a senha informados para o servidor. O servidor verifica no seu arquivo de usuários se a senha informada para aquele usuário está correta, e envia uma mensagem de volta ao cliente liberando ou negando o acesso.
A Figura 3 mostra o que acontece quando o usuário Carlos (que possui a senha teste123) tenta se logar (entrar) em uma máquina da rede. Como ele informou a senha correta, no passo 4 o servidor envia uma mensagem informando que ele “autenticou com sucesso”, pois a senha informada é a mesma existente no arquivo do servidor, e o acesso à máquina seria liberado.
Figura 3 - Esquema de autenticação de usuários em uma rede
Compartilhamento de arquivos
Vamos agora ver como os arquivos do usuário que estão no servidor são acessados.
Do mesmo modo que existe o software de autenticação que é composto por uma parte que executa no servidor e outra que executa no cliente, existe também um software para acesso aos arquivos em rede, que é composto por uma parte que executa no servidor e outra que executa no cliente.
Observe que não estamos dizendo que o usuário vai ter que usar um programa especial para acessar seus arquivos. Nada disso! Esse programa faz parte do próprio sistema operacional e cria uma espécie de disco virtual na máquina do cliente.
Quando o usuário Carlos tenta, por exemplo, ler alguma informação do arquivo redes.doc (passo 1), uma mensagem solicitando essa operação é enviada ao servidor (passo 2), que faz o acesso ao disco real (passo 3).
Neste passo as ACLs são verificadas para ver se o usuário Carlos tem permissão de acessar este arquivo. Caso tenha permissão, no passo 4 o conteúdo do arquivo é enviado para a máquina cliente, e finalmente passado para a aplicação (passo 5).
Veja, portanto, que para a aplicação que tentou ler o arquivo não existe nenhuma diferença se o arquivo estava na máquina cliente ou no servidor. É como se existisse realmente um disco na máquina cliente com os arquivos do usuário, mas na verdade ele não existe – daí o nome virtual.
Se a máquina cliente for Windows, realmente vai aparecer um novo disco, identificado com uma letra de drive, por exemplo, “D:” ou “F:”. Se o cliente for um Linux, os arquivos e pastas do servidor vão aparecer dentro de alguma pasta existente na máquina local, que foi criada apenas para esta finalidade.
A Figura 4 mostra o que acontece quando o usuário Carlos tenta acessar um de seus arquivos (redes.doc) em um servidor Linux a partir de uma máquina cliente. Observe que os arquivos (e pastas) de todos os usuários, incluindo os de Carlos, estão no disco rígido que existe no servidor, dentro da pasta home.
Entretanto, o sistema operacional da máquina cliente mostra a relação de arquivos e pastas do servidor como se eles fossem locais.
Figura 4 - Compartilhamento de arquivos
1. Explique qual a vantagem oferecida por uma rede que dispõe o serviço de compartilhamento de arquivos.
2. Por que usar autenticação para ingressar (logar) nas máquinas da rede?
É importante você saber que a forma como as pastas de Carlos aparecem na máquina cliente depende se esta máquina é Linux ou Windows. Supondo que as pastas de Carlos no servidor fossem “documentos”, “programas” e “vídeos”, a Figura 5 mostra um exemplo de como essas pastas apareceriam se a máquina cliente fosse Windows. Veja que foi criado um disco identificado pela letra “F:”, e as pastas aparecem dentro deste disco.
Figura 5 - Como as pastas remotas aparecem em um cliente Windows
Assumindo as mesmas pastas de Carlos no servidor, a Figura 6 mostra como essas pastas apareceriam no cliente se a máquina fosse Linux. Observe que as pastas remotas aparecem dentro da pasta Carlos, que foi criada no cliente apenas para essa finalidade. Além disso, veja que neste esquema as pastas remotas “documentos”, “programas” e “vídeos” aparecem completamente integradas às pastas locais da máquina, que, neste caso, são “backup”, “dados” e “musicas”.
Figura 6 - Como as pastas remotas aparecem em um cliente Linux
1. Onde ficam os arquivos com os nomes dos usuários e as senhas em uma rede?
2. Como as pastas remotas aparecem na máquina cliente se o usuário estiver utilizando Windows?
LDAP
Para realizar a autenticação dos usuários em uma rede, falamos que é utilizado um programa composto por uma parte que roda no cliente e outra que roda no servidor. Naturalmente estes programas utilizam algum protocolo para se comunicarem. Existem diversos mecanismos de autenticação que, embora sigam o modelo que você acabou de estudar, utilizam protocolos diferentes.
É por isso que, a princípio, um cliente Windows só consegue se autenticar em um servidor Windows, e um cliente Linux em um servidor Linux. Felizmente existem formas de reduzir essas limitações, fazendo, por exemplo, um cliente Windows se autenticar em um servidor Linux.
Na próxima aula iremos aprender a fazer a autenticação de um cliente Linux em um servidor Linux. Embora outros protocolos já tenham sido utilizados para realizar esta tarefa, como o NIS, por exemplo, atualmente a forma mais comum de fazer isso é utilizando o protocolo LDAP. Mas fique sabendo que o LDAP é um protocolo que pode ser utilizado para diversas outras finalidades, além da autenticação. Por isso, nesta aula vamos falar sobre o LDAP de modo geral, para na próxima aula você aprender como utilizá-lo para a autenticação.
Definição e esquemas
O LDAP (Lightweight Directory Access Protocol) é um protocolo para acesso a informações remotas que são organizadas de forma estruturada. A melhor forma de entender o que se quer dizer com “estruturada” é através de um exemplo. Imagine que as informações que você quer disponibilizar sejam referentes aos filmes de uma locadora de DVDs. Para cada filme você iria estruturar as informações sobre ele mais ou menos do modo mostrado na Figura 7, criando uma espécie de modelo, ou formulário, que o LDAP chama de “Esquema”.
Figura 7 - Esquema LDAP para informações sobre filmes
Cada esquema, além dos nomes dos campos, define o tipo de cada campo. Um campo pode ser, por exemplo, uma string, e outro campo pode ser um inteiro. Além disso, um esquema pode dizer que alguns campos são opcionais e outros são obrigatórios. Assim, quando se vai inserir um objeto de um determinado esquema é necessário informar todos os campos obrigatórios. Por objeto entenda o conjunto de informações referentes a um esquema. Para o esquema DVD, um objeto seria o conjunto de dados de um filme qualquer.
Como outro exemplo de esquema, vamos pegar algumas informações que o sistema operacional precisa manter sobre um usuário. O esquema do LDAP para armazenar essas informações é mostrado na Figura 8.
Veja que o campo “Nome Completo” não foi informado no novo objeto sendo inserido. Isso é possível caso este campo seja declarado como opcional na definição do esquema Usuário.
Figura 8 - Esquema LDAP para informações dos usuários e um objeto exemplo
O programa que armazena as informações do LDAP é chamado de “Diretório”, mas como esse nome pode não ser muito claro, é melhor você pensar no LDAP como uma base de dados, ou seja, algo que armazena um conjunto de informações. Todas as informações armazenadas devem ser de um dos tipos de esquemas suportados pelo servidor. Cada servidor define os esquemas que quer suportar. Existem vários esquemas predeterminados, mas é possível criar novos esquemas com os campos que desejarmos.
Estrutura em árvore
Até aqui você já sabe que o LDAP é um protocolo para acessar informações e que essas informações são organizadas de acordo com algum esquema. Assim sendo, sabe também que um servidor LDAP contém vários objetos de diversos esquemas diferentes. Vamos agora descrever mais uma característica do LDAP que o torna extremamente interessante.
Uma base LDAP é organizada em árvore, e os objetos podem ser inseridos em qualquer nó da árvore. Além disso, cada nó tem um nome que é único nessa árvore.
A característica descrita acima traz duas grandes vantagens:
• Eficiência nas pesquisas. Quando se deseja procurar um objeto, pode-se fazer a busca apenas em um nó específico ou em uma subárvore (iniciando em um determinado nó).
• Descentralização. Cada parte da árvore pode ser armazenada em uma máquina diferente, mas todos continuam vendo a árvore inteira.
Vamos analisar melhor essas questões. Imagine uma universidade como a UFRN, que tem milhares de alunos e possui várias unidades em diversas cidades, como Natal, Caicó e Mossoró, por exemplo. Em cada uma dessas unidades existem diversos cursos. Para armazenarmos as informações dos usuários da UFRN numa base LDAP, seria interessante organizarmos essas informações em uma árvore LDAP, como a mostrada na Figura 9.
Cada nó possui um nome abreviado, que se encontra mostrado dentro de cada círculo na Figura 9, e um nome completo, que para alguns nós está mostrado próximo ao círculo. Veja que o nó raiz é nomeado com “o=ufrn”, onde esse “o” significa organização. Os demais nós se chamam “ou=XXX”, onde XXX é o nome abreviado do nó. A sigla “ou” significaOrganization Unit (Unidade Organizacional). A regra é que você deve nomear o nó raiz da sua árvore com “o” e todos os demais abaixo dele com “ou”.
Veja também que o nome de cada nó inclui o nome de todos os nós a partir dele até a raiz.
Figura 9 - Árvore LDAP
Esta árvore pode, então, ser utilizada para armazenar objetos do esquema “usuários” contendo as informações dos seus alunos. O objeto referente a cada aluno pode ser armazenado no nó do curso que o aluno pertence. Por exemplo, um aluno do curso de Direito da unidade Natal seria armazenado no nó “ou=direito,ou=natal,o=ufrn” enquanto um aluno do curso de Direito de Mossoró seria armazenado no nó “ou=direito,ou=mossoro,o=ufrn”.
Desse modo, quando se deseja pesquisar por um aluno, sabendo que curso ele faz, basta realizar a busca indicando em que nó da árvore ela deve ocorrer. Caso não se saiba a qual curso o aluno pertence, a busca pode ser feita a partir do nó raiz da árvore (o=ufrn), passando por todos os nós filhos.
No que diz respeito à descentralização, cada unidade poderia manter seu próprio servidor LDAP sendo responsável por manter a subárvore que inicia com o nó que possui o nome da unidade, mas todos os servidores veriam a árvore como ela é mostrada na Figura 9.
1. Qual é o nome completo do nó "Medicina" na Figura 9?
Identificação única de cada objeto
Cada esquema LDAP pode definir os campos que desejar, mas todos possuem obrigatoriamente um campo chamado “dn” (Distinguished Name – Nome Distinto), que é uma forma de identificar unicamente o objeto em toda a árvore. Portanto, o valor do campo dn de cada objeto na árvore deve ser diferente.
Para garantir isso, normalmente o valor utilizado neste campo é o nome e valor de algum campo que é único dentro do nó da árvore onde o objeto está armazenado, concatenado com o nome do nó. Para as informações dos alunos que usam o esquema “usuários”, o valor desse campo que precisa ser único dentro de cada nó poderia ser o campo “username”. Desse modo, o campo dn do usuário Carlos, do curso de Direito de Natal, seria “username=carlos,ou=direito,ou=natal,o=ufrn”.
Arquivos LDIF
As operações em um servidor LDAP podem ser feitas utilizando-se aplicações que manipulam arquivos textos que possuem um formato especial, chamado LDIF. Embora o formato exato de um arquivo LDIF dependa do tipo de operação que se deseje realizar, a Figura 10 mostra um exemplo de um arquivo para alterar o e-mail do usuário Carlos.
Figura 10 - Arquivo LDIF
LDAP na prática
Vamos ver agora como instalar um servidor LDAP na prática. Usaremos o programa Openldap, que é uma implementação do LDAP de código aberto, e faremos a instalação em uma máquina Linux.
Para instalar o pacote Openldap no Linux utilize o comando mostrado na Figura 11. O servidor LDAP está contido no pacote slapd, mas o pacote ldap-utils contém vários programas para realizar operações no servidor. Portanto, ele será necessário, por exemplo, para inserirmos objetos no servidor.
Figura 11 - Instalando o Openldap no Linux
Para configurar o servidor, precisaremos realizar três passos, que são:
• Informar ao servidor os esquemas que pretendemos suportar. Isso define quais tipos de objetos podem ser inseridos no servidor.
• Criar o arquivo de configuração e ativar a configuração.
• Criar os nós da árvore LDAP.
Após esses passos as informações a serem armazenadas podem ser inseridas nos nós da árvore LDAP.
Antigamente o LDAP era configurado através de um arquivo chamado slapd.conf. Embora este método ainda possa ser usado, ele está obsoleto. A forma recomendada atualmente para configurar um servidor LDAP é a descrita nesta aula.
Informar ao servidor os esquemas suportados
É necessário avisar ao servidor quais esquemas são suportados. Naturalmente, isso vai depender de para que você vai utilizar o LDAP.
Vamos inserir três esquemas que já vêm com o LDAP e são muito usados para armazenar informações dos usuários Linux. Os esquemas são cosine.ldif, nis.ldif e inetorgperson.ldif. A seguir, mostramos os três comandos (que devem ser executados como root) para instalar esses esquemas.
Criar o arquivo de configuração e ativar a configuração
Vamos agora criar o arquivo de configuração do servidor. Apesar do arquivo possuir muitos parâmetros, você realmente precisa alterar poucos desses parâmetros. Como um deles será a senha do administrador do LDAP, antes de alterarmos o arquivo vamos gerar uma senha. Isso pode ser feito com o comando slappaswd, conforme mostrado na Figura 12. No exemplo, a senha informada foi teste123, o que gerou a senha criptografada “{SSHA}vVi6+5ZybDaVo90pIXg9XqF1pYkk67+s”. Perceba que a senha criptografada depende dos caracteres usados na senha.
Figura 12 - Gerando senha para o arquivo de configuração do LDAP
Na Figura 13 mostramos um arquivo de configuração com os objetos e seus valores que foi criado para a árvore mostrada na Figura 9, e você pode utilizar como base para o seu servidor LDAP. Os únicos valores que você precisa alterar estão marcados em vermelho e significam:
• olcSuffix: o=ufrn. O nome do nó raiz da sua árvore.
• olcRootDN: cn=admin,o=ufrn. O nome do usuário administrador do LDAP. Você usará esse nome sempre que for realizar operações no LDAP que precisem de privilégios de administrador. Basta alterar valor o=ufrn para o valor que tiver utilizado no campo olcSuffix (descrito no item anterior).
• olcRootPW: {SSHA}vVi6+5ZybDaVo90pIXg9XqF1pYkk67+s. A senha do usuário administrador do LDAP definido no item anterior. Coloque aqui o valor obtido com o comando slappasswd, conforme mostrado na Figura 12.
• olcAccess. São as permissões para o usuário administrador do LDAP tem. Portanto, onde aparecedn="cn=admin,o=ufrn", coloque o mesmo valor que informou para o campo olcRootDN, explicado anteriormente.
Figura 13 - Arquivo de configuração do servidor LDAP
Salve este arquivo (com suas modificações) no diretório /etc/ldap com o nome ldapconfig.ldif e digite o seguinte comando (como root) para ativar suas configurações.
Criar os nós da árvore LDAP
Como última etapa para terminar a criação da nossa base LDAP, vamos criar os nós da árvore. Posteriormente, as aplicações que forem utilizar essa base LDAP vão inserir os objetos contendo as informações a serem armazenadas dentro desses nós. Como exemplo, vamos criar os nós “ufrn”, “Caicó”, “Natal” e “Mossoró”.
A criação desses nós também é feita utilizando um arquivo ldif, que está mostrado na Figura 13.
As primeiras quatro linhas definem o nó raiz (isso é indicado pelo campo objectClass: top).
O campo “objectClass: organization” define que o nó é do tipo Organização (“o”). O campo “o” define o nome abreviado desse nó, e o campo “dn”,além de definir o nome completo do nó (que é único), indica em que posição da árvore o nó se encontra. Como o valor de dn (o=ufrn) é o próprio nome do nó, significa que não existe ninguém acima dele – como deve ser, já que ele é o nó raiz.
Cada grupo de três linhas define um nó abaixo da raiz. Cada nó é do tipo “ou”, conforme indicado pelo campo “objectClass: organizationalUnit”.
O valor do campo “ou” indica o nome abreviado do nó, e o campo dn indica tanto o nome completo (que é único) quanto a posição onde o nó se encontra na árvore. A posição é calculada retirando-se o valor do nome abreviado do valor do campo dn. Assim, para o nó “caico”, que possui o nome abreviado “ou=caico”, se retirarmos isso do valor do dn “ou=caico,o=ufrn”, temos que esse nó fica abaixo do nó com o dn “o=ufrn”, que é o nó raiz.
Figura 14 - Arquivo LDIF para criar os nós da árvore
Se quiséssemos inserir o nó “Medicina” abaixo do nó “Mossoró”, bastava inserir as linhas mostradas na Figura 15 no arquivo mostrado na Figura 14. Lembre-se que deve existir uma linha em branco entre a definição de dois nós da árvore.
Figura 15 - Inserindo o nó Medicina abaixo do nó Mossoró
Salve o arquivo mostrado na Figura 14 como cria_arvore.ldif na pasta /etc/ldap. Agora que o arquivo ldif está criado, basta executar o seguinte comando para que os nós da árvore sejam criados.
Será pedida a senha do usuário “cn=admin,o=ufrn”, que foi o usuário que você informou no arquivo de configuração do servidor LDAP (parâmetro olcRootDN), mostrado na Figura 12. Portanto, informe a senha colocada neste mesmo arquivo (no parâmetro olcRootPW), que foi gerada com o comando slappasswd, mostrado na Figura 12.
Se você informar a senha errada, aparecerá a mensagem “ldap_bind: Invalid credentials (49)”.
Feito isso, seu servidor está pronto para ser utilizado! Se quiser verificar como está sua árvore, você pode digitar o comando ldapsearch, conforme mostrado na Figura 16.
Figura 16 - Mostrando os nós criados
O ldapsearch mostra o conteúdo do servidor incluindo os nós da árvore e os objetos armazenados nesses nós. No nosso caso, só apareceram os nós porque ainda não temos nenhum objeto armazenado dentro deles.
Além disso, observe que o ldapadd pode ser utilizado para inserir os objetos dentro dos nós. O que determina o tipo de informação inserida é o conteúdo do arquivo ldif!
1. O que significam os parâmetros olcRootDN eolcRootPW no arquivo de configuração do servidor LDAP?
2. Na árvore LDAP criada, quantas e quais são as unidades organizacionais?
3. Quais são os parâmetros que não podem faltar para se criar uma árvore LDAP?
Inserindo objetos dentro dos nós da árvore
Nós vimos até agora como criar uma árvore LDAP. Nesta seção será mostrado o procedimento para inserir objetos dentro dos nós da árvore. Podemos ver que é semelhante ao procedimento de criar os nós. Basta criar um arquivo ldif e executar o comando ldapadd.
Naturalmente, os dados contidos no arquivo ldif são referentes ao objeto que será incluído no diretório. Ou seja, os campos a serem informados dependem do esquema ao qual o objeto pertence. Na listagem a seguir, o objeto a ser criado pertence aos esquemas inetOrgPerson, posixAccount, shadowAccount. Sabemos disso olhando os valores dos campos objectClass. Portanto, cada campo informado é de um desses esquemas.
Figura 17 - Arquivo LDIF para inserção de um objeto dentro de um nó da árvore
Supondo que este arquivo foi salvo com o nome cria_usuario.ldif na pasta /etc/ldap, bastaria digitar o comando a seguir para que o objeto contendo os dados do usuário fossem inseridos no LDAP.
Acessando o LDAP graficamente
Embora tenhamos mostrado que é possível utilizar a base LDAP através de comandos digitados no terminal, existem ferramentas gráficas (chamadas LDAP Browsers) para realizar todas as operações. Normalmente o processo de criação da base de dados é realizado do modo que lhe mostramos, ou seja, através de comandos.
Depois, normalmente usamos uma ferramenta gráfica, como o Jxplorer, cuja tela inicial é mostrada na Figura 18.
Figura 18 - Jxplorer: programa para administrar um servidor LDAP graficamente
A primeira coisa a fazer é conectar no servidor LDAP.
Para isso, clique no menu “File”e depois em “Connect”. Será então mostrada a tela da Figura 18. O campo Host deve ser preenchido com o endereço IP do servidor ou seu nome de DNS.
O servidor LDAP utiliza o protocolo TCP e espera conexões na porta 389. Por isso, digite 389 no campo Port. Base DN é o nó da árvore a partir do qual queremos ver as informações após a conexão. User Level indica o tipo de autenticação utilizado para se conectar no servidor. Caso não esteja utilizando criptografia, informe “User + Password”. Nos camposUser DN e Password informe os dados do administrador do LDAP. Depois clique em OK para conectar no servidor.
Figura 19 - Tela de login do Jxplorer
Após a conexão será mostrada a tela da Figura 19. Veja que para o nosso servidor de exemplo já aparecem os nós da árvore criada.
Clicando sobre um nó, na parte direita aparecem os campos que compõem o nó. Não entraremos em maiores detalhes sobre a interface deste programa, mas em “Schema” você pode ver todos os esquemas que este servidor suporta, e os campos que existem em cada um.
Veja por exemplo o esquema posixAccount, que será usado para a autenticação dos usuários.
Figura 20 - Dados do servidor LDAP exemplo
LDAP x bancos relacionais (SQL)
Caso você já saiba o que é um banco de dados relacional (um banco SQL), pode estar se perguntando qual a diferença entre ele e o LDAP. Resumidamente, podemos ressaltar três pontos principais:
• Um banco SQL armazena suas informações em tabelas, enquanto no LDAP elas são armazenadas em forma de árvore.
• Embora um diretório LDAP suporte atualizações, ele é otimizado para operações de leitura. Portanto, se o número de modificações na sua base de dados é muito alto, seria mais indicado utilizar uma base SQL que uma LDAP.
• Várias aplicações já suportam LDAP, e existem esquemas criados especificamente para essas aplicações. Cada vez mais o LDAP está se tornando o padrão para o armazenamento de dados de diversas aplicações, como e-mail, browsers, DNS, entre outras. Um browser, por exemplo, pode guardar sua lista de sites favoritos em um servidor LDAP.
1. Após aprender as duas formas de efetuar a instalação e a configuração do LDAP, com qual delas vocês se familiarizou mais? Você acha que uma tem vantagem em relação a outra?
Com isso, finalizamos essa aula na expectativa de que você tenha aprendido os conceitos que foram abordados. Para expandir os conhecimentos sugerimos que você faça pesquisas nos sites de buscas da Internet sobre os assuntos estudados, tendo sempre o cuidado de acessar materiais de fontes confiáveis.
Resumo
Nesta aula você aprendeu que em uma rede é necessário que existam os serviços de autenticação de usuários e de compartilhamento de arquivos para que o usuário possa utilizar qualquer máquina da rede de modo transparente. Viu que estes serviços utilizam um programa no cliente e outro no servidor e que esses programas se comunicam usando algum protocolo. No caso da autenticação, aprendeu que o LDAP é um dos protocolos mais usados para essa finalidade. Nesta aula você aprendeu que o LDAP pode ser usado também para qualquer outra finalidade onde seja necessário armazenar e consultar informações de modo centralizado. Aprendeu a instalar e configurar o servidor Openldap no Linux e a usar ferramentas em modo texto e com interface gráfica para manipular a base LDAP.
Acesse o Laboratório1 desta aula (Aula 9) no Virtualbox e realize os procedimentos descritos a seguir.
1. Instale um servidor LDAP na máquina-A e crie uma árvore contendo um nó raiz, chamado “o=metropoledigital”, e dois nós filhos da raiz, chamados “ou=cursos” e “ou=pessoas”.
2. Insira no nó “ou=pessoas” um objeto semelhante ao criado na Figura 16, com a diferença que a pessoa se chama “Maria”.
3. Instale o jxplorer e verifique se o objeto do usuário criado no passo anterior foi realmente incluído no nó "ou=pessoas".
Redes de Computadores
Aula 10 – Autenticação e compartilhamento de arquivos: parte II
Na aula passada você aprendeu sobre a necessidade de um serviço de autenticação e compartilhamento de arquivos e estudou a teoria sobre esses serviços.
Além disso, viu que o LDAP é um dos protocolos mais utilizados para implementar o serviço de autenticação. Sobre o LDAP você aprendeu o protocolo e viu como instalar e configurar um servidor, mas não se preocupou muito com a finalidade para a qual ele seria utilizado.
Nesta aula, você vai aprender a usar o LDAP para criar o serviço de autenticação. Vai aprender também a configurar o serviço de compartilhamento de arquivos usando o protocolo NFS. Usaremos LDAP+NFS para que clientes Linux autentiquem e acessem arquivos de um servidor Linux.
Ao final desta aula você será capaz de:
• Criar um serviço de autenticação usando LDAP, onde máquinas cientes Linux se autenticam em um servidor Linux.
• Criar um serviço de compartilhamento de arquivos no Linux usando NFS, de modo que os arquivos dos usuários que estão no servidor possam ser acessados da máquina do cliente.
Usando o LDAP para autenticação
Vamos agora ver como utilizar um servidor LDAP para armazenar as informações sobre os usuários e autenticá-los quando tentarem utilizar uma máquina cliente.
Estrutura da árvore LDAP para autenticação de usuários
Na aula passada vimos um exemplo de uma árvore LDAP, onde tínhamos um nó raiz do tipo “o” para representar a organização no qual usamos “o=ufrn”. Todos os outros nós da árvore eram nós do tipo “ou” e representavam lugares ou cursos. Como você vê, uma OU pode representar qualquer coisa.
Quando vamos usar o LDAP para autenticar usuários é muito comum criarmos mais três nós do tipo “ou” abaixo de cada nó que representa o lugar onde os usuários serão cadastrados. Esses três novos nós são “Pessoas”, “Grupos” e “Máquinas”, e serão utilizados para armazenarem, respectivamente, os objetos que representam os usuários, os grupos de usuários e os computadores.
Para esta aula vamos usar como árvore LDAP a árvore mostrada na Figura 1. Esta árvore é muito semelhante à utilizada na aula passada, com a diferença que eliminamos os nós referentes aos cursos. Portanto, os alunos de todos os cursos de cada unidade serão cadastrados no nó da unidade. Veja que só fizemos isso para a árvore ficar menor e simplificar a nossa explicação. Em um caso real provavelmente deixaríamos os nós com os nomes dos cursos! Observe também que acrescentamos os três novos nós citados no parágrafo anterior abaixo do nó de cada unidade.
Figura 1 - Árvore LDAP usada nesta aula
Para criar esses novos nós poderíamos fazer o seguinte:
Todas as informações da sua base LDAP, incluindo os nós e os dados inseridos dentro de cada nó, são armazenadas em arquivos no diretório /var/lib/ldap. Portanto, se quiser apagar toda sua base e começar uma nova, faça o seguinte:
• Pare o serviço LDAP com o comando: /etc/init.d/slapd stop
• Apague todos os arquivos da pasta /var/lib/ldap com o comando: rm /var/lib/ldap/*
• Inicie serviço LDAP novamente com o comando: /etc/init.d/slapd start
Vamos assumir para o texto desta aula que um servidor LDAP está instalado (com a árvore mostrada na Figura1) em uma máquina com endereço IP 10.1.1.1. Desse modo, sempre que você vir este endereço em algum lugar nessa aula é porque o endereço IP do servidor LDAP deve ser informado.
Simplificando a gerência de usuários e grupos
Na aula passada você também aprendeu a inserir usuários na sua base LDAP. Porém, você viu como fazer isso criando um arquivo ldif com as informações dos usuários e usando o programa ldapadd para ler esse arquivo e inserir as informações. Existe uma forma muito mais simples de manipular usuários e grupos, que é utilizar os programas de um pacote chamado ldapscripts.
1. Para instalar esse pacote, digite:
apt-get install ldapscripts
Os programas do pacote ldapscripts utilizam um arquivo de configuração chamado ldapcripts.conf, que fica no diretório /etc/ldapscripts.
2. Edite este arquivo de acordo com a configuração do seu servidor LDAP. Na Figura 2 mostramos os valores usados para nosso servidor LDAP de exemplo.
Figura 2 - Arquivo ldapscripts.conf
Os três primeiros parâmetros informam, respectivamente, o IP do servidor LDAP, o usuário administrador e um arquivo que contenha a senha desse usuário. Explicaremos em breve como criar esse arquivo.
Os parâmetros GSUFFIX, USUFFIX e MSUFFIX indicam, respectivamente, os nomes dos nós onde os grupos, os usuários e as máquinas serão inseridos.
O valor do parâmetro SUFFIX será concatenado aos parâmetros anteriores para formar o nome completo daqueles nós. Ou seja, um usuário, por exemplo, será inserido no nó “ou=pessoas,ou=natal,o=ufrn”, e um grupo será inserido em “ou=grupos,ou=natal,o=ufrn”.
Os parâmetros GIDSTAR, UIDSTART e MIDSTAR indicam, respectivamente, os identificadores numéricos iniciais que serão atribuídos aos grupos, usuários e as máquinas. O primeiro usuário, por exemplo, terá o identificador 10000, o segundo usuário 10001 e assim sucessivamente. A última linha fará com que durante o cadastro de novos usuários seja solicitada uma senha para ele.
Para criar o arquivo contendo a senha do administrador do LDAP (cn=admin,o=ufrn) digite os comandos a seguir, substituindosenha pela senha desse usuário. Essa senha é a mesma senha que foi colocada no parâmetro olcRootDN do arquivo de configuração do servidor (veja Figura 13 da Aula 9).
sudo sh -c "echo -n 'senha' > /etc/ldapscripts/ldapscripts.passwd"
sudo chmod 400 /etc/ldapscripts/ldapscripts.passwd
Agora basta utilizar um dos programas do pacote ldapscripts para manipular usuários e grupos. Os comandos devem ser digitados pelo usuário root, pois eles precisam ler o arquivo ldapscripts.passwd. A Tabela 1 mostra exemplos dos comandos mais utilizados e o seu significado.
Comando Significado
ldapadduser maria alunos Cria o usuário maria e o insere no grupoalunos
ldapsetpasswd maria Troca a senha do usuário maria
ldapdeleteuser maria Exclui o usuário maria
ldapaddgroup teste Cria o grupo teste
ldapdeletegroup tese Exclui o grupo teste
ldapaddusertogroup maria teste Insere o usuário maria no grupo teste
Tabela 1 - Comandos do pacote ldapscripts
Saiba que o comando para criação de usuários na LDAP não cria a pasta do usuário. Isso precisa ser feito manualmente pelo usuário root.
1. Para que serve o pacote ldapscripts?
2. Uma forma de saber mais dobre cada comando é usando o man (manual do programa). Use o man para saber mais detalhes de cada um dos comandos acima. Ex.: no Linux, em um terminal execute: man ldapadduser
Criando as pastas dos usuários no servidor
Lembre-se que ao criar os usuários no LDAP as pastas deles não são criadas. Portanto, é necessário que elas sejam criadas manualmente. Para isso basta utilizar o comando mkdir. Como exemplo, segue o comando para criar a pasta de Maria.
sudo mkdir /home/maria
Depois disso é necessário trocar o proprietário da pasta e o grupo para os referentes à Maria. Supondo que maria pertence ao grupo alunos, o comando seria:
sudo chown -R maria:alunos /home/maria
Mas atenção! A máquina onde estão os arquivos de Maria precisa estar configurada para autenticar no servidor LDAP. A confusão é que quando esta máquina é o próprio LDAP, costuma-se achar que ela já está configurada para isso. Mas não é verdade! Mesmo a máquina onde o LDAP está instalado precisa ser configurada para autenticar no LDAP (que é ela mesma). A configuração é a mesma que mostramos anteriormente para as máquinas clientes. Afinal, ela é um cliente dela mesma.
Parece confuso, mas você precisa pensar em termos de programas, e não de máquinas. Os programas da máquina que autenticam os usuários não sabem que o programa LDAP está na própria máquina.
LDAP como servidor de autenticação de usuários
Finalmente, agora vamos ver como criamos um servidor de autenticação usando o LDAP. Na verdade o lado do servidor está pronto! Ou seja, tudo que tínhamos de fazer na máquina onde o programa slapd executa já foi feito, pois para o LDAP não interessa para que ele vai ser usado. Todo LDAP tem uma árvore definida e objetos criados nessa árvore.
A única coisa que fizemos especificamente para o serviço de autenticação foi criar os nós “pessoas”, “grupos” e “maquinas”.
Portanto, a configuração do serviço de autenticação vai se concentrar nas máquinas clientes, ou seja, nas máquinas que vão autenticar os usuários remotamente usando o LDAP. A primeira coisa a fazer em cada máquina cliente é instalar o pacote libnss-ldap, conforme mostrado a seguir. Isso irá instalar vários outros pacotes que também são utilizados, que são: auth-client-config ldap-auth-client ldap-auth-config libpam-ldap.
apt-get install libnss-ldap
Durante a instalação, o libnss-ldap executa um programa de configuração que faz sete perguntas. Essas perguntas e as respostas que deveriam ser dadas para nosso exemplo (texto em negrito) são mostradas a seguir.
1ª - Qual o protocolo e endereço IP do servidor LDAP? ldap://10.1.1.1/
2ª – Nó da árvore a partir do qual os usuários serão pesquisados? ou=natal,o=ufrn
3ª - Versão do protocolo LDAP a ser utilizada? 3
4ª - Tornar o usuário root local administrador do LDAP? Sim
5ª - O diretório LDAP requer login? Não
6ª – Usuário administrador do LDAP? cn=admin,o=ufrn
7ª – Senha do usuário administrador do LDAP? coloque-a-senha-do-admin-aqui
Na verdade, após responder essas perguntas será criado o arquivo ldap.conf na pasta /etc, com o conteúdo mostrado na Figura 3. Existem diversas outras linhas no arquivo que é gerado, mas elas estão todas comentadas (iniciam com #). Portanto, não são usadas!
Figura 3 - Arquivo /etc/ldap.conf
Caso queira refazer essa configuração, ou seja, alterar algum valor que informou, você pode editar o arquivo manualmente ou digitar o comando a seguir, que irá executar o programa de configuração novamente.
sudo dpkg-reconfigure ldap-auth-config
Ao respondermos às sete perguntas anteriores, deixamos o libnss-ldap configurado. Agora precisamos dizer ao sistema operacional que use o ldap para a autenticação. Isso é feito com o comando a seguir.
sudo auth-client-config -t nss -p lac_ldap
O que esse comando faz é apenas alterar o conteúdo do arquivo nsswitch.conf para solicitar que ele também use o ldap para obter as informações dos nomes dos usuários, dos grupos e as senhas dos usuários. Isso é feito alterando o valor das três primeiras linhas do arquivo.
A Figura 4 mostra o arquivo antes da alteração e depois.
Figura 4 - Arquivo /etc/nsswitch.conf antes e depois da configuração do pacote libnss-ldap
Para testar se sua máquina cliente está conseguindo obter as informações do LDAP, digite o comando getent, conforme mostrado a seguir, para obter informações de um usuário do LDAP. O comando mostrado obtém informações do usuário maria(assumindo que ele existe no ldap).
sudo getent passwd maria
maria:x:10001:10001:Maria Silva:/home/maria:/bin/bash
Outra forma de testar a autenticação é realizando um ssh na máquina cliente para a própria máquina cliente com um usuário que existe no ldap. O exemplo a seguir utiliza o usuário maria.
ssh maria@localhost
Se o login for bem sucedido é porque o cliente conseguiu autenticar no LDAP.
1. Qual o arquivo de configuração onde se informa em qual servidor LDAP uma máquina cliente deve se autenticar?
2. Veja o que acontece se digitar o comando getent passwd (sem especificar nenhum usuário).
NFS
Agora vamos estudar o serviço de compartilhamento de arquivo, que, conforme falamos antes, normalmente é utilizado em conjunto com o serviço de autenticação. Ou seja, não adianta muito o serviço de autenticação permitir que você utilize qualquer máquina da rede se seus arquivos não aparecerem lá.
Na sessão anterior, quando sugerirmos que Maria executasse um ssh para a própria máquina cliente, após o login iria aparecer a mensagem “Could not chdir to home directory /home/maria: No such file or directory”. Isso significa que a pasta demaria (/home/Maria) não existe na máquina local. Ela conseguirá efetuar o login, mas o Shell iniciará na pasta / (raiz)!
Nesta sessão vamos aprender a usar o NFS (Network File System) para compartilhar pastas pela rede.
O que o NFS faz é associar uma pasta do cliente com uma pasta do servidor.
Desse modo, sempre que o cliente acessar essa pasta, na verdade ele estará acessando a pasta do servidor. Com isso, a pasta de Maria que está no servidor iria “aparecer” na máquina cliente.
A Figura 5 mostra como estariam os discos (e as pastas) na máquina servidora, onde existem os arquivos de Maria, e a máquina cliente, onde não existe nada relacionado àquele usuário.
Figura 5 - Discos do servidor e do cliente antes do compartilhamento
Para compartilhar as pastas de Maria são necessários três passos:
1. O servidor precisa exportar a pasta de maria (/home/maria). Por exportar entenda liberar o acesso a esta pasta (e suas subpastas) para as máquinas da rede.
2. A máquina cliente precisa criar uma pasta local para onde a pasta remota será associada. Essa pasta local é chamada ponto de montagem.
3. A máquina cliente precisa associar a pasta local com a pasta do servidor. Esse processo é chamado de montar a pasta.
A Figura 6 mostra como ficaria a configuração das máquinas após os três passos anteriores serem realizados. Neste ponto a máquina cliente acessa as pastas docs e mp3 de maria como se elas fossem pastas locais (da máquina cliente).
Figura 6 - Configuração após compartilhamento
A pasta no cliente onde é feita a associação não precisa ser igual à pasta do servidor. No exemplo acima, a pasta /home/maria do servidor poderia, por exemplo, ter sido associada a uma pasta /usuários na máquina cliente.
1. O que significa o termo ponto de montagem para o NFS?
2. O que significa o termo montar uma pasta para o NFS?
3. É possível apagar uma pasta NFS que está montada em uma máquina cliente?
4. Use o comando ls –la no /home e veja quais as permissões das pastas.
Instalando e configurando o NFS
Para instalar o NFS é necessário instalar dois pacotes na máquina que vai atuar como servidora, ou seja, onde estão os arquivos e pastas a serem compartilhados. Para isso, digite o comando a seguir.
apt-get install nfs-kernel-server portmap
O Portmap
É importante saber que, diferentemente da maioria dos programas que atuam como servidor, o NFS não escuta em uma porta fixa. Ou seja, enquanto um servidor web sempre escuta na porta 80, um servidor de e-mail na porta 25, e um servidor de DNS na porta 53, a cada vez que você executa NFS ele pode usar uma porta diferente.
Portanto, a princípio, o programa cliente não tem como saber a porta onde o servidor está. Para resolver isso o NFS informa a um programa chamado portmap em qual porta ele está escutando. Como o portmap sempre escuta em uma mesma porta (porta 111), os clientes sabem que porta é essa, e perguntam ao portmap em qual porta o NFS está escutando. A Figura 7 mostra os passos até que o cliente localize o servidor NFS.
Figura 7 - Localizando o servidor NFS através do Portmap
Do que foi dito no parágrafo anterior, o mais importante é que você se lembre que, além do NFS, o portmap também tem que estar executando, senão o NFS não vai funcionar. Você não precisa iniciar o portmap manualmente, pois ele já é iniciado automaticamente. De qualquer modo, o comando para iniciá-lo é:
/etc/init.d/portmap start
Configurando o NFS
Vamos agora ver como realizar os três passos que citamos anteriormente para compartilhar uma pasta.
Passo 1
Para exportar uma pasta basta inserir uma linha para ela no arquivo /etc/exports, conforme mostrado a seguir.
Figura 8 - Arquivo /etc/exports
O * significa que qualquer máquina da rede pode montar essa pasta. Ao invés do asterisco poderia ter sido colocado um endereço IP, por exemplo. Nesse caso, apenas a máquina informada poderia montar a pasta.
O “rw” significa que o cliente pode ler e escrever na pasta. Se você desejasse que o cliente pudesse apenas ler o conteúdo da pasta, bastava informar “ro” ao invés de “rw”. Sync faz com que as operações solicitadas pelo cliente sejam executadas imediatamente.
A opção “root_squash” significa que o usuário root da máquina cliente não terá direito de root nessa pasta. Ou seja, ele se comportará como um usuário comum.
Depois de inserir a linha mostrada no arquivo, basta executar o comando a seguir para ativar o compartilhamento.
exportfs -a
Se quiser ver as pastas compartilhas atualmente, digite o mesmo comando sem o “-a”. Além disso, para cancelar o compartilhamento, basta apagar a linha do arquivo e executar novamente o comando “exportfs –a”.
Passo 2
Crie o ponto de montagem na máquina cliente. Ou seja, crie a pasta local para a qual pasta remota estará associada. Depois modifique o proprietário e o grupo dela. Esse dois procedimentos são mostrados a seguir.
mkdir /home/maria
chown –R maria:alunos /home/maria
Naturalmente, essa máquina deve estar configurada para autenticar no servidor LDAP para poder reconhecer os usuários (no caso maria).
Passo 3
A máquina cliente precisa instalar o programa a seguir.
apt-get install nfs-common
Depois, basta fazer a associação da pasta local com a pasta remota. Para isso insira a linha a seguir no arquivo /etc/fstab.
Figura 9 - Linha a ser adicionada ao arquivo /etc/fstab
O texto “10.1.1.1:/home/Maria” indica a pasta remota e a máquina onde ela está. O texto seguinte, “home/Maria”, é o nome da pasta local que ficará associada à pasta remota. Depois temos “nfs”, que indica o tipo de sistema de arquivos. Os demais parâmetros são para melhorar o desempenho, além de não travar a máquina cliente caso a conexão com o servidor pare de funcionar.
Você pode usar sempre esses mesmos parâmetros, alterando, evidentemente, o IP do servidor e os nomes das pastas.
Quando a máquina for reiniciada, o arquivo /etc/fstab será lido e a pasta será montada. Entretanto, você provavelmente não vai querer reiniciar seu servidor só porque está compartilhando uma pasta.
Por isso, você pode executar o comando a seguir para ativar a configuração imediatamente, ou seja, para montar a pasta remota localmente, conforme indicado no arquivo /etc/fstab
mount -a
Pronto! Agora pode acessar a pasta local /home/Maria, que na verdade estará acessando a pasta do servidor.
Voltando ao exemplo que tínhamos utilizado para testar a autenticação do LDAP no cliente, Maria pode agora fazer ssh para a própria máquina cliente. Após o login ela estará na sua pasta, e se ela digitar o comando ls, o resultado apresentado seria o mostrado a seguir.
Assim sendo, as pastas docs e mp3 que estão no servidor aparecem como se estivessem na máquina local.
ls /home/maria
docs mp3
1. Se o portmap não estiver executando o NFS vai funcionar?
2. Qual a função do comando “exportfs –a”?
3. Acesse o endereçohttps://www.vivaolinux.com.br/artigo/FSTAB-Sua-funcao-e-parametros e veja qual a função do arquivo FSTAB do Linux.
Todos os usuários
Em uma rede real você tipicamente exportaria o /home do servidor e o montaria no /home dos clientes. Isso faz com que os usuários possam utilizar qualquer máquina da rede.
Monitorando o NFS
Vamos ver agora mais alguns comandos importantes quando utilizamos o NFS. Nos exemplos, assuma que a máquina que está atuando como servidor NFS se chama Máquina-A.
Programas que compõem o NFS
Quando explicamos o portmap dissemos que o NFS obtém uma porta e a informa ao portmap, e que os clientes perguntam ao portmap pela porta que o NFS está utilizando. Tudo aquilo está correto, mas temos duas coisas a acrescentar.
A primeira é que esse modo de funcionamento utilizando o portmap acontece porque o NFS usa um protocolo chamado RPC (Remote Procedure Call) para trocar suas mensagens. Qualquer programa que use RPC utiliza esse esquema do portmap.
A segunda coisa a acrescentar é que embora tenhamos nos referido ao NFS como se fosse um único programa, na verdade o NFS é composto por vários programas, e todos usam RPC. Existe, por exemplo, um programa responsável por tratar as requisições de montagem, chamado mountd, outro responsável por realmente atender às operações que acessam os arquivos e pastas, chamado nfs, e um terceiro, chamado nlockmgr, encarregado de fazer o lock dos arquivos. Os programas que compõem a implementação do NFS no servidor são mostrados na Figura 10. Veja que essa listagem foi obtida com o comandorpcinfo.
Figura 10 - Programas que compõem o NFS
Vamos agora parar o serviço NFS e repetir o comando acima. Para parar o NFS basta digitar o comando a seguir.
/etc/init.d/nfs-kernel-server stop
O resultado é mostrado na Figura 11. Veja que os programas nfs, mountd, nlockmgr não estão mais executando.
Figura 11 - Programas RPC executando após a parada do NFS
Para iniciar novamente o NFS basta digitar o comando a seguir. Quando detectar algum problema no NFS primeiro certifique-se que todos os programas estão executando, conforme mostrado na Figura 10. Caso detecte algum problema você pode parar e reiniciar o serviço NFS com os comandos mostrados.
/etc/init.d/nfs-kernel-server start
Lembre-se que os programas mostrados na Figura 10 foram os programas executando na máquina servidora NFS. Na máquina cliente o único programa do NFS executando é o nlockmgr. Os programas portmap e status não são propriamente do NFS! Eles são programas para suportar o RPC; portanto, sempre devem estar executando.
Clientes acessando o servidor
Para verificar quais máquinas clientes montaram cada pasta do servidor, você pode utilizar o comando showmount, conforme mostrado na Figura 12. Veja que a máquina cliente 10.1.1.5 montou a pasta /home/Maria.
Figura 12 - Pastas sendo acessadas pelas máquinas clientes
Verificando se uma montagem foi bem sucedida
O cliente pode verificar se ele conseguiu montar uma pasta do servidor simplesmente tentando acessar a pasta. Mas se ele quiser, pode digitar o comando mount, sem nenhum parâmetro, e ver se aparece uma linha relativa à pasta do servidor. Para o nosso exemplo, essa linha seria como a mostrada a seguir. Veja que são mostrados todos os parâmetros usados no arquivofstab.
10.1.1.1:/home/maria on /home/maria type nfs (rw,rsize=8192,wsize=8192,timeo=14,intr,addr=10.1.1.1)
1. Execute o comando man rpcinfo para ver outras opções do comando rpcinfo;
2. Olhando para o quadro acima, explique o que significam os seguintes dados: (10.1.1.1, o nfs e o rw);
3. Explique qual a vantagem de ter uma pasta remota montada localmente.
Você deve ter percebido que essa aula foi bastante prática. Nós tentamos fazer com que o assunto fosse apresentado de forma clara, sempre mostrando alguns exemplos de uso. Deixamos claro que é muito importante que você tente praticar o máximo possível.
Leituras Complementares
Deixamos aqui algumas sugestões de leituras para enriquecer um pouco a aula e para que você possa ler alguns assuntos com mais detalhes, pois não temos como abordar profundamente todos os assuntos em uma aula. Perceba que alguns links indicados abordam também outros serviços.
•
•
•
•
Resumo
Nesta aula você aprendeu a realizar umas das tarefas mais importantes em qualquer rede, que é criar um serviço de autenticação de usuários e compartilhamento de arquivos. Você viu que isso permite que os usuários utilizem qualquer máquina da rede, e ainda assim, seus arquivos vão estar disponíveis naquela máquina. Para implementar o serviço de autenticação nós utilizamos um servidor LDAP, e para realizar o compartilhamento das pastas nós usamos o NFS. Nesta aula utilizamos apenas máquinas Linux, tanto nos clientes quanto no servidor.
Acesse o Laboratório1 desta aula (Aula 10) no Virtualbox e realize os procedimentos descritos a seguir.
1. Configure a máquina-B para autenticar seus usuários no servidor LDAP existente na máquina-A.
2. Supondo que a máquina-B já está autenticando no LDAP da máquina-A, qual comando poderia ser utilizado na máquina-B para obter as informações do usuário pedroque existe na máquina-A?
3. Qual linha, e em qual arquivo, precisa ser adicionada à máquina-A para compartilhar (exportar) a pasta /home/pedro apenas para a máquina cliente 10.1.1.5, com permissões de leitura e escrita?
4. Qual linha, e em qual arquivo, precisa ser adicionada à máquina-B para montar a pasta compartilhada no item anterior?
Redes de Computadores
Aula 11 – Autenticação e compartilhamento de arquivos: parte III
Na aula passada você aprendeu a utilizar o LDAP e o NFS para criar um serviço de autenticação e compartilhamento para máquinas Linux acessarem um servidor também Linux.
Nesta aula você vai aprender que é possível fazer um servidor Linux se comportar como um servidor de autenticação e compartilhamento Windows, utilizando um protocolo conhecido como Samba. Desse modo, você pode criar uma rede onde o servidor é Linux e as máquinas que os usuários utilizam são Windows. Este tipo de uso é bastante comum atualmente, pois com isso se consegue usufruir dos benefícios de se ter o sistema operacional Linux na máquina que trabalha como servidor, sem ter que obrigar os usuários que utilizam o Windows a mudar de sistema operacional.
Ao final desta aula você será capaz de:
• Instalar e configurar um servidor Samba em uma máquina Linux fazendo com que ela forneça os serviços de autenticação e compartilhamento para máquinas Windows.
• Configurar as máquinas Windows para usarem o servidor Samba.
• Utilizar os comandos necessários para criar os usuários no servidor Samba.
• Compartilhar pastas no servidor Samba.
Samba
O esquema que mostramos para autenticar usuários e compartilhar pastas usando o LDAP e o NFS é muito usado em redes compostas apenas por servidores Linux. As redes Windows usam uma solução baseada no protocolo SMB/CIFS para realizar essas tarefas.
O protocolo SMB (Server Message Block) é um protocolo de camada de aplicação que permite o compartilhamento de recursos na rede, onde um recurso pode ser uma pasta ou uma impressora, por exemplo. Quando foi criado, em 1984, o SMB executava sobre os protocolos NetBIOS/NetBEUI, mas a partir de 1996 ele passou a ser executado sobre o TCP/UDP, e foi renomeado para CIFS (Common Internet FileSystem).
Como a maioria dos protocolos, o CIFS é composto por uma parte que executa nas máquinas clientes e outra que executa no servidor.
Portanto, se você possui máquinas clientes Windows que precisam se autenticar e acessar as pastas de um servidor, esse servidor precisa implementar o protocolo CIFS. Felizmente, existe uma implementação deste protocolo para Linux, que é o Samba.
Embora a palavra “samba” nos faça lembra do nosso gênero musical, a escolha desse nome não teve nada a ver com ele. O termo Samba está relacionado às letras s, m e b do protocolo SMB.
Portanto, com o Samba é possível ter máquinas Windows acessando pastas de uma máquina Linux, bem como ter uma máquina Linux acessando pastas de máquina Windows. Além de pastas, é possível acessar outros recursos, como impressoras, por exemplo.
Caso tenha curiosidade, a história do samba pode ser encontrada no link abaixo:
https://www.samba.org/samba/docs/10years.html
1. O que é CIFS?
2. O que é Samba?
3. O que motivou a criação do Samba?
4. O Samba pode ser instalado no Windows?
Instalação do Samba
Para instalar o Samba, basta digitar o comando a seguir. Isso irá instalar o pacote do servidor (samba), do cliente (smbclient) e da documentação (samba-doc).
apt-get install samba smbclient samba-doc
Você pode estar pensando se é necessário instalar o pacote samba na máquina cliente e o pacote smbclientna máquina servidora.
Lembre-se que qualquer máquina que deseje compartilhar uma pasta se torna um servidor, e qualquer máquina que precise acessar um recurso de outra máquina se torna um cliente. Portanto, normalmente você instala esses dois pacotes nas duas máquinas.
Observe, entretanto, que a configuração do Samba que você faz é que vai realmente dizer se você é um servidor ou não. Além disso, podemos pensar em dois tipos de servidores.
Um tipo são as máquinas que apenas compartilham pastas, como seria o caso de você compartilhar uma pasta para um amigo pegar alguns arquivos de sua máquina. O outro tipo de servidor são máquinas que vão possuir a relação de usuários da rede e, além de compartilhar pastas, vão atuar como servidores de autenticação.
Portanto, os programas necessários para esses dois tipos de servidor são os mesmos, mas a definição de qual tipo a máquina será vai ser feita através dos arquivos de configuração do samba.
Para verificar a versão do samba que foi instalada, digite o comando a seguir. A saída desse comando é algo como “Version 3.4.7”, indicando que a versão é 3.4.7.
smdb –V
Configuração do servidor Samba
A configuração que iremos realizar será para uma máquina Linux atuando como servidor de autenticação e compartilhamento de pastas, conforme ilustrado na Figura 1. Os usuários da rede serão criados na máquina Linux e suas pastas serão compartilhadas para as máquinas clientes Windows.
Figura 1 - Cenário de rede usado que será utilizado para a configuração do Samba
O servidor Samba pode armazenar as informações dos usuários e grupos em arquivos que ele mesmo cria ou armazená-los em um servidor LDAP. Nesta aula iremos configurar o servidor Samba usando os arquivos locais. A configuração para usar o LDAP, entretanto, é bastante parecida com a que será mostrada. As mudanças dizem respeito principalmente ao conteúdo do arquivo de configuração do Samba (smb.conf) que estudaremos a seguir.
Toda a configuração do Samba é controlada pelo arquivo /etc/samba/smb.conf. Este arquivo é dividido em seções, que são identificadas por nomes entre colchetes. Com exceção de algumas seções que têm nomes especiais e possuem comportamentos especiais, como [global], [home] e [netlogon], por exemplo, cada seção identifica um compartilhamento criado no servidor.
A Figura 2 mostra um exemplo das seções no arquivo smb.conf. Após o nome de cada seção, existem linhas (representadas nessa figura por uma sequência de pontos) que definem nomes de parâmetros e seus valores, e controlam como o compartilhamento vai se comportar.
Estudaremos esses parâmetros daqui a pouco, mas como exemplo de um parâmetro temos o nome da pasta sendo compartilhada. No caso da Figura 2, por exemplo, o nome [Programas] significa que vai ser criado um compartilhamento chamado Programas, mas o nome da pasta sendo compartilhada será definido por um parâmetro dentro desta seção, ou seja, em uma linha seguinte à linha [Programas]. Essa pasta poderia ser, por exemplo, /usr/local/programas. Saiba que o nome do compartilhamento e da pasta sendo compartilhada não precisa ser o mesmo.
Figura 2 - Estrutura em seções do arquivo smb.conf
Vamos agora estudar as seções que possuem nomes especiais, e depois estudaremos como compartilhar uma pasta qualquer da máquina. Para isso, vamos mostrar um exemplo do conteúdo do arquivo smb.conf que você pode utilizar como base quando for configurar um servidor.
Como o arquivo é muito grande, vamos apresentar cada seção separadamente, mas lembre-se que todas elas estão no mesmo arquivo. Além disso, indicamos em negrito os parâmetros que você pode precisar modificar ao reutilizar este arquivo quando for instalar seu servidor.
Após a apresentação de todas as seções do arquivo, faremos uma explicação de cada parâmetro. Se desejar, vá um pouco adiante no texto e leia a descrição dos parâmetros e depois volte para ver o conteúdo do arquivo.
Lembre-se que sempre que alterar alguma coisa no arquivo é necessário reiniciar o Samba com o comando mostrado a seguir.
/etc/init.d/samba restart
1. Utilize o comando smbstatus para verificar o status e descreva a sua saída.
2. Explique resumidamente o que é um compartilhamento no Samba.
3. Quais são os daemons que são iniciados no Samba?
4. Para que serve cada uma das seções listadas acima: global, homes e netlogon?
Seção [global]
A seção [global] é a única que não cria nenhum compartilhamento, mas é a mais importante, pois é nessa seção que são definidos todos os parâmetros relacionados à configuração do servidor (com exceção da criação das pastas compartilhadas propriamente ditas). Realmente as coisas teriam ficado mais claras se tivessem sido criados dois arquivos para configurar o Samba. Um teria apenas os parâmetros que você define nessa seção global, já que eles configuram a parte do servidor que não tem nada a ver com compartilhamento, e outro arquivo teria o conteúdo das demais seções, que definem os compartilhamentos. Entretanto, desse modo você teria dois arquivos para configurar! Por isso, tudo foi colocado nesse único arquivo chamadosmb.conf.
Figura 4 - Samba apenas como compartilhamento de pastas
Quando um parâmetro não aparecer no arquivo de configuração é porque está sendo usado o valor padrão para aquele parâmetro.
1. Qual o nome do arquivo de configuração do Samba?
2. Qual o nome do parâmetro que define o nome do domínio?
3. Pesquise e descubra quais os possíveis valores que podem ser usados no campo security e o que representa cada um deles.
4. Em que seção deveriam ficar as impressoras compartilhadas na rede?
5. Posso inserir quantos compartilhamentos no Samba?
Seção [home]
A seção [home] ativa o compartilhamento das pastas dos usuários. Caso não se deseje ativar este compartilhamento, basta comentar todas as linhas desta seção. Uma coisa importante a observar é que não será criado um compartilhamento chamado homes. Ao invés disso será criado um compartilhamento para cada usuário, e cada compartilhamento terá o nome do referido usuário.
Figura 5 - Seção [homes] do arquivo smb.conf
A Figura 5 mostra o exemplo de como uma seção normalmente é configurada. Como o parâmetro browseable é configurado para no, o usuário não conseguirá ver sua pasta se for acessá-la navegando pelas pastas de rede. Ele terá que realizar o mapeamento indicando o nome do compartilhamento dela explicitamente com o comando net use. Supondo que o usuário Maria existe no servidor, ela poderia mapear a sua pasta com o comando: “net use F: servidormaria”. Esse comando seria digitado na máquina cliente Windows, onde mariafez seu logon. Naturalmente deve-se substituir “servidor” pelo nome da máquina que for utilizada.
O parâmetro valid users indica quem pode acessar o compartilhamento. Como o valor %S é substituído pelo nome do compartilhamento, isso significa que cada usuário só pode acessar seu próprio compartilhamento.
Você vai estudar os demais parâmetros mais à frente, pois como eles podem ser utilizados também em outras seções do arquivo smb.conf, não faz sentido ficarmos repetindo a explicação várias vezes.
Você verá que todas as seções que estudaremos a seguir possuem um parâmetro chamado path,que diz o nome da pasta a ser compartilhada, mas a seção [homes] não tem! É que ela não precisa, pois obtém a pasta de cada usuário do arquivo /etc/passwd.
Seção [netlogon]
Esta seção é opcional e configura se haverá suporte para execução de scripts após o logon do usuário. Dizendo em outras palavras, é possível querermos executar um arquivo com comando do sistema operacional (é chamado de script) após o usuário se autenticar. Um exemplo de script seria criar um arquivo contendo apenas o comando net use mostrado anteriormente (na seção home) para mapear a pasta do usuário.
Desse modo, assim que o usuário conectasse no servidor sua pasta já seria mapeada automaticamente. A Figura 6 mostra um exemplo do conteúdo da seção [netlogon].
Figura 6 - Seção [netlogon] do arquivo smb.conf
Falta definir qual será o nome do arquivo a ser executado e a pasta onde ele está. A pasta onde o script é pesquisado é definida no parâmetro path. Portanto, para o arquivo mostrado na Figura 11, os scripts seriam pesquisados na pasta /var/samba/netlogon.
Lembre-se que você é que tem que criar essa pasta e definir suas permissões, pois ela não existe. Para isso, digite os comandos a seguir. Depois é só copiar os scripts que desejar para dentro dela.
mkdir –p /var/samba/netlogon
chmod 775 /var/samba/netlogon
O nome do arquivo a ser pesquisado nessa pasta é especificado pelo parâmetro logon script na seção [global]. Se você olhar o exemplo dessa seção que mostramos na Figura 3, verá que utilizamos “logon script = %U.bat”. Observe que “%U” será substituído pelo nome do usuário que se autenticar. Desse modo, quando o usuário maria se autenticar o arquivo pesquisado será maria.bat. Quando o usuário pedro se autenticar, o arquivo pesquisado será pedro.bat, e assim por diante. Com isso, é possível ter um arquivo de script para cada usuário.
Veja que só faz sentido criar esta seção quando a máquina Samba for configurada para ser um servidor de autenticação. Caso não se deseje ativar este recurso, basta comentar todas as linhas desta seção.
Como existe uma diferença nos caracteres utilizados pelo Linux e pelo Windows para representar o final de linha (ou seja, quando você aperta a tecla ENTER enquanto digita o conteúdo de um arquivo), o arquivo de script deve ser criado em uma máquina Windows e copiado para o servidor Samba.
Do mesmo modo que fizemos para a seção [homes], os demais comandos da seção [netlogon] serão explicados posteriormente.
1. Cite o nome de três seções especiais do arquivosmb.conf?
2. A seção [homes] cria um compartilhamento chamado Homes?
3. Usa-se nos scripts parâmetros que substituem nomes de usuários %S, nomes máquinas %M etc. Pesquise nos manuais do Samba outros parâmetros possíveis.
Seções predefinidas adicionais
Além das seções com nomes especiais que já estudamos, existem algumas outras que podem ser definidas caso se deseje, como uma seção para compartilhar impressoras, chamada [printers], e outra para armazenar as configurações da área de trabalho do usuário na máquina cliente (como menus, ícones, programas do menu iniciar etc.), chamada [profiles]. Não estudaremos essas seções nesta aula.
Seções para compartilhamentos adicionais
Como dissemos anteriormente, além dos compartilhamentos que acabamos de descrever é possível compartilhar qualquer pasta que desejar. Basta criar uma seção com o nome que se pretende dar para o compartilhamento entre colchetes, indicar o nome da pasta a ser compartilhada no parâmetro path e definir outros parâmetros que se desejar. Tipicamente são parâmetros de permissões de acesso, como os que fornecem ou retiram o acesso de escrita na pasta.
A Figura 7 mostra um exemplo simples onde é feito o compartilhamento da pasta /usr/local/programas que, suponha, contém apenas programas para os usuários baixarem suas máquinas, como antivírus, browsers, entre outros. Essa pasta será acessada através de um compartilhamento chamado Programas, que pode ser acessado através do ambiente de rede. Como no nosso exemplo, a pasta contém apenas programas; o conteúdo foi compartilhado em modo somente leitura, ou seja, o conteúdo da pasta não pode ser modificado. Isso significa que os arquivos da pasta não podem ser alterados nem apagados, e que outros arquivos ou pastas não podem ser criados nesta pasta. Adicionalmente, se quiséssemos que apenas o usuário Pedro acessasse este compartilhamento, poderíamos acrescentar a linha “valid users = Pedro” nesta seção.
Figura 7 - Exemplo de seção para compartilhar uma pasta
Você pode criar quantas seções dessas desejar. Ou seja, podem existir várias seções para compartilhas pastas adicionais.
1. Para que serve o parâmetro path?
2. Todo servidor Samba deve ter uma seção chamada [programas]?
Descrição dos parâmetros do arquivo smb.conf
Segue uma explicação dos principais parâmetros do arquivo smb.conf. Observe que enquanto alguns desses parâmetros são exclusivos da seção [global], outros podem aparecer em qualquer seção.
workgroup: nome do domínio ou grupo de trabalho do qual a máquina fará parte. O nome do grupo aparece na tela de login, na opção "fazer logon em:". Você sempre precisa alterar esse parâmetro para o valor usado na sua rede.
netbiosname: nome da máquina. Utilizado quando o Samba não consegue resolver o nome do servidor pelo DNS.
serverstring: comentário sobre o servidor.
keepalive: opção utilizada para verificar se algum cliente travou. A sua representação é em segundos, e o padrão é 5 minutos (300s). O valor 0 indica a não verificação de clientes. Sugerimos o valor 30 para redes com poucas máquinas.
deadtime: opção que fecha todas as seções de clientes inativos. Um cliente é considerado inativo quando não está enviando nem recebendo dados. Por padrão o valor é definido como 0, o qual diz que nunca será fechado.
logon script: determina o script que será usado após o usuário efetuar logon. A opção %U diz que o script possui o nome do usuário, ou seja, cada usuário teria um script.
logon path: indica o diretório que contém os scripts de logon. Especificar um "logon path" sem caminho evita armazenar dados do usuário no servidor, além de não gerar mensagem de erro.
logon drive: força o mapeamento do diretório home do usuário como unidade j: na máquina cliente. A letra da unidade poderá ser trocada por qualquer outra que esteja disponível na máquina cliente. Sugerimos a escolha de letras distante das utilizadas, pois isso garantirá o sucesso do mapeamento.
domain logon: local onde se permite o logon do Samba. Marque como Yes quando a máquina for servidor de autenticação.
oslevel: valor usado para especificar qual servidor vencerá a eleição, caso haja uma, para manter a lista das máquinas na rede. Como o valor padrão das máquinas Windows é 32, indicamos usar o valor 100 para garantir que esta máquina vencerá a eleição.
prefered master: usado para permitir efetuar eleição para o domain master. Marque como Yes quando a máquina for ser servidor de autenticação.
domain master: define o servidor master do domínio. Marque como Yes quando a máquina for servidor de autenticação.
security: controla como será o controle de acesso às pastas compartilhadas. Os dois principais modos são user e share. O primeiro é usado quando a máquina Samba for atuar como servidor de autenticação, e o segundo quando se desejar apenas compartilhar pastas da máquina com outras pessoas.
passwd program: caminho onde se localiza o binário responsável pela troca de senha. O padrão é /usr/bin/passwd %u, onde %u representa o nome do usuário.
passwd chat: usado em troca de senha a partir da estação cliente Windows.
comment: utilizado para comentário.
path: caminho da pasta sendo compartilhada. No caso da seção [netlogon], define o local onde os arquivos de scripts são procurados.
guest ok: permissão de acesso de visitantes. Melhor usar No.
browseable: permissão de deixar a pasta compartilhada visível no ambiente de rede. Para a seção [homes] é melhor usar No. Para as demais pastas que você compartilhe, criando outras seções no arquivo, normalmente pode deixar Yes.
writable:permissão para escrita na pasta. Depende de cada pasta. Normalmente Yes.
read only:significa que não se pode gravar nessa pasta. Normalmente No.
create mask: define as permissões (bits rwx) dos arquivos criados. Sugestão: 0700 (equivale a rwxr-xr-x).
directory mask: define as permissões (bits rwx) das pastas criadas. Sugestão: 0700.
1. É necessário utilizar todos os parâmetros estudados até aqui na configuração do arquivo do Samba?
2. Existe um número obrigatório de parâmetros a serem usados na configuração do Samba?
Administração do Samba
Nesta seção vamos ver como administrar o servidor Samba. Para explicar os comandos, vamos mostrar exemplos utilizando nomes de usuários. Naturalmente, basta que você os substitua pelos nomes que desejar quando for instalar seu próprio servidor.
Criando usuários
1. criar o usuário pedro, digite o comando a seguir.
useradd pedro
2. Para inserir uma senha para pedro,digite o comando a seguir.
3. Para excluir o usuário pedro,digite o comando a seguir.
smbpasswd -a pedro
smbpasswd –x pedro
Criando uma conta de máquina
Para que uma máquina Windows possa fazer parte da rede com Samba (entrar no domínio, como é chamado), é necessário que exista um cadastro para a máquina no Samba. Esse cadastro é referido como uma “conta de máquina”, e para uma máquina chamada “Maquina-A”, ele é feito digitando-se os comandos a seguir.
useradd –d /dev/null –s /bin/false Maquina-A$
Smbpasswd –a –m Maquina-A
A primeira linha cria a conta de máquina. Veja que nessa linha o nome da máquina é informado acrescentado de um “$”. Na linha seguinte, que cadastra uma senha para a máquina, o nome da máquina é informado normalmente (sem o “$”).
Além da conta de máquina é necessário criar um usuário administrador que será utilizado na hora de inserir a máquinas no domínio. Para criar esse usuário com o nome root utilize o comando a seguir.
useradd –a root
Será pedida uma senha que você deve memorizar, pois é esse usuário e esta senha que você irá informar quando for colocar uma máquina Windows na rede Samba, ou seja, quando for inserir a máquina no domínio.
Configuração das máquinas clientes Windows
Agora que os usuários já estão criados e já existe uma conta para a máquina que pretende acessar o servidor Samba, basta inserir a máquina no domínio.
Incluindo uma máquina Windows no Samba
Agora se deve acessar como administrador a máquina cliente Windows que se pretende inserir no domínio. Portanto, faça o login no Windows como usuário “Administrador” e depois clique com o Botão direito em Meu Computador. Depois clique em Propriedades. Ou então clique em Iniciar -> Configurações -> Painel de Controle ->Sistema. Agora vá em Propriedades do Sistema, conforme mostrado na Figura 8, e clique em Alterar.
Figura 8 - Configurando uma máquina Windows para entrar no domínio
Irá aparecer a tela mostrada na Figura 9. Em Domínio, digite o domínio definido no parâmetro workgroup do arquivo smb.conf. No exemplo que utilizamos nesta aula esse valor foi Metropole. Após clicar no botão Ok,entre com o usuário e a senha que você criou para inserir as máquinas no domínio, conforme explicado na seção “Criando uma conta de máquina”. O usuário que utilizamos como exemplo naquela seção foi root.
Figura 9 - Informando a senha para inserir a máquina Windows no domínio
Se tudo der certo, irá aparecer a tela mostrada na Figura 10, indicando que a máquina entrou no domínio. Caso a máquina não consiga fazer isso, execute o comando mostrado a seguir e tente inserir a máquina novamente no domínio, refazendo as tarefas mostradas nas Figuras 8 e 9.
echo “/bin/false” >> /etc/shells
Figura 10 - Confirmação de que a máquina entrou no domínio
Uma vez que a máquina cliente Windows tenha conseguido entrar no domínio, na sua tela de logon aparecerá o nome do novo domínio. Basta selecioná-lo e informar o nome do usuário e a senha criados no servidor Samba. Seguindo o nosso exemplo, poderia ser utilizado o usuário pedro.
Figura 11 - Novo domínio na tela de logon da máquina cliente Windows
Finalizamos esta aula enfatizando a necessidade de praticar os assuntos abordados, bem como a leitura dos sites sugeridos para conhecer mais detalhes sobre o Samba. A partir dos links, você terá contato com os possíveis problemas que acontecem na prática, bem como começar a interagir nos fóruns de discussão, fazendo perguntas e deixando comentários sobre seus avanços – esta é a melhor forma de aprender.
Leituras Complementares
Para que você possa se aprofundar um pouco mais e conhecer detalhes não abordados aqui, recomendamos acessar os links a seguir para enriquecer o aprendizado:
•
•
•
•
•
Resumo
Nesta aula você aprendeu como integrar máquinas Windows e Linux em uma rede. Você viu como é possível usar um servidor Linux para substituir um servidor Windows, de modo que ele autentique os usuários das máquinas Windows e forneça o acesso às pastas dos usuários. Aprendeu que o responsável por tornar isso possível é o protocolo Samba, que é uma implementação Linux dos protocolos usados pela Microsoft para esta finalidade. Você aprendeu também que, além de criar as contas para os usuários que irão se conectar às máquinas clientes, também é necessário criar no servidor Samba uma conta de máquina para cada uma das máquinas cliente Windows.
Acesse o Laboratório1 desta aula (Aula 11) no Virtualbox e realize os procedimentos descritos a seguir.
• Crie uma seção no arquivo smb.conf que compartilhe a pasta de cada usuário para que ele possa acessá-la.
• Crie uma seção no arquivo smb.conf que faça com que o arquivo “comando.bat”, que está na pasta /usr/local/exe, seja executado após cada usuário se autenticar no servidor Samba.
• Crie uma seção no arquivo smb.conf que compartilhe a pasta /opt/fotos com o nome “Fotos” e permita que todos os usuários possam escrever nesta pasta.
Redes de Computadores
Aula 15 – Gerenciamento de redes – SNMP, RMON e CACTI
Nesta aula você vai aprender conceitos sobre os protocolos SNMP e RMON a fim de aplicá-los na prática junto a uma ferramenta muito importante na gerência de nossa rede, o CACTI.
O funcionamento do CACTI baseia-se na tradução dos dados coletados pelo protocolo SNMP e na utilização de scripts para o modo gráfico, de modo a tornar mais fácil a análise dos dados coletados.
Desse modo, podemos saber o que realmente se passa na rede em tempo real. Para podermos entender o funcionamento da ferramenta é interessante entendermos o que na verdade é o CACTI, conceitos de SNMP, RMON e como chegamos até ele.
Ao final desta aula você será capaz de:
• Entender os conceitos e funcionamento do protocolo SNMP.
• Instalar e configurar um cliente SNMP em ambiente Linux.
• Entender o padrão RMON de gerenciamento de redes.
• Entender o funcionamento do CACTI.
• Instalar e configurar o CACTI.
• Criar/analisar gráficos para visualização em tempo real dos equipamentos monitorados pelo CACTI.
Gerência de redes
Estamos na última aula desta disciplina e você já estudou uma série de protocolos e serviços que são utilizados nas redes de computadores. Portanto, você já sabe que quando for instalar uma rede na prática, vai ter que instalar e configurar vários desses protocolos e programas.
Mas será que após a fase de instalação e configuração o trabalho termina? De modo algum! Depois que a rede está em funcionamento, podem acontecer diversos problemas, como, por exemplo:
• Equipamentos que deixam de funcionar completamente. Switchs, roteadores ou mesmo computadores podem apresentar problemas de hardware e pararem de funcionar.
• Equipamentos que apresentam erros esporádicos. Os problemas de hardware descritos no item anterior podem se apresentar apenas de tempos em tempos, dificultando ainda mais a sua detecção. Pense, por exemplo, em uma placa de rede que de vez em quando apresenta problemas, fazendo com que os quadros sejam perdidos.
• Programas que param de funcionar. Os programas podem parar de funcionar ou passarem a executar de modo muito lento devido a bugs ou a ataques.
• Tráfego elevado que deixa a rede lenta. É muito comum os usuários de uma rede reclamarem que ela está lenta. Isso pode acontecer por várias razões, incluindo: i) máquinas foram infectadas com vírus e estão gerando tráfego adicional; ii) os usuários estão utilizando aplicações que geram muito tráfego, mas que não fazem parte dos negócios da empresa, como Peer-to-Peer (P2P), por exemplo; iii) a própria rede da empresa cresceu e os links precisam ser redimensionados (ter suas velocidades aumentadas).
• O link de Internet, ou entre matriz e filiais, deixa de funcionar. Muitas dessas conexões atualmente são por links de rádio, que deixam de funcionar quando as antenas sofrem alguma mudança na sua posição (devido ao vento, por exemplo). Outras vezes esses links são fornecidos por outras empresas (por exemplo, Oi e Embratel) e, portanto, manter esses links funcionando é de responsabilidade delas.
Diante de tantos possíveis problemas que podem ocorrer, você não deve esperar que as pessoas reclamem que algo não está funcionando bem para que só então você tome conhecimento desse fato e faça algo para corrigir o problema.
Você deve se antecipar às reclamações e tentar resolver o problema o mais rápido possível, de preferência antes mesmo que as pessoas tomem conhecimento dele.
Suponha, por exemplo, que um switch parou de funcionar. Caso você detecte esse problema logo depois que ele ocorra, você pode trocar o switch com defeito por outro. Naturalmente, as pessoas que estavam usando a parte da rede afetada por esse switch vão notar o problema. Entretanto, a rede vai voltar a funcionar muito mais rapidamente do que se você tivesse que esperar alguém reclamar do problema para que você fizesse a troca. Além disso, muitas pessoas poderiam não estar usando a rede naquele momento, e essas pessoas nem mesmo iriam notar que o problema aconteceu.
Situação semelhante se aplica ao caso de um link que conecta uma matriz e uma filial, ou conecta a empresa a Internet. Você pode monitorar a utilização desse link constantemente.
Quando notar que ele está frequentemente sendo usado na sua capacidade máxima, você pode tomar algumas medidas, como, por exemplo, solicitar que a capacidade do link seja aumentada, ou identificar e controlar quais aplicações estão gerando o tráfego em excesso.
Independentemente dos problemas que podem ocorrer, dificilmente uma rede vai permanecer sempre do mesmo modo que foi instalada. Normalmente a rede da empresa cresce de tamanho, ou então precisa ser reconfigurada para atender mudanças na própria empresa.
Nesses casos, você não vai querer ir fisicamente até o local onde está cada equipamento que você precisa reconfigurar para poder fazer essa tarefa. Até porque estes equipamentos podem estar em outro prédio na mesma cidade, ou mesmo em uma cidade diferente! Com certeza você vai preferir reconfigurar os equipamentos sem sair da sala onde você trabalha, utilizando, para isso, a própria rede da empresa.
Veja que identificamos dois tipos de tarefa que precisam ser realizadas para manter as redes em bom funcionamento, que são Monitoramento e Configuração. Essas duas tarefas juntas recebem o nome de Gerenciamento de redes. Nesta aula você verá que a forma mais comum de fazer gerenciamento de redes é utilizar um protocolo que realize a comunicação com os equipamentos que precisam ser monitorados e/ou configurados. Como você vai começar a estudar na próxima seção, esse protocolo é o SNMP.
1. Quais os principais problemas que podem existir em um ambiente de rede?
2. Imagine que você seja um gerente de redes de uma empresa. Escolha algum problema citado acima e cite alguma atitude que tomaria quando o enfrentasse.
3. Quais as duas principais tarefas que precisam ser realizadas para que uma rede funcione corretamente?
O Protocolo SNMP
O protocolo SNMP (Simple Network Management Protocol - Protocolo Simples de Gerência de Rede) é um protocolo utilizado para gerência de redes e envia suas mensagens dentro de pacotes UDP. Usar um protocolo padronizado facilita o intercâmbio de informação entre os dispositivos de rede, como servidores e switches. Desse modo, o SNMP possibilita aos administradores de rede gerenciar o desempenho da rede e encontrar seus eventuais problemas. Os dados são obtidos através de requisições de um gerente a um ou mais agentes utilizando os serviços do protocolo de transporte para enviar e receber suas mensagens. Portanto, o SNMP define uma forma padronizada de se solicitar informações aos equipamentos. Atualmente, praticamente todos os equipamentos de rede que suportam gerenciamento entendem o protocolo SNMP. O gerenciamento da rede através do SNMP permite o acompanhamento simples e fácil do estado, em tempo real, da rede, podendo ser utilizado para gerenciar diferentes tipos de sistemas.
Idealmente todos os equipamentos de rede deveriam suportar gerenciamento. Entretanto, para reduzir os custos, existem modelos de equipamentos que não o fazem. Isso acontece, por exemplo, com vários modelos de switchs. Na sua rede, procure usar sempre equipamentos gerenciáveis.
Acabamos de dizer que o SNMP define uma forma padronizada de solicitarmos informações aos equipamentos. Mas, quais informações podemos solicitar? Será que o SNMP define exatamente quais são essas informações? Se o SNMP tivesse fixado o conjunto de valores que poderiam ser solicitados, ele ficaria muito limitado, e não suportaria, por exemplo, novos tipos de equipamentos que surgiram depois que ele foi criado.
Portanto, a solução foi separar o protocolo que faz as solicitações das informações que ele solicita. O conjunto de informações que o SNMP pode solicitar é chamado de MIB (Management Information Base – Base de Informações de Gerenciamento). Parece confuso, mas significa que o SNMP é apenas capaz de solicitar uma informação, mas não precisa saber o que aquela pergunta significa. Quem tem que saber é o equipamento que recebe a solicitação. Esse modelo permite que novas MIBs sejam adicionadas sem que o SNMP sofra nenhuma alteração.
O SNMP possui um conjunto limitado de comandos que são baseados no mecanismo de busca/alteração, permitindo as operações de alteração de um valor de um objeto, de obtenção dos valores de um objeto e algumas variações dessas operações.
A utilização de um número limitado de operações baseadas em tais mecanismos o torna um protocolo de fácil implementação, simples, estável e flexível. Como conseqüência, reduz o tráfego de mensagens de gerenciamento através da rede e permite a introdução de novas características. A simplicidade do SNMP facilitou sua inclusão em equipamentos de interconexão. No final da década de 1990, a solução SNMP já era tão difundida que se estabelecera como padrão de gerência de redes de computadores. Hoje, praticamente todos os equipamentos de interconexão dão suporte ao SNMP, bem como muitos outros dispositivos (nobreaks, modems etc.), e sistemas de software (servidores Web, sistemas de bancos de dados etc.).
1. Qual a principal função do protocolo SNMP?
2. Cite um exemplo de algum equipamento de rede que dê suporte ao protocolo.
3. Qual é o protocolo de transporte utilizado para transmitir mensagens SNMP?
4. O que é uma MIB?
Como o protocolo funciona?
O funcionamento do SNMP é baseado em dois tipos de dispositivos, o agente e o gerente. Cada máquina gerenciada é vista como um conjunto de variáveis que representam informações referentes ao seu estado atual. Estas informações ficam disponíveis ao gerente através de consulta e podem ser alteradas por ele. Cada máquina gerenciada pelo SNMP deve possuir um agente e uma base de informações, a MIB, que define as variáveis de gerência que todo elemento gerenciado deve ter, independentemente de sua função particular. Como alguns exemplos de variáveis que podem existir nas MIBS, podemos citar número de conexões TCP estabelecidas no momento, número de pacotes UDP transmitidos, número de quadros recebidos com erro, velocidade de uma porta de switch, modelo do equipamento etc.
O mundo da gerência SNMP criou várias dezenas de módulos MIBs desde o início da década de 90. Alguns são padronizados, enquanto outros são ditos patenteados.
Um módulo MIB patenteado é elaborado pelo fabricante de um elemento gerenciado particular para armazenar variáveis de gerência consideradas importantes, mas que não fazem parte dos padrões descritos pelo protocolo.
Figura 1 - Exemplo de rede sendo gerenciada por um servidor SNMP
Como podemos ver na Figura 1, a arquitetura do SNMP é composta basicamente de:
• Agente SNMP: É um processo executado na máquina gerenciada, responsável pela manutenção das informações de gerência da máquina. As funções principais de um agente são de atender as requisições enviadas pelo gerente e enviar automaticamente informações de gerenciamento ao gerente, quando previamente programado. Um agente pode estar instalado em um switch, um roteador, uma impressora, um computador, entre outros.
• Gerente SNMP: É um programa executado em uma estação servidora que permite a obtenção e o envio de informações de gerenciamento junto aos dispositivos gerenciados mediante a comunicação com um ou mais agentes. O gerente fica responsável pelo monitoramento, relatórios e decisões na ocorrência de problemas, enquanto que o agente fica responsável pelas funções de envio e alteração das informações e também pela notificação da ocorrência de eventos específicos ao gerente.
A comunicação entre o agente e o gerente pode acontecer de duas formas. Na primeira forma o gerente solicita informações aos agentes quando desejar. Isso pode ser feito por uma pessoa usando o software de gerência, que em determinado momento resolve solicitar alguma informação de um equipamento específico.
Uma variação desta forma é o gerente deixar agendado que periodicamente sejam enviadas requisições aos agentes solicitando informações. Desse modo, sempre que os dados são recebidos eles são analisados automaticamente e alguma ação é gerada. Essa ação pode ser, por exemplo, apenas a geração de relatórios ou o envio de alarmes quando determinadas situações são detectadas.
A outra forma de comunicação entre o gerente e os agentes, que é conhecida como Traps, consiste em configurar os agentes para enviarem informações ao gerente sempre que uma determinada situação ocorrer.
Normalmente estas situações estão relacionadas à ocorrência de problemas, como, por exemplo, a recepção de um elevado número de quadros com erro. Em redes reais o mais comum é utilizar a primeira forma de comunicação, com o agendamento de solicitações periódicas no gerente. Mas a utilização em conjunto das duas formas também é empregada, configurando-se adicionalmente alguns equipamentos para utilizarem Traps em determinadas situações.
MIB-II
Uma das MIBs mais utilizadas é a MIB-II. Os objetos (variáveis) desta MIB são divididos nos grupos mostrados a Tabela 1.
Nome do grupo Contém informações sobre
System Informações básicas sobre o sistema
Interfaces Interfaces de rede
at Tradução de endereços
Ip Protocolo IP
Icmp Protocolo ICMP
Tcp Protocolo TCP
Udp Protocolo UDP
Egp Protocolo EGP
Transmission Meios de transmissão
snmp Protocolo SNMP
Tabela 1 - Grupos da MIB-II
Cada um desses grupos contém uma série de objetos. Na Tabela 2 podemos ver exemplos de objetos de alguns grupos da MIB-II.
Grupo System
sysDescr Descrição do equipamento. Pode incluir fabricante e modelo.
sysUpTime Tempo desde a última reinicialização.
sysContact Nome de uma pessoa de contato responsável pelo equipamento.
Grupo Interfaces
ifNumber Número de interfaces de rede existentes na máquina.
ifOperStatus Estado atual da interface (ativada ou desativada).
ifInOctets Número de bytes recebidos pela interface.
Grupo IP
ipForwarding Se o roteamento está ativo (se atuando como roteador).
ipInHdrErrors Número de pacotes recebidos e descartados devido a erros.
Grupo TCP
tcpCurrentEstab Número de conexões TCP estabelecidas no momento.
Tabela 2 - Exemplos de objetos da MIB-II
Cada objeto de uma MIB, seja a MIB-II ou qualquer outra, é identificado por um identificador numérico. O objetoipForwarding, por exemplo, é identificado por 1.3.6.1.2.1.4.1, enquanto ipInHdrErrors é identificado por 1.3.6.1.2.1.4.4. Se você prestar bem atenção nesses números verá que eles têm um prefixo em comum (1.3.6.1.2.1.4), diferido um do outro apenas pelo último número. Isso acontece porque eles pertencem ao mesmo grupo, e esse prefixo comum é exatamente o prefixo do grupo. Do mesmo modo, grupos diferentes também possuem um prefixo em comum (de tamanho menor) para identificar alguma relação entre os grupos.
1. Explique como o protocolo funciona, mencionando a função do gerente e do cliente em uma rede, assim como os dois se relacionam.
2. Discorra como funciona a forma de comunicação viaTraps.
3. Como vimos acima, o grupo system da MIB-II contém informações básicas sobre o sistema. Cite algum objeto que pertença a esse grupo, assim como sua função.
4. Qual objeto da MIB-II indica se um determinado cliente é um roteador?
As mensagens do protocolo SNMP
O SNMP possui mensagens para solicitar o valor dos objetos e para definir seus valores. Existem basicamente quatro tipos de mensagens, que são: GET, GET-NEXT, SET e TRAP.
A primeira é utilizada tanto para solicitar o valor de um (ou mais) objeto(s) quando para informar o valor. Ou seja, é tanto uma mensagem de requisição quanto de resposta. Ela sempre contém dois campos para cada objeto: um é o seu nome e o outro o valor. Nas requisições, o campo valor é deixado em branco. GET-NEXT tem a mesma finalidade de GET, mas é utilizada para ler estruturas como tabelas. SET define o valor de um objeto.
Todas essas três são enviadas pelo gerente para o agente. A mensagem TRAP é enviada pelo agente para o gerente para informar o valor de um objeto, sem que o mesmo tenha sido solicitado. Evidentemente os nomes de objetos utilizados nessas mensagens devem estar definidos em alguma MIB sendo utilizada pelos equipamentos.
Uma mensagem SNMP possui três partes principais:
• Version: Contém a versão do SNMP. Tanto o gerente como o agente devem utilizar a mesma versão. Mensagens contendo versões diferentes são descartadas.
• Community: Identifica a comunidade, que é uma string (texto) que funciona como uma forma de controle de acesso. É possível definir quais variáveis de uma MIB podem ser acessadas por cada nome de comunidade, além do tipo de acesso permitido (leitura ou escrita).
• SNMP PDU: Trata-se realmente o corpo da mensagem, e irá conter os objetos sendo solicitados (nas solicitações) e seus valores (nas respostas). Em uma mesma mensagem podem ser solicitados vários objetos.
A Figura 2 mostra uma requisição feita pela estação gerente a um agente. Observe que foi solicitado o objetoifNumber (número de interfaces na máquina) e ele que faz parte da MIB instalada no agente.
Na verdade a MIB tem que estar instalada tanto no agente quanto no gerente, senão o gerente não ia saber como perguntar. Veja também que o agente responde informando que a máquina agente tem duas interfaces.
Figura 2 - Requisição e resposta SNMP
1. Quais os 4 tipos básicos de mensagens do SNMP? Escolha uma e defina.
2. Para que serve o campo COMMUNITY em uma mensagem SNMP?
3. Como é possível saber se uma mensagem GET é uma requisição ou uma resposta?
Existem as versões 1, 2 e 3 do SNMP. Nas versões 2 e 3 foram adicionados principalmente mecanismos para melhorar o desempenho e a segurança.
Instalando e configurando o SNMP em servidores Linux
Agora que já entendemos como o protocolo funciona, vamos instalá-lo em nossa máquina. Para isso, vamos instalar um pacote chamado “snmpd”, que é um programa que implementa um agente SNMP. Naturalmente ele irá executar em background.
apt-get install snmpd
Após a instalação, é necessário alterar algumas configurações no arquivo snmpd.conf. Para isso, abra o arquivo em um editor de textos com o comando a seguir.
gedit /etc/snmp/snmpd.conf
Na sessão “Acess Control” comente a linha "com2sec paranoid default public" e descomente a "com2sec readonly default public". Não se esqueça de mudar o nome do “source”, ou seja, o IP de nosso gerente (estação de gerência) e o nome da comunidade SNMP, que é uma espécie de “senha” para outras pessoas não terem acesso aos dados livremente.
#com2sec paranoid default public
com2sec readonly ip_maq_gerencia sua_comunidade_snmp
#com2sec readwrite default private
Note que demos a permissão somente de leitura, através do parâmetro “readonly”; caso seu gerente SNMP necessite realizar alguma escrita, descomente a linha mais abaixo que contém “readwrite”.
Após isso, reinicie o snmpd através do comando:
/etc/init.d/snmpd restart
E, finalmente, para testarmos se está tudo ok, basta digitarmos no console o comando a seguir. Ele mostra todos os objetos do grupo system da MIB-II.
snmpwalk -Os -c sua_comunidade -v 1 ip_maq_gerencia system
Caso positivo, deverão ser retornadas várias informações da MIB na tela.
1. Pesquise por algum programa que tenha uma interface gráfica e permita ver a MIB. Normalmente esses programas são chamados MIB Browsers. Instale o programa e tente acessar o seu agente.
2. Qual(is) monitoramento(s) você conseguiu fazer de seu sistema?
3. Se mudarmos a comunidade de cliente para “public”, você acha que o servidor ainda conseguirá monitorá-lo (levando em conta que você usou as configurações descritas acima)?
O protocolo de gerenciamento RMON
Agora que já conhecemos o protocolo SNMP e vimos que ele é bastante útil no monitoramento de nossos equipamentos da rede, iremos ver um protocolo baseado no SNMP, ou seja, que também irá nos auxiliar no gerenciamento, chamado RMON. Ele é um padrão IETF (Internet Engineering Task Force) de gerenciamento de redes cuja sigla representa Remote Network Monitoring MIB. Basicamente ele é uma MIB padrão do protocolo SNMP. Este padrão para monitoramento remoto oferece uma arquitetura de gerenciamento distribuída para análise de tráfego, resolução de problemas, demonstração de tendências e gerenciamento proativo de redes de modo geral.
Dentre os protocolos de gerenciamento, o RMON é um dos primeiros a permitir o gerenciamento proativo (ele pode fazer a previsão de acontecimentos), sendo então esta a grande vantagem dele em relação às outras arquiteturas de gerenciamento. Sendo assim, o trabalho de gerenciamento é simplificado e os problemas são resolvidos de forma facilitada.
Assim, aumenta a disponibilidade da rede e caem os custos de manutenção de forma significativa; além disso, o RMON provê uma interoperabilidade independente do fabricante, características muito importantes a serem analisadas nos dias atuais em um ambiente de gerência.
Entendendo o funcionamento do RMON
O padrão RMON foi desenvolvido no intuito de resolver questões que outros protocolos de gerenciamento não eram capazes. Com base nestas questões, a RFC 1757 define objetivos gerenciais que o padrão RMON deve observar:
• Operação Offline - Existem situações em que uma estação de gerenciamento não estará em contato contínuo com seus dispositivos de gerenciamento remoto. Esta situação pode ocorrer como consequência de projeto, a fim de que se reduzam os custos de comunicação, ou por falha da rede, quando a comunicação entre a estação de gerenciamento e o monitor fica comprometida em sua qualidade.
• Monitoramento Proativo - Dados os recursos disponíveis no monitor, é normalmente desejável que ele execute rotinas de diagnóstico de forma contínua e que acumule os dados de desempenho da rede. O monitor estará sempre disponível no início de uma falha; assim, ele poderá notificar a estação de gerenciamento da falha.
• Detecção e Notificação de Problemas - O monitor pode ser configurado para reconhecer condições de erro e verificá-las continuamente. No advento de uma destas condições, o evento pode ser registrado e as estações de gerenciamento notificadas.
• Valor Agregado aos Dados - Considerando o fato de que os dispositivos de gerenciamento remoto representam recursos dedicados exclusivamente a funções de gerenciamento e considerando também que eles se localizam diretamente nas porções monitoradas da rede, pode-se dizer que estes dispositivos permitem a agregação de valor aos dados coletados. Por exemplo, indicando quais os hostsque geram a maior quantidade de tráfego ou erros, um dispositivo pode oferecer (à estação de gerenciamento) informações preciosas para a resolução de toda uma classe de problemas.
• Gerenciamento Múltiplo - Uma organização pode ter mais de uma estação de gerenciamento para as várias unidades da empresa, de acordo com a finalidade de cada uma delas.
1. É correto afirmar que o RMON é uma MIB padrão do protocolo SNMP?
2. Cite qual a principal vantagem de gerenciamento que o RMON introduziu, explicando como ela funciona.
3. Quais objetivos gerenciais o padrão RMON deve observar? Escolha um e fale sobre ele.
Como vimos anteriormente, o RMON foi baseado no SNMP; sendo assim, ele fez diversas melhorias em cima desse protocolo de gerenciamento. Dentre as principais, podemos destacar:
• Controle de Monitoramento Remoto: Com o objetivo de efetivamente gerenciar um monitor remoto, a RMON MIB contém características que possibilitam o controle efetivo da estação de gerenciamento. Estas características podem ser agrupadas em duas categorias:
o Configuração: baseada em tabelas de controle e tabelas de dados.
o Invocação de uma ação: um objeto é utilizado para representar um comando, e uma invocação de uma ação pode ser solicitada modificando o valor dele.
• Múltiplos Gerentes: Na arquitetura RMON, agentes podem estar sujeitos ao gerenciamento de muitas estações gerentes. No caso de um agente RMON ser compartilhado, alguns problemas podem surgir. São eles:
o Requisições concorrentes;
o Captura de um recurso por um determinado gerente por um longo período de tempo;
o Recursos podem ser atribuídos para um gerente que ficou offline antes de liberar o recurso.
Para tentar solucionar tais problemas, uma combinação de requisitos deve ser utilizada. Os requisitos são:
o Inclusão de um campo de dono para cada linha da tabela de controle;
o Reconhecimento da não necessidade de utilização de um recurso;
o Possibilidade de negociação de um recurso entre gerentes;
o A possibilidade de um operador cancelar reservas de recursos;
o Durante uma reinicialização, um gerente poder liberar recursos.
• Gerenciamento de Tabelas: Atividade que não era muito clara no padrão SNMP original, inclui convenções textuais e regras mais claras e disciplinadas para a adição e remoção de linhas.
1. Cite quais problemas podem existir em um ambiente de monitoramento quando são usados múltiplos gerentes.
2. Uma MIB RMON contém características que possibilitam o controle efetivo da estação de gerenciamento?
Cobertura das versões do RMON
Existem duas versões do RMON: RMON1 e RMON2. O RMON1 define 10 grupos de MIBs para um monitoramento básico da rede, o qual pode ser encontrado na maioria de nossos hardwares de rede.
Já o RMON2 é uma extensão do RMON1 que foca em camadas de rede mais altas, como podemos ver na Figura 3. Sendo assim, ele tem ênfase nas camadas de rede até a de nível de aplicação, cujo principal objetivo é permitir a gerência de aplicações para monitorar pacotes por todas as camadas de rede. Esta é a principal diferença para o RMON1, visto que este somente monitora os pacotes em nível de Enlace e Físico.
Figura 3 - Monitoramento das versões RMON no modelo OSI
1. Qual a principal diferença entre o RMON1 e o RMON2?
2. Faça uma pesquisa sobre quais tipos de monitoramento são possíveis com cada versão do RMON, fazendo relação com a camada que cada um analisa.
Entendendo o funcionamento do CACTI
Vamos agora estudar um software, chamado CACTI, que utiliza o SNMP para coletar informações, mas possui como grande benefício o fato de processar essas informações de modo a mostrá-las de uma forma muito mais amigável e útil para o administrador da rede.
O CACTI usa um frontend chamado RRDtool, que é um programa desenvolvido usando a linguagem de programação "C" para guardar os dados coletados em arquivos no formato ".rrd".
O número de registros em um arquivo “.rrd” nunca aumenta, significando que antigos registros são frequentemente removidos. Isto implica na obtenção de figuras precisas para dados recentemente registrados, onde as figuras baseadas em dados muito antigos possuem valores aproximados.
Por padrão, você pode obter gráficos diários, semanais, mensais e anuais. Seguem abaixo algumas figuras dos gráficos que podem ser gerados com a ferramenta.
Figura 4 - Gráfico do tráfego diário
A Figura 4 mostra um exemplo de saída do CACTI, onde é mostrado o consumo de banda do link Internet. Isso possibilita vermos se o link está sobrecarregado e em que horários do dia isso acontece.
A Figura 5 mostra uma visão detalhada do funcionamento do servidor de e-mail, indicando a quantidade de mensagens enviadas, recebidas e descartadas. Além disso, também é mostrado o total de spams e vírus recebidos.
Figura 5 - Gráfico com estatísticas de e-mails
1. Qual protocolo que o CACTI utiliza para monitoramento da rede?
2. Entre no site do projeto CACTI (www.cacti.net/screenshots.php) e veja mais exemplos de gráficos que podem ser gerados com a ferramenta.
Instalação do CACTI
A instalação do CACTI em servidores com distribuições Linux baseadas no Debian, como é o caso do Ubuntu, é bem simples. Para instalar o pacote, digite o comando a seguir.
apt-get install cacti
Você verá que existem dependências que serão automaticamente instaladas, como, por exemplo, PHP, MySQL eApache.
Durante a instalação, um assistente solicita algumas informações importantes, como:
• Uma nova senha para o usuário root do MySQL (caso não estiver instalado anteriormente em sua máquina).
• Servidor web deverá ser configurado para o Cacti; escolhemos o apache2.
• Em seguida o assistente pergunta se deve utilizar o utilitário dbconfig-common para configurar o banco de dados do cacti; informamos que sim.
• Uma senha e a sua confirmação para banco de dados do cacti.
• A senha do usuário administrativo (root) do MySQL com a qual será criada a base de dados para o cacti; esta é a mesma senha do usuário root criada durante a configuração do MySQL.
Depois de terminada a instalação e configuração dos pacotes, vamos à configuração do sistema Cacti, que é bem simples.
Primeiramente acessamos o endereço https://localhost/cacti em nosso navegador web e terminamos a instalação do cacti clicando em “Next”, “Next” e “Finish”.
Depois de terminada a instalação, já teremos a tela de login, então informamos o usuário como sendo “admin” com senha “admin” (padrão).
Depois disso é solicitada a criação da nova senha do nosso usuário administrativo.
Configurando o CACTI
Para começarmos a monitorar com o cacti devemos criar um “device” através do menu “Console” -> “Create devices for network”. Na tela de “devices” clicamos em “add” no canto superior direito. Para criar um device precisamos preencher o campo “Descripton” (uma descrição para o device), “Hostname” (o nome completo de domínio do deviceou o endereço IP do mesmo caso não tenhamos um DNS configurado para resolver o nome do device) e “Host Template”, no nosso caso ”Generic SNMP-enabled Host”. Na parte de SNMP Options, modificaremos essencialmente a versão do nosso protocolo e o nome da SNMP Community, de acordo com a suportada pelo device que estamos adicionando.
Ao clicarmos em “create”, o device é criado e já podemos observar se a comunicação com o device via SNMP foi estabelecida com sucesso através da seção “SNMP Information” no topo da tela.
Nesta mesma tela de configuração do device adicionamos os templates dos gráficos que precisamos.
Na seção “Associated Graph Templates” adicionamos os gráficos “ucd/net - CPU Usage”, “ucd/net - Load Average” e “ucd/net - Memory Usage”. O template do gráfico para coleta das estatísticas da interface é feito na seção “Associated Data Queries” e já é configurado por padrão.
Para finalizar, criamos os gráficos através do link “Create Graphs for this Host” na mesma tela do device (parte superior) ou pelo menu “Console” -> Create graphs for your new devices”. Na tela de criação dos gráficos selecionamos os gráficos que precisamos e clicamos em “create”. A partir deste momento e dentro de no máximo cinco minutos já podemos acompanhar os gráficos pelo menu “graphs”.
É possível distribuir nossos gráficos em uma árvore para melhor organização dos mesmos. Para isso, devemos ir em “Graph Management” e em seguida selecionar os gráficos para a alteração. Marque os 3 gráficos recém criados e, onde existe “Choose an Action”, escolha “Place on a Tree” e em seguida clique em “GO”; depois escolha em que parte da árvore eles serão inseridos (como nossa árvore está somente com uma raiz, só existe a opção “root”).
Um detalhe importante para o SNMP funcionar é ativar o protocolo SNMP para coleta remota em servidores a serem monitorados, como visto anteriormente nesta aula.
A configuração de outros equipamentos, como por exemplo switchs, é bem semelhante à mostrada anteriormente, sendo necessário apenas mudar o nosso Graph Template para “SNMP – Generic OID Template” e selecionar que interfaces queremos monitorar.
1. Após ter criado o nosso gráfico descrito acima, tente criar outros tipos de gráficos que o programa oferece.
2. Para melhor visualização da configuração do programa, veja este vídeo que mostra uma configuração básica do Cacti:
3. Faça uma pesquisa sobre outro software muito utilizado no monitoramento de redes, o NAGIOS. Veja como ele funciona e faça uma relação de suas funcionalidades com as descritas acima.
Resumo
Nesta aula você aprendeu que toda rede precisa ser monitorada constantemente para identificação de falhas e problemas de desempenho; além disso, reconfigurações também precisam ser realizadas com frequência. Aprendemos também que essas tarefas de monitoramento e configuração formam o que é chamado de gerência de redes. Vimos que a forma mais comum de realizar a gerência de uma rede é através do protocolo SNMP, que utiliza como base para seu monitoramento agentes e gerentes. Aprendemos que as MIBs são de vital importância para o nosso gerenciamento e que precisam estar instaladas nos equipamentos. Finalmente, você aprendeu sobre o CACTI, que é um software muito utilizado como apoio na tarefa de gerência.
1. Quais as mensagens do protocolo SNMP que estudamos nesta aula?
2. O que é uma mensagem Trap?
3. O que é uma comunidade SNMP?
4. Cite quatro grupos e dois objetos de cada grupo para a MIB-II.
5. Qual a reação entre RMON e SNMP?
6. Quais elementos você iria monitorar com o CACTI em um switch?
Redes de Computadores
Aula 8 – Sistema de Nomes de Domínio (DNS)
Nesta aula você aprenderá um serviço que nos auxilia enormemente na designação de endereços para os computadores, permitindo o uso de nomes ao invés de números, o que facilita as suas memorizações.
Você verá que, através do Sistema de Nomes de Domínio (DNS –Domain Name System), é possível distribuir esta tarefa árdua de dar nomes a todos os computadores da Internet no mundo inteiro, de maneira estruturada e bem organizada. Para isso, será preciso você perceber o funcionamento do DNS como um grande sistema distribuído, onde parte do processamento e do armazenamento das informações é distribuído de maneira hierárquica em todos os computadores que fazem parte desse sistema.
• Entender por que um protocolo de resolução de nomes é necessário.
• Conhecer a arquitetura do DNS para entender como as informações dos endereços são organizadas e distribuídas entre os computadores deste sistema.
• Saber como configurar um servidor de DNS no Linux.
• Entender o funcionamento do protocolo observando sua execução entre um cliente e um servidor de DNS.
Por que um sistema de nomes é necessário
Para identificarem uma máquina, os protocolos TCP/IP usam o endereço IP, que identifica unicamente um host conectado à Internet.
Entretanto, as pessoas preferem usar nomes, em vez de endereços numéricos, pois é muito mais fácil memorizar. Assim, seria interessante termos um sistema que pudesse fazer o mapeamento de um nome para um endereço IP, ainda que este sistema pudesse também mapear um endereço IP para um nome, a fim de identificar a qual host determinado endereço IP está relacionado.
Quando a Internet era pequena, o mapeamento era feito usando um arquivo de host. O arquivo de host tinha apenas duas colunas: endereço IP e nome. Todo host podia armazenar o arquivo de host em seu disco e atualizá-lo periodicamente com base em um arquivo de host mestre. Se um programa ou um usuário quisesse fazer o mapeamento de um nome para um endereço, o host consultava o arquivo de host e encontrava o mapeamento.
Por questões de compatibilidade com as aplicações legadas, até hoje existe o arquivo de host em máquinas que possuem a pilha de protocolos TCP/IP instalada. Nos computadores com sistemas operacionais derivados do UNIX, como o Linux, este arquivo é o /etc/hosts. Nele, em cada linha, há um mapeamento endereço IP - nome. Assim, se não houver um sistema de nomes (como o DNS, que iremos estudar nesta aula) rodando na rede, é possível fazer a tradução de nomes para endereços IP através do mapeamento neste arquivo.
Atualmente, entretanto, devido ao tamanho das redes de computadores e a Internet, é praticamente impossível ter um único arquivo de host para relacionar cada endereço IP a um nome, e vice-versa. O arquivo de host seria grande demais para armazenar em cada host. Além disso, seria impossível atualizar todos os arquivos de host sempre que houvesse uma alteração.
Uma solução seria armazenar o arquivo de host inteiro em um único computador e permitir o acesso a essa informação centralizada a cada computador que precisasse do mapeamento. Mas isso geraria um volume de tráfego enorme na Internet, além de uma árdua tarefa de designar nomes únicos para todos os computadores no mundo.
Outra solução, a utilizada atualmente, é dividir esse enorme volume de informações em partes menores e armazenar cada parte em um computador diferente. Nesse método, o host, que precisa de mapeamento, pode entrar em contato com o computador mais próximo que contenha a informação necessária. Esse método é usado pelo Sistema de Nome de Domínio (DNS).
Nomes de Domínio
Para não serem duplicados, os nomes atribuídos aos computadores na Internet devem ser cuidadosamente selecionados, de tal forma que eles devem ser únicos, pois os endereços IP já são. O espaço de nomes definido no DNS que faz o mapeamento de cada endereço para um nome único é organizado de maneira hierárquica.
No espaço de nomes hierárquicos do DNS, cada nome é constituído por várias partes, na forma de uma árvore similar ao de um diretório (ou pasta) no sistema de arquivos do computador.
A primeira parte do nome (diretório) define a natureza da organização ou o país; a segunda pode definir o nome de uma organização ou a sua natureza, caso a primeira parte tenha sido o país; a terceira pode definir departamentos na organização, e assim por diante.
Nessa estrutura hierárquica, a autoridade para atribuir e controlar os espaços de nomes fica descentralizada e dividida entre as organizações. Uma autoridade central pode atribuir a parte do nome que define a natureza e o nome da organização.
A responsabilidade pelo restante do nome pode ser transferida para a própria organização. A organização pode adicionar prefixos no nome para definir seu host ou seus recursos. A gerência de uma organização não precisa se preocupar com o fato de o prefixo escolhido para um host ser adotado por outra, pois, mesmo que parte de um endereço seja igual, o endereço inteiro é diferente.
Na Figura 1, vemos a estrutura do espaço de nomes de domínio usado no DNS. Ela é representada como uma árvore que pode ter no máximo 128 níveis: do nível 0 (raiz) ao nível 127. Na prática, um pequeno número de níveis é utilizado.
Figura 1 – Espaço de nomes de domínio. Fonte: Forouzan (2008).
1. Qual o principal problema que o DNS visa solucionar?
2. Faça uma pesquisa para descobrir que órgão nacional é responsável pelo domínio .BR. Dica de site: .
Cada nó na árvore tem um rótulo, que é uma série com, no máximo, 63 caracteres. O rótulo da raiz é uma série nula (vazia). O DNS exige que os filhos de um nó (nós que ramificam do mesmo nó) tenham rótulos diferentes, o que garante a unicidade dos nomes de domínio.
Cada nó na árvore tem um nome de domínio. Um nome de domínio completo é uma sequência de rótulos separados por pontos (.). Os nomes de domínio são sempre lidos do nó a raiz.
A Figura 2 mostra um exemplo da árvore de domínios para o nome do domínio metropoledigital.ufrn.edu.br.
Figura 2 – Nomes de domínio e rótulos
Um nome de domínio totalmente qualificado (FQDN – Fully Qualified Domain Name) é um nome que contém o nome completo de um host. Ele contém todos os rótulos, do mais específico ao mais geral, que definem exclusivamente o nome do host. Por exemplo, o nome do domínio
www.metropoledigital.ufrn.edu.br
é o FQDN de um computador chamado www, instalado no Metrópole Digital, da Instituição UFRN, que é uma entidade educacional (edu), que fica no Brasil (br).
Um domínio é uma subárvore do espaço de nomes de domínio. O nome do domínio é o mesmo do nó que está no topo da subárvore. A Figura 3 mostra alguns domínios. Note que um domínio pode, ele mesmo, ser dividido em domínios (ou subdomínios, como às vezes são chamados).
Figura 3 - Domínios e subdomínios
Fonte: Forouzan (2008).
1. É possível que um rótulo de domínio tenha 70 caracteres?
2. O que é um nome de domínio totalmente qualificado? Cite um exemplo.
Distribuição do espaço de nomes
As informações contidas no espaço de nomes de domínio devem ser armazenadas em computadores servidores espalhados na Internet, chamados de servidores DNS. Como vimos na Figura 3, o DNS permite que os domínios sejam subdivididos em domínios menores, chamados de subdomínios.
Cada servidor de DNS pode ser responsável (ter autoridade) por um domínio grande ou pequeno.
Um servidor é responsável ou tem autoridade sobre o que é chamado de zona. Podemos definir uma zona como uma parte da árvore de nomes. Se um servidor aceitar a responsabilidade por um domínio e não o dividir em domínios menores, o “domínio” e a “zona” se referem à mesma coisa.
O servidor faz um banco de dados chamado arquivo da zona e mantém todas as informações sobre cada nó sob esse domínio neste arquivo. Entretanto, se um servidor dividir seu domínio em subdomínios e delegar parte da sua autoridade a outros servidores, “domínio” e “zona” referem-se a coisas diferentes.
As informações sobre os nós nos subdomínios são armazenados na zona dos servidores dos níveis inferiores, com o servidor original mantendo uma referência para esses servidores de nível mais baixo. É claro que o servidor original não fica totalmente liberado da responsabilidade: ele ainda tem uma zona, mas as informações detalhadas são mantidas pelos servidores de nível mais baixo.
A Figura 4 mostra um exemplo do domínio br (nomes de domínios no Brasil), com subdomínios com diferentes servidores DNS sendo responsáveis pelas diferentes zonas.
Nesta Figura, “Delegação” indica uma transferência de responsabilidade na administração dos nomes a partir daquele ponto na árvore DNS.
Figura 4 – Zonas e domínios
1. Como são chamados os computadores na Internet em que ficam contidas as informações do espaço de nomes de domínio?
2. Explique como é feita a delegação da responsabilidade na administração dos nomes na árvore DNS.
Servidores principais e secundários
O DNS define dois tipos de servidores: principais e secundários. Um servidor principal é aquele que teve delegada a autoridade sobre uma zona. Ele é responsável por criar, manter e atualizar as informações desta zona. Ele armazena estas informações de zona em um arquivo no disco local.
Um servidor secundário é aquele que transfere as informações completas sobre uma zona de um servidor principal e armazena o arquivo em seu disco local. O servidor secundário não cria nem atualiza os arquivos de zonas.
Resolução DNS
O DNS é projetado como um aplicativo cliente-servidor. Um host que precisa fazer o mapeamento de um nome para um endereço IP (ou vice-versa) chama um cliente DNS denominado resolvedor (resolver).
O cliente (resolvedor) acessa o servidor DNS mais próximo com um pedido de resolução (mapeamento), ou seja, suponhamos que um cliente queira saber o IP da máquina www.google.com.br. Ele irá fazer uma requisição ao servidor DNS de sua rede (ou o mais próximo a ele) perguntando se ele conhece essa máquina.
Se o servidor tiver a informação, ele atende ao cliente; caso contrário, ele remete o cliente para outros servidores ou pede a outros servidores para que forneçam a informação. Isto vai depender de como o cliente solicitou a consulta (mapeamento) ao servidor, porque a consulta pode ser recursiva ou interativa.
Na consulta recursiva, usada normalmente por um host qualquer e o seu servidor de DNS, o cliente (resolvedor) espera que o servidor forneça a resposta final ao que ele perguntou.
Se o servidor for a autoridade do nome de domínio, ele verifica seu banco de dados e responde. Se o servidor não for a autoridade, ele deverá percorrer a árvore a partir da raiz a fim de chegar ao servidor que possui autoridade sobre o domínio consultado, e deste obter a resposta desejada pelo cliente.
A Figura 5 mostra este processo entre um cliente e seu servidor DNS, no qual o cliente pergunta pelo endereço IP associado ao nome exemplo.foo.eng.br.
• A mensagem 1 é a pergunta do cliente ao seu servidor de DNS.
• A mensagem 2 é a consulta do servidor DNS recursivo à raiz perguntando pelo servidor do domínio br.
• A mensagem 3 é a resposta à pergunta 2 na qual o servidor raiz passa a referência (o endereço IP) do servidor DNS responsável pelo domínio br.
Figura 5 – Resolução recursiva entre um cliente e um servidor DNS
• Na mensagem 4, o servidor recursivo pergunta ao servidor com autoridade sobre o domínio br a referência ao domínio eng.br.
• A mensagem 5 é a resposta à pergunta da mensagem 4, já referenciando o servidor do domínio foo.eng.br, pois o servidor de br também tem autoridade sobre o domínio eng.br.
• Nas mensagens 6 e 7, estão a pergunta e a resposta, respectivamente, ao servidor com autoridade sobre o nome perguntado inicialmente pelo cliente.
• Por fim, na mensagem 8 o servidor DNS recursivo repassa a resposta obtida ao cliente.
A consulta interativa é a utilizada entre os servidores de DNS para percorrer a árvore de nomes de domínio. Por exemplo, na Figura 5, as consultas do servidor DNS consultado inicialmente pelo cliente aos outros servidores DNS, iniciando pela raiz, foram feitas de forma interativa. Isto é, há uma interação entre os servidores de DNS a fim de percorrer a árvore de nomes para encontrar a informação consultada.
1. Quais as diferenças entre um Servidor DNS Principal e um Secundário?
2. Caso seja feita uma consulta de um nome que não exista em um Servidor DNS, qual a ação que ele deverá tomar?
3. Explique, através de um exemplo, como é feita a consulta interativa.
Uso de cache
Sempre que um servidor recebe uma consulta de um nome que não está em seu domínio, precisa procurar um endereço IP de servidor em seu banco de dados. A redução desse tempo de pesquisa aumentaria a eficiência. O DNS trata disso com um mecanismo chamado cache. Quando um servidor solicita um mapeamento a outro servidor e recebe a resposta, armazena essa informação em sua memória cache, antes de enviá-la ao cliente. Se o mesmo cliente ou outro solicitar o mesmo mapeamento, o servidor pode verificar sua memória cache e resolver o problema. Entretanto, para informar o cliente de que a resposta está vindo da memória cachê, e não de uma origem autorizada, o servidor marca a resposta como não autorizada.
Arquivo de zona
O banco de dados que contém as informações sobre um domínio é chamado de arquivo de zona. Este é um arquivo texto contendo vários registros de dados a respeito daquele domínio. Tais registros são conhecidos como registro de recursos (resource records).
Uma mensagem de consulta DNS deve conter o nome pesquisado e o tipo de registro a ser pesquisado. Os tipos de registros de recursos definidos em um arquivo de zona são os mostrados na Tabela 1.
Registro Significado
SOA Indica onde começa a autoridade (sobre o domínio).
NS Indica um servidor de nomes para uma zona.
A Mapeamento de nome a um endereço IP (IPv4).
AAAA Mapeamento de nome a um endereço IP (IPv6).
MX Indica um mail exchanger (servidor de e-mail) para um domínio.
CNAME Mapeia um nome alternativo (apelido) para um host.
PTR Mapeamento de um endereço IP a um nome de host.
HINFO Informação de um host. Fornece a descrição do hardware e do sistema operacional usados por um host.
WKS Serviços conhecidos. Define os serviços de rede que um host fornece.
Tabela 1 – Tipos de registros de recursos no DNS
A Figura 8 mostra um exemplo de arquivo de zona típico para uma empresa fictícia cujo domínio de Internet seria empresa.com.br.
Figura 8 – Exemplo de arquivo de zona
Neste arquivo de zona podemos notar o uso dos registros de recursos vistos na Tabela 1, como por exemplo o SOA e o CNAME. Cada linha simples (que não possui sub-registros) é composta dos seguintes campos: nome, a palavra “IN” indicando Internet, o tipo de registro e os dados sobre o mapeamento. O segundo campo contendo sempre “IN” se dá em razão de que o projeto do sistema DNS previa a resolução de nomes para outras redes ou serviços, o que atualmente não acontece.
No arquivo de zona da Figura 8, o caractere arroba (@) é uma referência simplificada ao próprio domínio; neste caso, significa “empresa.com.br”. O caractere ponto-e-vírgula (;) representa início de comentário e não é interpretado pelo servidor DNS. Os nomes que não encerrarem com um ponto final (.) serão acrescidos com o nome do domínio. Neste exemplo, o nome www, que aparece sem o ponto final, será interpretado como www.empresa.com.br.
O significado de cada linha é explicado na Tabela 2.
Registro Linhas Descrição
SOA 01 Mostra informações sobre a autoridade do domínio. Os dois primeiros dados são o servidor DNS principal e o e-mail (substituindo o arroba “@” por ponto “.”) do administrador deste domínio. Os demais dados, listados entre parênteses, dizem respeito ao controle das atualizações deste mapa entre os servidores de DNS que obtêm informações sobre o domínio.
NS 09 e 10 Indica o servidor de nomes do domínio. Normalmente, usa-se o FQDN do servidor DNS. Neste exemplo, temos dois servidores de DNS para o domínio, um primário e um secundário.
MX 11 Indica o servidor de e-mail do domínio. Este registro exige um número antes do nome do servidor. Este número indica a prioridade (em sequência direta) para se utilizar cada servidor, caso haja mais de um.
A 12, 14 e 15 Mapeamento de um nome para um endereço IP. Observe que todos os nomes de hosts utilizados no mapa da zona possuem um registro A para o endereço IP correspondente.
CNAME 13 Define um segundo nome (canonical name ou apelido) para um determinado nome de host. Isto é particularmente interessante quando temos vários serviços no mesmo host, e se utiliza o nome do serviço para o host correspondente. Neste exemplo, o serviço de mail é também servido pelo servidor web. Se o endereço IP deste servidor multisserviço mudar, basta mudar apenas em um registro.
Tabela 2 - Tipos de registros tipicamente utilizados em um mapa de domínio
1. Qual o principal benefício de se usar o sistema DNS em uma rede de computadores?
2. É possível usar algum outro mecanismo de tradução de nomes para endereços IP sem usar o sistema DNS?
3. Pesquise na Internet quais são os servidores raiz do sistema DNS e onde eles estão localizados no mundo.
Sempre que alterar o conteúdo do arquivo de uma zona, como o mostrado na Figura 8, altere o valor do campo “serial” para o valor que estiver lá + 1. Os servidores de DNS secundários usam esse número para saber se houve alterações no arquivo.
Configurando um servidor DNS
Agora, para uma melhor fixação dos conceitos que vimos até aqui, é de extrema importância que você esteja em seu computador para que possa reproduzir os passos que serão descritos a seguir. A primeira coisa que precisamos é de um servidor de DNS.
Vamos assumir que temos duas máquinas, chamadas A e B, e a máquina A será o servidor, enquanto a máquina B será o cliente de DNS. O software servidor DNS no Linux é feito através do daemon (processo servidor)named, e o mesmo vem distribuído no pacote bind9. Vamos assumir que este pacote já está instalado na máquina A.
BIND (Berkeley Internet Name Domain) é uma implementação pioneira de um software servidor de DNS publicamente distribuída nos sistemas operacionais UNIX e seus derivados, como o Linux. Ele, em sua versão 9, é o servidor DNS mais utilizado no mundo.
O arquivo principal de configuração do servidor BIND é o /etc/bind/named.conf. A partir da versão 9 do BIND, este arquivo possui apenas referências a outros três arquivos dentro do diretório /etc/bind, dividindo os dados das configurações nestes arquivos: named.conf.options, named.conf.local e named.conf.default-zones.
O named.conf.options contém as opções gerais de configuração do servidor DNS. O named.conf.default-zonespossui referência para as zonas padrão (default) no sistema DNS, como o nome padrão localhost que todo computador recebe quando possui conectividade TCP/IP.
O arquivo que iremos alterar será o named.conf.local, pois ele deve possuir referências para as zonas que serão criadas neste servidor DNS.
Com o gedit, abra o arquivo /etc/bind/named.conf.local e insira, logo após os comentários (linhas começando com duas barras “//”), as linhas de configuração da zona “metropoledigital.ufrn.br”, a qual iremos assumir neste servidor DNS, conforme a Figura 9.
Esta configuração de zona exige pelo menos dois parâmetros: o tipo de servidor (primário ou secundário) e qual o arquivo contendo as informações sobre a zona. Neste exemplo, este servidor será do tipo primário (master). Se ele fosse secundário (slave), a próxima linha deverá conter o parâmetro “masters”, onde deveriam ser informados os endereços IP dos servidores primários.
O segundo parâmetro será “/etc/bind/metropoledigital.ufrn.br.zone”, no qual colocaremos as informações sobre os registros desta zona.
Figura 9 - Inserindo a zona no servidor DNS
Agora criaremos nosso arquivo da zona “metropoledigital.ufrn.br”. Ainda no gedit, clique no ícone “Novo” para abrir uma nova aba para um outro arquivo. Digite o texto (sem a numeração das linhas) de acordo com a Figura 10. Ao final da digitação, salve este arquivo como /etc/bind/metropoledigital.ufrn.br.zone.
Figura 10 – Arquivo de zona
Salve os dois arquivos e feche o gedit.
Agora, reinicie o servidor de DNS, bind, conforme a Figura 11.
Figura 11 – Reiniciando o servidor DNS após a criação da zona
Neste ponto, ao ligarmos a máquina B, podemos observar que ela está pegando sua configuração IP por DHCP (feita na aula anterior).
Uma das informações fornecidas por DHCP foi o endereço IP do servidor de DNS. Este é o parâmetro principal para o resolvedor (cliente DNS) na máquina B. Para observar todos os parâmetros informados ao resolvedor, podemos exibir o conteúdo do arquivo /etc/resolv.conf nesta máquina, conforme Figura 12. Este arquivo que, neste caso, foi criado dinamicamente pelo DHCP é quem diz à máquina quem é o seu servidor de DNS.
Figura 12 – Arquivo de configuração do cliente DNS
Observe, na Figura 12, que o endereço IP do servidor de DNS é informado no parâmetro nameserver.
Os parâmetros domain e search definem o nome do domínio para a nomenclatura das máquinas e o domínio padrão de pesquisa FQDN quando alguém informar somente o primeiro nome de um host, respectivamente.
Vamos agora praticar algumas pesquisas de DNS na máquina B consultando o nosso servidor de DNS instalado na máquina A.
Para isso, utilizaremos o aplicativo de linha de comando chamado nslookup.
Este aplicativo é um cliente do serviço DNS muito utilizado pelos administradores de rede para investigar as configurações deste serviço em qualquer rede ligada à Internet.
Ao digitar nslookup na linha de comando, você abre este aplicativo, que lhe apresenta outro prompt de comandos, no qual você digitará aquilo que deseja pesquisar no sistema DNS. Podemos testá-lo digitando o nome www e pressionando a tecla ENTER, conforme a Figura 13.
Figura 13 – Prompt de comandos do nslookup
Observe o que ele mostra como resultado. Primeiro as informações do servidor de DNS consultado, seu endereço IP e a porta UDP utilizada na consulta. Em seguida, ele mostra o nome FQDN consultado e o endereço IP mapeado para este nome. Ele acrescentou o domínio “metropoledigital.ufrn.br” ao nome pesquisado devido o parâmetro search do /etc/resolv.conf, na Figura 12.
Veja que não especificamos o tipo de registro que queríamos e ele respondeu com uma resposta do tipo “A” (address), endereço IP do nome, pois este é o tipo de consulta/registro padrão.
Vamos agora mudar o tipo de consulta ao nosso servidor. Para isso, precisamos digitar o comando “set type=X”, onde X representa o tipo de registro de recurso no DNS, conforme a Tabela 1. Vamos pedir o registro SOA do domínio desta prática, conforme a Figura 14.
Figura 14 – Solicitação do registro SOA do nosso domínio
Vamos, agora, testar consultar um nome no qual nosso servidor não possui autoridade. Conforme a Figura 15, vamos consultar o registro SOA do domínio ufrn.br e observar o resultado.
Figura 15 – Consultando o registro SOA de outro domínio
Veja que apareceu a linha “Non-authoritative answer:”, seguido da resposta contendo o registro SOA do domínio pesquisado. Esta linha indica que o servidor que respondeu a consulta não tem autoridade sobre o domínio (nome) consultado, e que ele obteve esta resposta a partir de consulta a outros servidores, no esquema de consultas recursivas percorrendo a árvore hierárquica dos nomes.
Ainda na Figura 15, observe que é possível saber qual é o servidor que pode dar uma resposta autorizada sobre o domínio em questão, neste exemplo um dos dois servidores listados, os quais são os servidores primário e secundário do domínio. Para realizar uma consulta sobre o servidsetor DNS de um nome, deve-se mudar a consulta para o registro NS com o comando "set type=ns" e, em seguida, digita-se o nome do domínio a ser consultado, conforme a Figura 16.
Figura 16 – Consultando os servidores de nomes de um domínio.
Observe na Figura 16 que a pergunta aos servidores de nomes do domínio do Google retornou quatro servidores. Vamos utilizar um deles para a consulta ao registro MX (servidor de e-mail) do domínio gmail.com, conforme a Figura 17. Para mudarmos o servidor a ser consultado, devemos digitar o comando “serverIP_ou_nome_do_servidor”.
Figura 17 - Consultando outro servidor de DNS
Observe na Figura 17 que não surgiu mais a linha informando uma resposta não autorizada. Isto porque a resposta veio de um servidor que tem autoridade sobre o domínio consultado. Neste exemplo, gmail.com é o domínio do serviço de e-mail do Google. Observe também que apareceu uma lista de servidores de e-mail, cada um com sua prioridade (quanto menor o número, maior a prioridade) para entrega das mensagens neste domínio.
1. Caso seja necessário saber se o nosso servidor DNS está funcionando, qual nome do processo deveremos procurar na lista de processos ativos? Dica: execute no terminal o comando “ps aux”.
2. Para que serve o comando nslookup?
3. Pesquise sobre uma ferramenta muito usada no Linux para consulta de DNS chamada dig. Veja suas funcionalidades e como ela é usada. Dica: Lembre-se que existem manuais de vários programas no Linux; para verificar o manual do dig, use o comando “man dig”.
Após tudo isso que lhe foi apresentado, podemos então ver como o protocolo DNS pode ser útil em um ambiente de rede, pois nunca seremos capazes de decorar todos os endereços IPs das máquinas que acessamos em nossa rede ou até mesmo na Internet. A configuração correta do serviço é de extrema importância para que ele funcione como desejado; assim, devemos sempre procurar ver qual a melhor distribuição dos domínios a serem usados, a fim de que sejam administrados mais facilmente pelo gestor da rede.
Que tal você acessar:
• Registro.BR -
• OpenDNS -
• Procure também informações sobre o No-IP.
Resumo
Nesta aula você aprendeu que em uma rede é necessário que exista um serviço de tradução de nomes para endereços IP a fim de evitar que tenhamos que decorar números ao acessarmos serviços em computadores na rede. Este serviço de nomear todos os computadores ligados à Internet em todo o planeta é o DNS. Você observou que ele trabalha de maneira distribuída e segue uma estrutura de distribuição baseada em árvore hierárquica. Nesta árvore de servidores, cada um fica responsável pelo domínio de nomes da organização do qual faz parte, permitindo criar subárvores para nova divisão dos nomes dentro deste domínio. Você também percebeu que, para aumentar a disponibilidade do sistema, há os servidores primários e os secundários, e para otimizar os tempos das consultas os servidores guardam temporariamente as consultas já realizadas em cache. Por fim, praticou a configuração de um servidor DNS para um domínio de nomes e realizou consultas a este e outros domínios a partir de um aplicativo cliente, o nslookup.
Em seu computador, abra o VirtualBox e acesse o Laboratório1 desta aula (Aula8). Em seguida, realize os seguintes procedimentos.
1. Repita todos os passos vistos nesta aula para configurar seu servidor DNS na máquina A.
2. Altere o arquivo da zona do domínio metropoledigital.ufrn.br acrescentando o nome ftp para o IP 10.1.1.20, e incremente o número serial desta zona. Reinicie o bind9 para que estas alterações tenham efeito.
3. Faça consultas DNS ao servidor procurando pelo nome ftp.
4. Repita o passo 2, colocando agora ftp como um apelido pra www e execute nova consulta a este nome. O que mudou nas respostas?
Formação de web pagina
Desenvolvimento Web
Aula 1 – Ambiente de desenvolvimento para Web em Java
Olá, caro aluno. Hoje iniciaremos nossos estudos dentro da disciplina de Desenvolvimento Web. A linguagem de programação que utilizaremos será a linguagem Java, inclusive por ter todos os recursos necessários para entender como se constroem aplicações Web. Você irá aprender diversos conceitos e tecnologias de programação para a Web, como por exemplo, Servlets, JSP e Ajax.
As aulas dessa disciplina foram preparadas com muito esmero e dedicação e esperamos que ao final o nosso objetivo seja alcançado por todos. As nossas aulas terão exemplos práticos e atividades que ajudarão você a fixar o conhecimento e a estimular o seu aprendizado. Também teremos atividades extra-aula que ajudarão a dar mais um passo nesta disciplina. Esperamos que você tenha muitas dúvidas e que juntos possamos aprender: você comigo e eu com você. Lembre-se: qualquer dúvida, não hesite, pergunte.
Muito bem, vamos agora começar o nosso assunto. Nessa aula você aprenderá a instalar e configurar o nosso ambiente de desenvolvimento e debug. Para isso, vamos aprender a organizar e instalar três ferramentas muito importantes para o nosso estudo. São elas: Eclipse, Apache Tomcat e o JDK. Então, vamos colocar a mão na massa?!
Ao ler esta aula, você estará apto a:
• Instalar os softwares necessários para construir, executar edebugar suas aplicações em um ambiente J2EE.
Baixando, instalando e configurando nosso ambiente
Dos três softwares mencionados na apresentação, o que você realmente precisa é do Apache Tomcat, que é uma implementação de código aberto para os ambientes de Servlets e JSP, e o do JDK, que traz consigo as classes padrão Java e a máquina virtual para executar estas classes. O Eclipse é apenas uma ferramenta que facilita o nosso desenvolvimento, mas nada nos impediria de construirmos nossas aplicações sem ele. Porém, o esforço e o tempo necessários para isso não compensariam não usá-lo.
Vamos primeiro baixar e instalar o JDK. Para isso, faça o download do JDK versão 6 na seguinte URL: . Uma vez concluído o download, vamos agora instalar o JDK. Para isso, use a instalação padrão, sem maiores intervenções.
Depois de instalar o JDK, vamos baixar e descompactar o Apache Tomcat, um dos servidores Web mais conhecidos no mercado. Para isso acesse a seguinte URL: . Apesar de ter uma versão para instalação, é necessário instalar o Apache Tomcat. Basta baixar o seu arquivo zip e descompactá-lo no diretório de sua preferência. Entretanto, para fins dessa aula, indicamos que você descompacte o arquivo na pasta c:desen. Assim, ao término deste passo você terá uma pasta chamada apache-tomcat-6.0.29 dentro da pasta c:desen.
Pronto, viu como foi fácil ter o ambiente mínimo necessário para executar suas futuras aulas? Porém, o nosso objetivo é fazer com que você use um ambiente de desenvolvimento integrado e que facilite a construção e testes das suas aplicações; então, para isso vamos agora instalar e configurar o Eclipse.
Aqui, a primeira coisa a fazer é baixar o Eclipse. O arquivo para download poderá ser encontrado aqui: . Depois de baixá-lo, você terá que descompactar o arquivo e, mais uma vez, a pasta destino será c:desen. Quando o processo de descompactação terminar, você terá o diretório eclipse dentro da pasta c:desen.
Bom, agora tudo foi instalado. Então, vamos configurar nosso ambiente. Para isso execute o arquivo eclipse.exe, que está em c:desenclipse. Assim que você executar este arquivo, uma janela como a mostrada a seguir será exibida pedindo que você escolha o seu workspace. Neste caso, vamos criar um diretório chamado workspace em c:desen e escolhê-lo.
Figura 1
Feito isso, a próxima janela que será exibida será como a da figura abaixo. Nesta janela você encontrará algumas opções para quem é iniciante, porém vamos direto para a opção workbench (opção indicada figura abaixo), pois essas opções podem ser exibidas a qualquer momento.
Figura 2
Pronto, agora estamos vendo o nosso ambiente de desenvolvimento que de agora em diante nos acompanhará na execução das nossas atividades.
Bom, antes de instalarmos o Eclipse nós instalamos o JDK e o Apache Tomcat. E agora, como integrar o JDK e o Apache Tomcat com o Eclipse? Com relação ao JDK nós não precisamos nos preocupar, pois oEclipse, ao ser executado, descobre onde o JDK foi instalado, então nenhuma configuração é necessária.
E o Apache Tomcat? Bom, a versão do Eclipse que nós baixamos e instalamos é uma versão para desenvolvedores J2EE e nesta versão ela vem com um plugin chamado Web Tools Platform (WTP). Esseplugin permite a integração do Eclipse com a maioria dos servidores J2EE do mercado, entre eles o Apache Tomcat. Para que essa integração funcione temos que informar ao plugin onde o Apache Tomcat foi instalado. Então vamos lá:
No menu do Eclipse, selecione a opção Window -> Prefences. Uma janela como a da figura abaixo será exibida. Clique na seta ao lado de Server, como indicado na Figura 3.
Figura 3
Ao fazer isso, as opções de servidores serão exibidas. Clique em Runtime Environment e em seguida no botão Add..., como mostrado na figura a seguir.
Figura 4
Uma nova janela será exibida, como mostrado na Figura 5. Selecione a opção Apache, em seguida a opção Apache Tomcat v6.0, marque o checkbox Create a new local server e, por último, a opção Next, como indicado na figura.
Figura 5
Na próxima janela, clique no botão Browse, selecione o diretório C:desenapache-tomcat-6.0.29 e depois clique em Finish, como mostrado na figura a seguir.
Figura 6
Para concluir a integração, confirme tudo clicando no botão OK.
Agora temos o Eclipse integrado com o Apache Tomcat e, a partir de agora, quando criarmos nossos projetos WEB já poderemos informar ao Eclipse que estes serão testados neste Apache Tomcat. Além disso, como veremos mais à frente, o plugin do WTP nos permite executar o Apache Tomcat de dentro doEclipse em dois modos de execução diferentes e em um deles podemos fazer debug das classes. Não é legal?
Bom, agora vamos criar o nosso primeiro projeto WEB usando o Eclipse. Este projeto será criado e integrado com o Apache Tomcat que nós configuramos no passo anterior. Usando o menu do Eclipse, selecione File -> New -> Other..., como mostrado na Figura 7.
Figura 7
Na tela seguinte, selecione a opção Web, Dynamic Web Project e em seguida Next, como mostrado na Figura 8.
Figura 8
Na tela seguinte, defina o nome do projeto como “aula” e em seguida clique em Next, como mostrado na figura abaixo.
Figura 9
Nas telas seguintes, basta clicar no botão Next e Finish.
Agora vamos dizer que o deploy desta aplicação será feita no nosso Apache Tomcat antes configurado. Para isso, vamos seguir os seguintes passos:
• Clique na visão Servers e, em seguida, com o botão direito do mouse, Tomcat v6.0 Server at localhost [Stopped], como mostra a figura a seguir.
Figura 10
Na janela que se abrirá selecione a opção Add and Remove..., como mostrado na Figura 11.
Figura 11
Na janela seguinte, selecione o projeto “aula”, clique em Add e em seguida em Finish, como mostrado a seguir.
Figura 12
Agora, para testarmos nossa aplicação, vamos criar um arquivo index.jsp na raiz do nosso diretório WEB. Para isso, clique com o botão direito na pasta WebContent no seu projeto “aula” e escolha a opção New -> JSP File, como mostrado na Figura 13.
Figura 13
Na nova janela que será exibida, digite no campo File name o nome index.jsp e em seguida clique no botão Finish, como mostrado na próxima figura.
Figura 14
No arquivo que será aberto no seu workspace, digite dentro da tag o texto Alou Mundo!!!, como mostrado na Figura 15.
Figura 15
Agora vamos colocar nosso servidor pra executar. Novamente clique na visão Servers e em seguida no botão start, como mostrado na Figura 16 a seguir.
Figura 16
Na figura acima existe a segunda opção para iniciar o servidor. Nesta opção o servidor é iniciado no mode debug, que nos permite, em tempo de execução, debugar nossas classes e JSPs. Não é legal? Entretanto, esta opção só deve ser usada quando realmente queremos debugar alguma coisa, pois ela deixa o Eclipse um pouco mais lento.
Agora vamos ver como ficou nossa primeira página. Para isso, selecione Window -> Show view -> Other, conforme a Figura 17.
Figura 17
Em seguida selecione General -> Internal Web Browser, conforme indicado na Figura 18.
Figura 18
Na nova visão, digite a url e tecle Enter. Veja o resultado na próxima figura.
Figura 19
Viu como foi fácil?
Por último, vamos dar uma olhada na estrutura do projeto que foi criado. Perceba que toda a estrutura de uma aplicação WEB foi criada pelo plugin do WTP, inclusive o descritor de deploy web.xml (veremos mais à frente esta estrutura e para que serve este arquivo). Para seguirmos incrementando nossa aplicação, basta criar nossos servlets na pasta Java Resources: src e os nossos JSPs, imagens, css, js dentro da pasta WebContent, que é a pasta raiz da nossa aplicação WEB, como veremos nas próximas aulas. Perceba também que existe um item no nosso projeto chamado Deployment Descriptor. Ao clicar nele, automaticamente será aberto o arquivo web.xml. Tudo é mostrado na figura abaixo.
Figura 20
Pronto, concluímos a configuração do Eclipse, Apache Tomcat, JDK e do nosso ambiente de desenvolvimento. Muito fácil, não é?
Leitura complementar
Acesse os sites das ferramentas Eclipse e Tomcat e procure ler seus manuais (visão geral, tutoriais introdutórios etc.), de forma a complementar seu entendimento sobre essas ferramentas.
Resumo
A aula de hoje foi introdutória. Você aprendeu como configurar o nosso ambiente de desenvolvimento, criar uma aplicação WEB e como integrá-la com o nosso servidor. Isso nos permite evoluir para as nossas próximas atividades, bem como construir nossos servlets e JSPs dentro de um projeto que é preconfigurado pelo plugin do eclipse WTP.
1. Descreva os passos necessários para estar com o ambiente Eclipse + Tomcat pronto para começar a programação Web.
Desenvolvimento Web
Aula 2 – Introdução aos Servlets
Olá, meu amigo. A partir desta aula você começará a aprender as tecnologias Java utilizadas para a programação de sistemas para a Internet. Na disciplina de Autoria Web, você aprendeu a desenvolver as chamadas páginas Web estáticas, ou seja, aquelas cujo conteúdo é definido previamente, antes do acesso do usuário. Agora é uma boa oportunidade para você relembrar os principais marcadores HTML utilizados na construção das páginas Web estáticas. Isso porque eles continuarão a ser utilizados aqui. Então, na dúvida, não hesite em rever AGORA e no decorrer da aula de hoje os principais conceitos (marcadores HTML, BODY, FORM, A, INPUT etc.) sobre esse assunto!
Bom, na aula de hoje você irá começar a entender como funciona a programação de páginas Web dinâmicas em Java. Pense no seguinte: como você iria fazer para implementar uma calculadora com as operações básicas de soma, subtração, divisão e multiplicação? Você já sabe criar páginas HTML para representar a calculadora e certamente sabe o código em Java que implementa essas operações Java. Já a integração dessas coisas você aprenderá agora, nessa aula!
Boa leitura.
Ao final desta aula você será capaz de:
• Entender o ciclo de vida dos Servlets.
• Compreender o funcionamento dos métodos de processamento de requisições Web dos Servlets.
• Saber a configuração da aplicação Web necessária para o funcionamento dos Servlets.
Páginas Web estáticas versus dinâmicas
Para começar, vamos ilustrar a diferença entre páginas estáticas e dinâmicas. Pense em um exemplo de sistema que implementa as operações básicas de uma calculadora. Sua página de entrada pode ser a mostrada na Figura 1. Ao digitar 20 e 10 para os campos valor 1 e valor 2, respectivamente, e então clicar no botão *, a tela da Figura 2 é apresentada. Entretanto, se for clicado o botão +, a tela da Figura 3 é que deve ser apresentada.
Figura 1 – Tela HTML de um sistema de calculadora na Web
Figura 2 – Tela dinâmica de resposta para a multiplicação de 2 x 10
Figura 3 – Tela dinâmica de resposta para a soma de 2 com 10
Como podemos notar, a montagem da página Web de resposta da calculadora precisa ser feita de forma dinâmica, ou seja, em tempo de execução . Dizer que uma página é dinâmica é equivalente a dizer que ela é gerada dinamicamente ou gerada em tempo de execução. Em todos esses casos, o que queremos dizer é que o conteúdo da página não pode ser definido previamente em sua totalidade. No caso da calculadora, o conteúdo da página de resultado a ser apresentado depende dos valores informados pelo usuário!
Para criarmos páginas Web dinâmicas em Java, fazemos uso dos chamados Servlets, como iremos lhe mostrar a seguir.
Tempo de execução é utilizado em contraste ao chamado tempo de compilação. No tempo de compilação, o programador está alterando o código e compilando para achar erros e gerar os arquivos executáveis. Depois disso, podemos rodar o programa. O período durante o qual o programa está rodando é chamado de tempo de execução.
Tecnologia de Servlets Java
Para gerarmos páginas dinâmicas no servidor de aplicações Web, fazemos uso de componentes de software chamado Servlets. Você se lembra o que são classes em Java, certo? Aqueles módulos do programa que possuem atributos e métodos. Pois bem, os Servlets são nada mais que classes em Java que, em geral, herdam direta ou indiretamente de uma classe especial chamada HttpServlet existente no pacote javax.servlet.http, como visto no exemplo a seguir.
Relembrando, classe é um tipo de dado que descreve o que determinados objetos possuem em termos de atributos e métodos.
01 package aula02;
02
03 import java.io.IOException;
04 import java.io.PrintWriter;
05
06 import javax.servlet.ServletException;
07 import javax.servlet.http.HttpServlet;
08 import javax.servlet.http.HttpServletRequest;
09 import javax.servlet.http.HttpServletResponse;
10
11 public class ServletExemplo extends HttpServlet {
12 protected void doGet(HttpServletRequest request,
13 HttpServletResponse response)
14 throws ServletException, IOException {
15 PrintWriter saida = response.getWriter();
16 saida.write("Olá!");
17 saida.close();
18 }
19 }
Atenção
Caso esteja em dúvida sobre conceitos de orientação a objetos como herança, polimorfismo e sobrescrita de método, aproveite para reler a aula sobre esse assunto da disciplina de Programação Orientada a Objetos.
De maneira geral, a classe ServletExemplo herda de HttpServlet e sobrescreve o método de nome doGet, cujos detalhes serão vistos mais adiante. O conteúdo da página resultante pela execução do Servlet é escrito através do objeto saída, sendo, neste caso, igual ao texto "Olá!".
Para isso, acessamos o objeto que representa o canal de comunicação do servidor para o cliente (response.getWriter()).
Em seguida, utilizamos o método write(String msg) desse objeto para escrever o conteúdo da página HTML a ser gerada. O parâmetro passado para esse método é uma String que vai formar o conteúdo da página. Na verdade, você pode chamar o método write várias vezes. Por fim, chamamos o método close() para fechar a conexão.
Nesse momento, o navegador Web do usuário irá saber que todo o conteúdo da página já foi gerado e pode ser apresentado. Detalhes sobre os parâmetros request e response do método doGet serão apresentados na próxima aula.
Para visualizarmos o resultado da execução do ServletExemplo, primeiro precisamos informar ao servidor Web que ServletExemplo é um Servlet e que ele pode ser executado pelos usuários da aplicação Web. Isso é feito alterando-se o arquivo web.xml, como mostrado a seguir.
Objetos são representações das coisas reais ou virtuais do mundo real no programa orientado a objetos. Objetos possuem atributos e métodos.
Métodos são funções ou procedimentos que estão atrelados a um objeto. Os métodos são responsáveis, entre outras coisas, por processar dados (parâmetros do método etc.).
01
02
08 ProgramacaoWeb
09
10 index.html
11
12
13
14 ServletExemplo
15 ServletExemplo
16 aula02.ServletExemplo
17
18
19 ServletExemplo
20 /ServletExemplo
21
22
Observe os marcadores e . O primeiro é utilizado para indicar a existência do ServletExemplo. O marcador tem como objetivo informar ao servidor o nome completo da classe Java. Já o marcador indica um apelido para o Servlet, no caso o nome ServletExemplo, o qual será usado no restante do arquivo web.xml. Por fim, os marcadores e são utilizados para fins de documentação.
Com relação ao marcador , ele é utilizado para habilitar o ServletExemplo a ser executado via Web por um usuário do sistema. Isso é feito mapeando-o a uma URL do sistema. O marcador indica o nome (apelido) do Servlet enquanto o marcador indica a URL à qual o Servlet está associado. No exemplo mostrado, o ServletExemplo está associado à URL relativa /ServletExemplo. Caso o nome de sua aplicação Web no servidor seja ProgramacaoWeb e considerando que o servidor Web está rodando na porta 8080, a URL para este Servlet é https://localhost:8080/ProgramacaoWeb/ServletExemplo.
Esse trabalho de configuração deve ser feito para todos os Servlets criados, o que pode ser um trabalho nada motivador quando for necessário criar dezenas de Servlets. Felizmente, ferramentas de desenvolvimento como o Eclipse realizam esse trabalho de configuração de forma automática. Para isso, basta utilizar a opção New / Servlet do Eclipse ao invés de New / Class.
Dica
Utilize a opção New / Servlet do Eclipse ao invés de New / Class para criar novos Servlets. Assim, a configuração dos Servlets no arquivo web.xml será feita automaticamente.
Para executar um Servlet no Eclipse, utilize a opção Run as / Run on Server que aparece ao se clicar com o botão direito em cima do Servlet (veja a Figura 4).
Figura 4 – Executando um Servlet no Eclipse
Na primeira vez, caso o seu projeto não esteja associado a um servidor Web integrado ao Eclipse, a Figura 5 será apresentada. Selecione o servidor instalado para ser o servidor Web da sua aplicação. Lembre-se de marcar a opção Always use this server when running this project, evitando que essa tela se abra nas próximas vezes.
Figura 5 – Indicando o servidor Web a ser utilizado
Enfim, após o ServletExemplo ser executado, a janela da Figura 6 será apresentada mostrando que tudo está configurado e funcionando corretamente. Caso isso não ocorra, observe a mensagem de erro que irá aparecer na aba Console, na parte inferior da janela.
Figura 6 – Resultado da execução do ServletExemplo
Atenção
Lembre-se sempre de configurar o arquivo web.xml após criar um novo Servlet, caso isso não seja feito de forma automática pela ferramenta de desenvolvimento utilizada! Nas próximas aulas, iremos considerar a criação dos servlets pelo menu New | Servlet, o que garantirá que o arquivo web.xml seja configurado com o Servlet criado.
1. Defina a classe ServletExemplo como mostrado anteriormente e execute-a no Eclipse, conforme instruções já apresentadas (Run on server).
2. Defina uma classe ServletMeuNome que gera uma página com seu nome e execute-a.
3. Crie uma classe ServletQualMeuNome para gera uma página com a pergunta “Qual o meu nome?”. Esse texto deve possuir um link de forma que, quando clicado, execute o ServletMeuNome.
Dica: use o marcador para criar um link para a URL que executa o ServletMeuNome.
Ciclo de vida dos Servlets
Muito bem, agora que você já sabe criar um Servlet e executá-lo, vamos nos aprofundar sobre os conceitos e recursos dessa tecnologia, que são a base da programação Web. Em primeiro lugar, é importante saber que os Servlets seguem um ciclo de vida. Quando uma requisição Web realizada por um cliente é mapeada para um Servlet, o contêiner Web realiza os seguintes passos:
1. Se o Servlet ainda não tiver sido carregado (ou seja, é a primeira vez que o Servlet é acessado pelo contêiner):
a. Carrega a classe do Servlet, isto é, lê o bytecode da classe, o qual é gerado quando ela é compilada.
b. Instancia a classe, ou seja, cria um objeto a partir da classe carregada. Para isso, usa-se o construtor vazio do Servlet.
c. Chama o método init() do Servlet, responsável por fazer qualquer inicialização ou configuração necessária para o funcionamento do Servlet.
2. Executa o método service() definido na superclasse HttpServlet (e assim herdado pelos Servlets). Esse método será responsável por identificar o tipo da requisição Web e invocar o método de tratamento apropriado (doGet(), doPost() etc.), como descrito na próxima seção dessa aula.
Atenção
Caso o Servlet não seja mais necessário (ex.: quando o servidor Web está sendo desligado ou reiniciado), o contêiner Web executa o método destroy() de cada Servlet que foi instanciado.
Vejamos a seguir o código de um Servlet utilizado para imprimir a data e hora na qual ele foi carregado, executado e finalizado.
01 package aula02;
02
03 import java.io.IOException;
04 import java.io.PrintWriter;
05 import java.text.SimpleDateFormat;
06 import java.util.Date;
07
08 import javax.servlet.ServletException;
09 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12
13 public class ServletDataHora extends HttpServlet {
14 private SimpleDateFormat format =
15 new SimpleDateFormat("dd/MM/yyyy - hh:mm:ss");
16
17 @Override
18 public void init() throws ServletException {
19 super.init();
20 log("ServletDataHora iniciado às "
21 + format.format(new Date()));
22 }
23
24 @Override
25 protected void doGet(HttpServletRequest request,
26 HttpServletResponse response)
27 throws ServletException, IOException {
28 PrintWriter saida = response.getWriter();
29 saida.write("Olá! A data/hora atual é: ");
30 saida.write(format.format(new Date()));
31 saida.write("");
32 saida.close();
33 }
34
35 @Override
36 public void destroy() {
37 log("ServletDataHora finalizado às "
38 + format.format(new Date()));
39 super.destroy();
40 }
41 }
Para funcionar, o ServletDataHora possui um atributo do tipo SimpleDateFormat, utilizado para formatar datas e horas em um String de acordo com o padrão definido pelo programador, ou seja, segundo o formato "dd/MM/yyyy - hh:mm:ss". Esse objeto é primeiramente utilizado na implementação do método init(), o qual faz uso do método log (herdado de HttpServlet) para imprimir na saída padrão a data e hora na qual o Servlet foi inicializado, como pode ser visto na aba Console do Eclipse após iniciarmos o servidor Web e acessarmos o Servlet (veja a Figura 7).
Figura 7 – ServletDataHora mostrando a data e hora atual formatadas
Código similar é visto no método destroy(). Observe que esses dois métodos devem executar os métodos sobrescritos super.init() e super.destroy(), visando garantir uma correta inicialização e liberação de recursos definidos no código herdado da superclasse!
Observe também o uso do @override, anotação no código Java que indica ao compilador que os métodos anotados estão sobrescrevendo métodos das superclasses. É uma boa prática usar esse tipo de anotação, pois dessa forma o compilador garante que o nome e tipos dos parâmetros dos métodos definidos estão de acordo com os da superclasse.
Você pode estar pensando agora: por que redefinimos o método doGet e não o método service? A resposta para essa pergunta será dada mais adiante, ainda nesta aula.
1. Defina a classe ServletDataHora como mostrado anteriormente e execute-a. Observe se as mensagens são impressas ao inicializar o Servlet, ao executá-lo e ao finalizar a execução do servidor Web.
2. Altere a classe ServletDataHora para mostrar também o dia da semana atual (segunda-feira, terça-feira etc.). Dica: utilize a classe java.util.Calendar.
Métodos de execução dos Servlets
Até o momento, todos os Servlets que foram implementados redefiniram o método doGet da classe HttpServlet. Para entendermos o porquê disso, precisamos estar cientes de que o HTTP (HyperText Transfer Protocol) é mais utilizado na comunicação entre clientes e servidores Web e ele pode ser utilizado de acordo com vários métodos (GET, POST, HEAD, PUT etc.). Os métodos GET e POST são os mais utilizados e estão brevemente descritos no Quadro 1. Os detalhes sobre esses dois métodos não serão abordados neste curso.
Método Descrição
GET Método de acesso ao servidor Web utilizado ao se: digitar uma URL em um navegador Web; clicar em uma URL de uma página; acionar um formulário que contenha o atributo method="get". No caso, utiliza a própria URL para envio desses dados. Por exemplo, a URL é utilizada para acessar o recurso passando-se o parâmetro p1 com valor 10.
POST Método de acesso ao servidor Web utilizado ao se acionar um formulário Web que contenha o atributo method="post". No caso, os parâmetros e valores de acesso a um recurso Web não aparecem na própria URL – eles são enviados pelo navegador ao servidor de forma separada.
Quadro 1 – Métodos GET e POST do protocolo HTTP
A implementação do método service que é dada pela classe HttpServlet reconhece o tipo de método utilizado na requisição Web e delega a execução a métodos específicos de acordo com o método utilizado. O termo “delega” quer dizer que o método executa um outro método, ou seja, deixa para o outro método o trabalho de processamento da requisição. No caso dos métodos GET e POST, o método service delega a tarefa de processar as requisições para os métodos doGet e doPost, respectivamente.
Para entendermos melhor esse funcionamento, observe o exemplo da Figura 8, o qual possui uma página HTML com um link e com um botão que levam à execução do mesmo Servlet. No caso, o link usa o método GET e o botão usa o método POST (observe o atributo action do marcador form).
Figura 8 – Tela com link para acesso via método GET e botão para acesso via método POST
O código da página HTML vista na Figura 8 é mostrado a seguir.
01
02
03 ServletGetPost
04
05
06 GET
07
10
11
Já a implementação da classe ServletGetPost para atender às requisições acionadas pelo link ou botão dessa página é vista a seguir. Esse Servlet redefine tanto o método doGet como o método doPost de HttpServlet, apresentando essa informação na mensagem de resposta (veja a Figura 9).
01 package aula02;
02
03 import java.io.IOException;
04 import java.io.PrintWriter;
05
06 import javax.servlet.ServletException;
07 import javax.servlet.http.HttpServlet;
08 import javax.servlet.http.HttpServletRequest;
09 import javax.servlet.http.HttpServletResponse;
10
11 public class ServletGetPost extends HttpServlet {
12
13 protected void doGet(HttpServletRequest request,
14 HttpServletResponse response)
15 throws ServletException, IOException {
16 PrintWriter saida = response.getWriter();
17 saida.write("Olá! ");
18 saida.write("Mesma resposta para o método GET.");
19 saida.write("");
20 saida.close();
21 }
22
23 protected void doPost(HttpServletRequest request,
24 HttpServletResponse response)
25 throws ServletException, IOException {
26 PrintWriter saida = response.getWriter();
27 saida.write("Olá! ");
28 saida.write("Resposta para o método POST.");
29 saida.write("");
30 saida.close();
31 }
32 }
Figura 9 – Telas geradas pelo ServletGetPost ao usarmos requisição via método POST e GET, respectivamente
Se na hora de implementar um Servlet você notar que não faz diferença entre os métodos GET e POST (esse é o caso mais comum!), então você pode implementar apenas um dos métodos (digamos, o GET) e fazer com que o outro chame o primeiro. Isso pode ser observado no código do ServletTantoFaz apresentado a seguir.
01 package aula02;
02
03 import java.io.IOException;
04 import java.io.PrintWriter;
05
06 import javax.servlet.ServletException;
07 import javax.servlet.http.HttpServlet;
08 import javax.servlet.http.HttpServletRequest;
09 import javax.servlet.http.HttpServletResponse;
10
11 public class ServletTantoFaz extends HttpServlet {
12
13 protected void doGet(HttpServletRequest request,
14 HttpServletResponse response)
15 throws ServletException, IOException {
16 doPost(request, response);
17 }
18
19 protected void doPost(HttpServletRequest request,
20 HttpServletResponse response)
21 throws ServletException, IOException {
22 PrintWriter saida = response.getWriter();
23 saida.write("Olá! ");
24 saida.write("Mesma resposta para o GET ou POST.");
25 saida.write("");
26 saida.close();
27 }
28
29 }
Caso você não redefina os métodos doGet ou doPost, a sua implementação padrão é mostrar uma mensagem de erro padrão indicando que o método HTTP utilizado não é suportado.
1. Crie a classe ServletGetPost e execute-a através da página HTML apresentada para acessar o Servlet através dos métodos GET ou POST.
2. Altere a classe ServletGetPost para apresentar a data atual se for usado o método GET e a hora atual se for utilizado o método POST. Dica: baseie-se no código do ServletDataHora e altere a String do formato da data/hora para mostrar só a data ou só a hora. Ex: "dd/MM/yyyy" para mostrar só a data.
3. Crie uma página HTML com um formulário e utilize-o para acessar o ServletMeuNome através do método POST. Analise se o Servlet respondeu como você estava esperando.
4. Altere o ServletMeuNome definido por você em atividades anteriores desta aula para que ele funcione tanto com o método GET como com o método POST.
Hora da revisão
Bem, vamos relembrar alguns tópicos vistos nesta aula?
Você começou a estudar os Servlets. Para poder funcionar, os Servlets precisam ser registrados no arquivo web.xml, onde diversas configurações podem ser feitas. No caso da aula de hoje, a principal configuração é a identificação dos Servlets e seu mapeamento para URLs.
Os Servlets possuem um ciclo de vida. Primeiro são carregados, depois instanciados (onde o método init() é executado) e então executados (método service) ao serem acessados pelos clientes Web. Quando o Servlet não é mais necessário, seu método destroy() é executado antes do objeto ser liberado da memória.
A implementação do método service é dada pela classe HttpServlet, que delega a execução a métodos específicos de acordo com o método utilizado. No caso dos métodos GET e POST, o método service delega a tarefa de processar as requisições para os métodos doGet e doPost, respectivamente.
Leitura complementar
Veja os métodos existentes nas classes Servlet, GenericServlet e HttpServlet.
Servlet API Documentation.
•
Resumo
Chegamos ao fim de nossa primeira aula com programação para Web! Vamos recapitular os principais conceitos aprendidos? Hoje você aprendeu que para criar páginas Web dinâmicas em Java, fazemos uso dos chamados Servlets, classes em Java que em geral herdam direta ou indiretamente de HttpServlet. Com isso você entendeu o ciclo de vida dos Servlets, viu o funcionamento dos métodos de processamento de requisições Web dos Servlets e aprendeu a configuração da aplicação Web necessária para o funcionamento dos Servlets. Faça agora sua Autoavaliação e até a próxima aula!
1. Descreva o ciclo de vida dos Servlets.
2. Identifique quais métodos da classe HttpServlet estão envolvidos no processamento de requisições Web. Descreva como esses métodos são utilizados para processar as requisições feitas pelos clientes através dos navegadores Web.
3. Descreva os passos necessários para configurar uma aplicação Web para que o Servlet aluno.MeuServlet possa ser executado.
4. Crie e execute um Servlet que, dado um número, calcula e mostra o seu fatorial.
Desenvolvimento Web
Aula 3 – Manipulando Requisições e Respostas HTML com Servlets
Olá! Continuamos agora o assunto da aula passada, com os chamados Servlets. Você já aprendeu que os Servlets são criados para processar as requisições Web, gerando as páginas HTML de resposta que serão mostradas no navegador Web do usuário. Tudo bem até aí?
Muito bem, continuaremos o assunto de Servlets agora apresentando mais detalhes sobre como processar as requisições dos clientes e sobre como identificá-los ao longo do tempo. Por exemplo, você já deve ter preenchido formulários na Web, correto? Diversas são as situações em que precisamos fazer isso: quando cadastramos uma nova conta de e-mail, informando dados pessoais e e-mail desejado; quando nos autenticamos (logamos) em sistemas Web, acessando nossa conta de e-mail ou conta bancária. Pois bem, esses sistemas Web precisam receber e processar os dados digitados. Nessa aula, vamos ver como fazer isso com Servlets.
Além disso, um cadastro pode ser feito em mais de uma tela. Imagine um sistema em que na primeira tela seja necessário entrar com dados pessoais, clicar em um botão de nome “Próximo” e depois, em uma segunda tela, digitar os seus dados profissionais para só então clicar em um botão "Confirmar”. É bem provável que o sistema deva salvar os dados coletados apenas quando ambas as telas forem preenchidas. Dessa forma, como guardar a informação digitada na primeira tela enquanto o usuário digita informações na segunda tela? Também veremos uma possível solução para isso.
Depois de ler esta aula, você estará apto a:
• Processar parâmetros das requisições Web.
• Repassar parâmetros de uma requisição para outra.
Manipulando os parâmetros das requisições Web
Na aula anterior, você percebeu que os Servlets são acessados através de suas URLs (ex.: ). Esse acesso pode ser via método GET ou via método POST. Ou seja, se você apenas digitar uma URL em um navegador Web ou clicar em um link usual numa página, estará usando o método GET. Já para se usar o método POST, precisamos definir e usar um formulário, ou seja, usar o marcador