Portas TCP e UDP
Ao conectar na Internet, seu micro recebe um único endereço IP válido. Apesar disso, mantemos vários programas ou serviços abertos simultaneamente. Em um desktop é normal ter um programa de e-mail, um cliente de FTP ou SSH, o navegador, um cliente de ICQ ou MSN, dois ou três downloads via bittorrent e vários outros programas que enviam e recebem informações, enquanto um único servidor pode manter ativos servidores web, FTP, SSH, DNS, LDAP e muitos outros serviços, atendendo a centenas de clientes simultaneamente.
Se temos apenas um endereço IP, como todos estes serviços podem funcionar ao mesmo tempo sem entrar em conflito?
Imagine que as duas partes do endereço IP (a parte referente à rede e a parte referente ao host) correspondem ao CEP da rua e ao número do prédio. Um carteiro só precisa destas duas informações para entregar uma carta. Mas, dentro do prédio moram várias pessoas. O CEP e número do prédio só vão fazer a carta chegar até a portaria. Daí em diante é preciso saber o número do apartamento. É aqui que entram as famosas portas TCP.
Existem 65.536 portas TCP, numeradas de 0 a 65535. Cada porta pode ser usada por um programa ou serviço diferente, de forma que em teoria poderíamos ter até 65536 serviços diferentes ativos simultaneamente em um mesmo servidor, com um único endereço IP válido. O endereço IP contém o CEP da rua e o número do prédio, enquanto a porta TCP determina a que sala dentro do prédio a carta se destina.
As portas TCP mais usadas (também chamadas de "well known ports") são as portas de 0 a 1023, que são reservadas para serviços mais conhecidos e utilizados, como servidores web, FTP, servidores de e-mail, compartilhamento de arquivos, etc. A porta 80, por exemplo, é reservada para uso de servidores web, enquanto a porta 21 é a porta padrão para servidores FTP. A porta "0" é reservada, por isso não entra realmente na lista.
Além do endereço IP, qualquer pacote que circula na Internet precisa conter também a porta TCP a que se destina. É isso que faz com que um pacote chegue até o servidor web e não ao servidor FTP instalado na mesma máquina.
Além das 65.536 portas TCP, temos o mesmo número de portas UDP, seu protocolo irmão. Embora seja um protocolo menos usado que o TCP, o UDP continua presente nas redes atuais pois oferece uma forma alternativa de envio de dados, onde em vez da confiabilidade é privilegiada a velocidade e a simplicidade. Vale lembrar que tanto o TCP quanto o UDP trabalham na camada 4 do modelo OSI. Ambos trabalham em conjunto com o IP, que cuida do endereçamento.
No TCP, os dados são transmitidos através de conexões. Tudo começa com o cliente enviando o pacote "SYN", que solicita a abertura da conexão. Caso a porta esteja fechada, o servidor responde com um pacote "RST" e a conversa pára por aí. Caso, por outro lado, exista algum servidor disponível na porta solicitada (um servidor http, por exemplo), então ele responde com outro pacote "SYN", seguido de um um pacote "ACK", avisando que a porta está disponível e prosseguindo com a abertura da conexão.
O cliente responde então com outro pacote "ACK", o que abre oficialmente a conexão. Começa então a transferência dos dados, que são organizados em pacotes. O protocolo TCP/IP permite o uso de pacotes com até 64 kbytes, mas normalmente são usados pacotes com até 1500 bytes, que é o tamanho máximo de um frame Ethernet. Pacotes maiores podem ser transmitidos normalmente através da rede, mas precisam ser fragmentados, ou seja, divididos em pedaços menores, com até 1500 bytes.
Para cada pacote recebido, a estação envia um pacote de confirmação e, caso algum pacote se perca, ela solicita a retransmissão. Cada pacote inclui 4 bytes adicionais com um código de CRC, que permite verificar a integridade do pacote. É através dele que o cliente sabe quais pacotes chegaram danificados.
Depois que todos os dados são transmitidos, o servidor envia um pacote "FYN" que avisa que não tem mais nada a transmitir. O cliente responde com outro pacote "FYN" e a conexão é oficialmente encerrada.
Graças a tudo isso, a confiabilidade é muito boa. Quando a conexão está ruim, é normal ocorrerem mais perdas de pacotes e retransmissões, mas as corrupções são geralmente causadas pelo próprio programa que está baixando o arquivo e não pelo protocolo. O problema é que toda esta formalidade torna as transferências um pouco mais lentas. Imagine que, para transmitir uma mensagem de texto com 300 bytes, via TCP, seria necessário transmitir um total de 9 pacotes!
Veja um exemplo de como a transmissão funcionaria:
Estação: SYN (solicita a abertura da conexão)
Servidor: SYN (confirma o recebimento e avisa que a porta está disponível)
Servidor: ACK (inicia a conexão)
Estação: ACK (confirma)
Estação: DATA (é enviado o pacote com a mensagem de texto)
Servidor: OK (a confirmação, depois de verificar a integridade do pacote)
Estação: FYN (solicita o fechamento da conexão)
Servidor: FYN (confirma)
Estação: FYN (confirma que recebeu a confirmação)
No UDP, as coisas são mais simples. Nele não existe abertura de conexão, os pacotes são transmitidos diretamente. A estação solicita alguma informação e o servidor envia a resposta. Assim como no TCP, são usados pacotes de até 1500 bytes (o protocolo permite o uso de pacotes com até 64 kbytes, mas, assim como no caso do TCP eles são raramente usados devido ao limite de tamanho dos frames Ethernet), contendo os bits adicionais de verificação. A estação pode verificar a integridade dos pacotes, mas não tem como perceber se algum pacote se perdeu, ou solicitar a retransmissão de um pacote corrompido. Se um pacote se perde, fica por isso mesmo.
Um exemplo típico de uso do UDP é o streaming de vídeo e audio via web, uma situação onde o que vale é a velocidade e não a confiabilidade. Você não gostaria nada se o navegador parasse a exibição do vídeo para solicitar uma retransmissão cada vez que um pacote se perdesse ou chegasse corrompido. É preferível que ele pule o quadro e continue exibindo o restante do vídeo.
Outra aplicação comum são os servidores DNS. Sempre que você acessa um site, a solicitação do endereço IP referente ao domínio do site e a resposta do servidor são enviadas via UDP, para ganhar tempo.
Na prática, é bem raro encontrar algum programa que utilize unicamente pacotes UDP para qualquer coisa além do envio de mensagens curtas. Mesmo no caso do streaming de vídeo, é quase sempre usada uma porta TCP para estabelecer a conexão e enviar informações de controle, deixando o UDP apenas para o envio dos dados.
As portas mais usadas são:
21 TCP: FTP - O FTP é um dos protocolos de transferência de arquivos mais antigos e ainda assim um dos mais usados. O ponto fraco do FTP é a questão da segurança: todas as informações, incluindo as senhas trafegam em texto puro e podem ser capturadas por qualquer um que tenha acesso à transmissão.
O FTP possui dois modos de operação: passivo e ativo. No modo ativo, o cliente contata o servidor usando uma porta vaga aleatória, como, por exemplo, a porta 1026, endereçando o pacote à porta 21 do servidor. O servidor imediatamente contata o cliente de volta, usando a porta seguinte (do cliente) para enviar os dados. Se o cliente usou a porta 1026 para abrir a conexão, então o servidor enviará os dados na porta 1027. O problema é que o modo ativo não funciona quando o cliente acessa através de uma conexão compartilhada. Ao tentar responder, o servidor cairia na porta 1027 do gateway da rede, sem conseguir chegar ao cliente.
No modo passivo, o cliente também abre a conexão contatando a porta 21 do servidor; entretanto, ao invés de iniciar a conexão imediatamente, o servidor responde avisando que o cliente pode contatá-lo em uma segunda porta, escolhida aleatoriamente (a 2026, por exemplo). O cliente inicia, então, uma nova conexão na porta especificada e o servidor responde enviando os dados (a porta fica reservada ao cliente durante o tempo que durar a transferência). Em teoria, isto seria um limite ao número de clientes que poderiam se conectar simultaneamente, mas, na prática, seriam necessárias mais de 64.000 conexões simultâneas ao mesmo servidor FTP para esgotar as portas disponíveis.
Praticamente todos os clientes de FTP atuais utilizam o modo passivo por padrão, mas isso pode ser modificado dentro da configuração. Alguns poucos servidores de FTP não podem ser acessados em modo passivo, pois para isso é necessário que o administrador faça uma configuração de firewall mais cuidadosa, mantendo abertas um conjunto de portas altas.
Em resumo, no modo ativo o servidor precisa ter aberta apenas a porta 21, mas em compensação o cliente precisa acessar a web diretamente e ter um conjunto de portas altas abertas no firewall. No modo passivo, os papéis se invertem: o cliente não precisa ter portas abertas, mas o servidor sim.
22 TCP: SSH - O SSH é o canivete suíço da administração remota em servidores Linux. Inicialmente o SSH permitia executar apenas comandos de texto remotamente; depois passou a permitir executar também aplicativos gráficos e, em seguida, ganhou também um módulo para transferência de arquivos, o SFTP. A vantagem do SSH sobre o Telnet e o FTP é que tudo é feito através de um canal encriptado, com uma excelente segurança.
O SSH pode ser usado também para encapsular outros protocolos, criando um túnel seguro para a passagem dos dados. Criando túneis, é possível acessar servidores de FTP, proxy, e-mail, rsync, etc. de forma segura. Graças a isso, o SSH é usado como meio de transporte por diversos programas, como o NX Server. Veremos detalhes sobre o uso do SSH no capítulo 6.
O sistema de encriptação utilizado pelo SSH, assim como os túneis encriptados, trabalham no nível 6 do modelo OSI, acima da camada de sessão, do protocolo TCP/IP, e de toda a parte física da rede. Ao contrário do FTP, o SSH não precisa de portas adicionais: tudo é feito através da porta 22, que é a única que precisa ficar aberta no firewall do servidor. O cliente não precisa ter porta alguma aberta e pode acessar através de uma conexão compartilhada via NAT.
23 TCP: Telnet - O Telnet é provavelmente o protocolo de acesso remoto mais antigo. A primeira demonstração foi feita em 1969, com o acesso de um servidor Unix remoto (ainda na fase inicial de implantação da Arpanet), muito antes de ser inventado o padrão Ethernet e antes mesmo da primeira versão do TCP/IP.
O Telnet foi muito usado durante as décadas de 1980 e 1990, mas depois caiu em desuso, sendo rapidamente substituído pelo SSH. Além de não possuir nenhum dos recursos mais sofisticados suportados pelo SSH, o Telnet é um protocolo completamente aberto (no sentido pejorativo), que transmite login, senha e todos os comandos em texto puro. Isso torna ridiculamente simples capturar a transmissão (usando, por exemplo, o Wireshark, que veremos no capítulo 5) e assim "invadir" o servidor, usando a senha roubada.
Uma curiosidade, é que o sistema usado pelo Telnet para a transmissão de comandos é usado como base para diversos outros protocolos, como o SMTP e o HTTP. De fato, você pode usar um cliente Telnet para mandar um e-mail (se souber usar os comandos corretos), ou mesmo acessar um servidor web, desde que consiga simular uma conexão HTTP válida, como faria um navegador.
25 TCP: SMTP - O SMTP é o protocolo padrão para o envio de e-mails. Ele é usado tanto para o envio da mensagem original, do seu micro até o servidor SMTP do provedor, quanto para transferir a mensagem para outros servidores, até que ela chegue ao servidor destino. Tradicionalmente, o Sendmail é o servidor de e-mails mais usado, mas, devido aos problemas de segurança, ele vem perdendo espaço para o Qmail e o Postfix.
53 UDP: DNS - Os servidores DNS são contatados pelos clientes através da porta 53, UDP. Eles são responsáveis por converter nomes de domínios como "guiadohardware.net" nos endereços IP dos servidores.
Existem no mundo 13 servidores DNS principais, chamados "root servers". Cada um deles armazena uma cópia completa de toda a base de endereços. Estes servidores estão instalados em países diferentes e ligados a links independentes. A maior parte deles roda o Bind, mas pelo menos um deles roda um servidor diferente, de forma que, mesmo que uma brecha grave de segurança seja descoberta e seja usada em um cyberataque, pelo menos um dos servidores continue no ar, mantendo a Internet operacional.
Para acessar qualquer endereço, é preciso primeiro consultar um servidor DNS e obter o endereço IP real do servidor. Em geral, uma consulta a um dos root servers demora alguns segundos, por isso os provedores de acesso e os responsáveis por grandes redes sempre configuram servidores DNS locais, que criam um cache das consultas anteriores, de forma a agilizar o acesso. Você mesmo pode configurar um servidor DNS para a sua rede usando o Bind.
67 e 68 TCP: Bootps e Bootpc - Estes dois protocolos podem ser usados em sistemas de boot remoto, onde os clientes não possuem HD nem CD-ROM e acessam todos os arquivos de que precisam a partir do servidor. Entretanto, os servidores DHCP atuais incorporam as funções que eram antigamente desempenhadas pelos servidores Bootps, e Bootpc, o que acabou tornando-os obsoletos. Nas versões atuais do LTSP, por exemplo, os clientes dão boot através da rede utilizando uma combinação de servidores DHCP, TFTP, NFS e XDMCP.
69 UDP: TFTP - O TFTP é uma versão simplificada do FTP, que utiliza portas UDP para a transferência dos dados e não inclui suporte à correção de erros. Ele pode ser usado para transferência de arquivos em geral, mas é mais freqüentemente usado em sistemas de boot remoto, como no caso do LTSP. A principal vantagem nesses casos é que o protocolo é muito mais simples, de forma que o cliente TFTP pode ser incluído diretamente no BIOS da placa de rede, permitindo que o sistema operacional seja carregado diretamente através da rede, sem precisar de um HD ou outra unidade de armazenamento.
80 TCP: HTTP - O HTTP é o principal protocolo da Internet, usado para acesso às paginas web. Embora a porta 80 seja a porta padrão dos servidores web, é possível configurar um servidor web para usar qualquer outra porta TCP. Neste caso, você precisa especificar a porta ao acessar o site, como em:http://200.234.34.12:8080.
110 TCP: POP3 - Servidores de e-mail, como o Postfix, armazenam os e-mails recebidos em uma pasta local. Se você tiver acesso ao servidor via SSH, pode ler estes e-mails localmente, usando Mutt (no Linux). Entretanto, para transferir os e-mails para sua máquina, é necessário um servidor adicional. É aí que entra o protocolo POP3, representado no Linux pelo courier-pop e outros servidores.
Programas como o Thunderbird e o Outlook contatam o servidor POP3 através da porta 110 e baixam as mensagens utilizando um conjunto de comandos de texto, derivados do Telnet. Originalmente, o POP3 é um protocolo tão inseguro quanto o Telnet, mas os servidores atuais suportam encriptação via SSL (o mesmo sistema de encriptação usado para acessar páginas seguras, via HTTPs), o que garante um bom nível de segurança.
123 UDP: NTP - O NTP (Network Time Protocol) é o protocolo usado para sincronizar o relógio em relação a outras máquinas da rede ou da Internet. Manter os relógios das máquinas sincronizados é uma necessidade em grandes redes, com grande uso de arquivos compartilhados, já que fica difícil acompanhar os horários de atualização dos arquivos se cada máquina utiliza um horário diferente.
O protocolo NTP leva em conta o ping entre as máquinas e outros fatores para fazer as atualizações de forma extremamente precisa, de forma que diferenças de sincronismo entre as máquinas são sempre da ordem de poucos milésimos de segundo.
Existem diversos servidores NTP públicos, disponíveis via web. Para facilitar as coisas, existe o servidor "pool.ntp.org", que serve como um load balancer, encaminhando as requisições para um servidor geograficamente próximo de você. Ao invés de ficar caçando servidores públicos no Google, você pode sincronizar diretamente a partir dele. No Windows XP, por exemplo, a opção de usar o NTP está disponível no "Painel de Controle > Data e hora > Horário da Internet":
137 UDP, 138 UDP e 139 TCP: NetBIOS - Estas três portas são usadas pelo protocolo de compartilhamento de arquivos e impressoras em redes Microsoft. Cada uma das portas tem uma função específica: a porta 137 UDP é usada para a navegação, incluindo a visualização dos compartilhamentos disponíveis, a porta 138 UDP para a resolução dos nomes da rede e a porta 139 TCP é usada para a transferência de dados. É necessário que as três estejam abertas no firewall para que a visualização dos compartilhamentos e acesso aos arquivos funcione corretamente.
A partir do Windows 2000, passou a ser usado o protocolo CIFS (veja a seguir), mas o NetBIOS continua disponível para manter compatibilidade com as versões anteriores do sistema.
143 TCP: IMAP - O IMAP é mais um protocolo para recebimento de e-mails, assim como o POP3. A diferença entre os dois é que, ao receber os e-mails via POP3, eles são apagados do servidor assim que baixados, liberando o espaço usado na caixa postal. No IMAP, os e-mails continuam no servidor até serem deletados manualmente.
Embora oferecer contas de e-mail com acesso via IMAP seja muito mais oneroso do que via POP3 (já que o número de requisições é maior, e os usuários podem conservar mensagens antigas por muito tempo), ele vem "roubando a cena" com a popularização dos webmails, que são justamente clientes IMAP, que rodam no próprio servidor (através do Apache ou outro servidor web), e são acessados no cliente usando o navegador.
177 TCP: XDMCP - O XDMCP é um protocolo de acesso remoto, suportado nativamente pelo X (o ambiente gráfico usado no Linux e em outros sistemas Unix). Ele permite rodar aplicativos remotamente e é a base para o LTSP e outros sistemas de acesso remoto, onde é usado um servidor central e terminais leves. O XDMCP pode ser também usado no dia-a-dia, para simplesmente rodar programas instalados em outra máquina da rede.
A vantagem do XDMCP é que ele é um protocolo bastante simples e rápido, que oferece um bom desempenho via rede local e consome poucos recursos, tanto no servidor, quanto no cliente. Ele é também um recurso nativo do X, de forma que você não precisa instalar nenhum software adicional, basta ativar o recurso na configuração do KDM ou GDM (os gerenciadores de login usados nas distribuições Linux atuais).
A desvantagem é que o XDMCP é um protocolo "da velha guarda", que não inclui suporte a encriptação, e utiliza um conjunto de portas altas para enviar dados aos clientes. Além da porta 177, onde o servidor recebe conexões, é necessário que estejam abertas as portas de 6010 à 6099 (no servidor) e as portas de 5000 a 5200 nos clientes, o que complica um pouco as coisas ao manter um firewall ativo.
389 TCP: LDAP - O LDAP é muito usado atualmente para criar servidores de autenticação e definir permissões de acesso para os diferentes usuários da rede. Existem vários padrões de LDAP, um dos mais usados é o OpenLDAP, suportado pela maioria das distribuições Linux atualmente em uso.
443 TCP: HTTPS - O HTTPS permite transmitir dados de forma segura, encriptados usando o SSL. Ele é usado por bancos e todo tipo de site de comércio eletrônico ou que armazene informações confidenciais.
445 TCP: CIFS - O protocolo CIFS é uma versão atualizada do antigo protocolo NetBIOS, usado para a navegação e acesso a compartilhamentos em redes Windows. O protocolo CIFS é utilizado por padrão pelos clientes rodando o Windows 2000, XP e Vista, além de ser usado pelas versões recentes do Samba. Ao contrário do NetBIOS, que utiliza um conjunto de 3 portas, o CIFS utiliza apenas a porta 445 TCP.
Naturalmente, esta é uma lista rápida, contendo apenas as portas mais usadas. Você pode ver uma lista longa e completa, com todos os serviços conhecidos e as portas utilizadas por cada um no: http://www.iana.org/assignments/port-numbers.