Capítulo 6. Conectividade

Índice
SSH
Conexões Discadas
Conectando redes
Referências

A organização de computadores em redes tornou possível a realização de uma série de tarefas. A popularização de pequenas e médias intranets em empresas, escritórios e organizações contribuiu para o aumento de produtividade e eficiência dessa ferramenta de trabalho. No entanto, nem sempre apenas uma intranet é suficiente, e se faz necessário tornar possível a comunicação de clientes remotos com as intranets ou mesmo interligar as intranets a redes maiores como a Internet, por exemplo.

Serão estudadas nesse capítulo formas de permitir a interação de uma intranet com clientes remotos bem como sua interligação com outras redes e/ou Internet. Primeiramente, será apresentado o SSH[1], ou, interpretador de comandos seguro, que é uma alternativa mais segura e com mais funcionalidades que o telnet. Em seguida será descrito como permitir o acesso à sua intranet através de conexões discadas e como se conectar a outras redes utilizando conexões discadas, e por fim serão vistos alguns conceitos relativos ao controle do fluxo de informações entre redes, como roteamento e mascaramento.

SSH

O SSH é um programa que permite a execução de comandos em uma máquina remota, utilizando para isso um canal de comunicação criptografado. Adicionalmente o SSH possui um comando (o scp) que permite a transferência de arquivos entre duas máquinas utilizando um canal criptografado. Ele pode ser utilizado como uma alternativa segura a comandos tradicionais do UNIX® como telnet, rlogin, rsh, rcp e rdist.

A utilização de métodos de criptografia na comunicação entre duas máquinas torna o SSH uma ferramenta bastante útil na administração de máquinas, uma vez que permite ao administrador verificar e configurar uma máquina remotamente de forma segura, podendo até mesmo executar aplicações como o Linuxconf na máquina remota. Do ponto de vista prático, ao se utilizar o SSH é como se o administrador ou usuário estivesse efetivamente sentado em frente ao computador remoto, podendo rodar programas e utilizar recursos deste computador.

Além da característica de utilizar canais de comunicação criptografados, que impedem a utilização de programas "farejadores"[2] para capturar logins e senhas, o SSH apresenta como vantagem uma forma de autenticação mais avançada, podendo utilizar chaves assimétricas para usuários e máquinas, além da capacidade de criar "túneis" criptografados, podendo assim executar até mesmo aplicações gráficas remotamente.

Para melhor entendimento do funcionamento e das vantagens da utilização do SSH, serão vistos a seguir alguns dos conceitos e recursos utilizados por ele.

Criptografia

A utilização de criptografia em comunicações não é algo novo, e já era utilizada antes mesmo de se existirem computadores. Criptografia é um conjunto de técnicas que permitem tornar incompreensível uma mensagem originalmente escrita com clareza, de forma a permitir que apenas o destinatário a decifre e compreenda, ou seja, na impossibilidade de manter informações de acessos não autorizados, a criptografia visa tornar uma mensagem ininteligível a quem não deveria vê-la. É exatamente isso que o SSH faz ao se comunicar, ou seja, os pacotes contendo as informações a serem transmitidas passam por um processo de criptografia que visa proteger a informação contida neles, já que não há formas de conhecer os caminhos por onde esses pacotes trafegarão (principalmente em se tratando de Internet), nem o quão seguro será este caminho.

Chaves Simétricas e Assimétricas

No processo de criptografia de uma informação é necessária a utilização de uma "chave", ou seja, um código ou uma convenção de como a informação será criptografada. Quando esta chave é utilizada tanto para criptografar quanto para decriptar essa informação, ela é chamada de chave simétrica. Suponha que uma chave seja uma tabela de equivalência entre caracteres e números, por exemplo. O agente transmissor a utilizaria para transformar uma mensagem em uma seqüência de números, e o agente receptor a utilizaria para transformar essa seqüência de números na mensagem original.

O exemplo acima serve apenas para fins didáticos e na prática são utilizados métodos matemáticos e polinômios que possuem um alto grau de complexidade. Além do mais, é possível aumentar a segurança utilizando-se uma chave conhecida por ambas as partes apenas para combinar uma outra chave que será utilizada somente na seção de comunicação corrente.

Embora as chaves simétricas possam alcançar um grau considerável de segurança, existe um tipo de chave ainda mais segura: as chaves assimétricas. Neste tipo de chave é utilizada uma chave que só serve para criptografar a informação e uma que só serve para decriptar. Esse par de chaves também é conhecido como chaves pública e privada. A chave pública pode ser livremente distribuída e só pode ser utilizada para criptografar informações que serão enviadas ao dono da chave privada[3]. A chave privada é capaz de decriptar informações codificadas com a chave pública correspondente, e também de gerar assinaturas.

Assim, é possível distribuir a chave pública a quem quer que a solicite. E se for necessário provar uma identidade basta lançar um desafio: se a máquina em questão for capaz de decodificar uma seqüência arbitrária de dados criptografados com uma chave pública então ela é a dona da chave privada correspondente.

Com a solução de SSH apresentada aqui, o administrador poderá configurar o SSH de modo que um usuário apenas precise digitar o seu login e sua senha para se conectar.

Implementação

A solução SSH apresentada aqui se baseia no pacote OpenSSH, que é uma implementação livre do pacote SSH original que possui restrições à sua utilização comercial. O OpenSSH é compatível com a versão 1 do protocolo SSH (com suas duas variantes, a 1.3 e 1.5) e com a versão 2.

Será visto a seguir como implementar e configurar o servidor SSH, e em seguida da implementação e configuração do cliente SSH.

Pré-requisitos

Para uma implementação bem-sucedida do servidor SSH é necessário que:

  • sua rede esteja corretamente configurada.

Instalação

Selecione para instalação com o Synaptic os pacotes:

  • openssh-server

  • linuxconf-opensshd

  • openssh-clients

ou abra um terminal e utilize os comandos abaixo:

# apt-get install openssh-server linuxconf-opensshd
# apt-get install openssh-clients

Os procedimentos descritos acima instalarão o servidor e o cliente SSH. Para instalar apenas o cliente basta selecionar somente o pacote openssh-clients para instalação.

Configuração do servidor SSH

A configuração do servidor SSH pode ser feita utilizando-se a opção Configuração -> Rede -> Tarefas de servidor -> Servidor SSH (openssh) do Linuxconf. Ao acessar essa opção uma tela como a da Figura 6-1 será mostrada.

A configuração padrão do servidor SSH é bastante completa e segura; apenas as opções mais importantes serão descritas.

O campo Porta contém o número da porta que o servidor SSH utilizará, a alteração do valor padrão exigirá alterações também no cliente SSH, portanto sugere-se que seja mantido esse valor. O campo Escuta endereço define quais endereços de rede do servidor deverão ser utilizados para receber conexões SSH. O valor padrão (0.0.0.0) define que todos os endereços serão utilizados. A versão do protocolo a ser utilizada é definida no campo Protocolo; o valor padrão especifica que deverão ser utilizadas as versões 2 e 1 (nesta ordem de preferência).

Figura 6-1. Configuração do Servidor SSH

A seguir estão descritas as principais opções de cada aba, apresentadas na Figura 6-1:

Opções Chave da Máquina

Nesta aba são configuradas as opções relativas às chaves de autenticação do servidor. O pacote de instalação do OpenSSH, ao ser instalado, gera automaticamente essas chaves e as coloca nos locais corretos, logo não há necessidade de se alterar nada nesta aba.

Controle de Acesso

Aqui podem ser configuradas restrições ao acesso via SSH. Os campos Permite Grupos e Permite Usuários podem ser utilizados para restringir o acesso apenas aos usuários de determinados grupos ou mesmo apenas a determinados usuários. Insira os valores nos campos separando-os com espaços em branco. Valores em branco nesses campos significam que todos os usuários e grupos são permitidos, e ao se inserir um valor neles, apenas o usuário ou grupo listado será permitido. Caracteres coringas são permitidos nesses campos. Os campos Nega Grupos e Nega Usuários podem ser utilizados para restringir o acesso dos usuários ou grupos listados nestes campos. Por fim, o campo Permite Registro de Root especifica se o usuário root pode se logar ou não utilizando o SSH. Se for especificado que não, para se realizar alguma atividade administrativa em uma máquina remota será necessário se logar nela como um usuário comum e depois utilizar o comando su.

Opções de Segurança

Nesta aba são definidas as opções de autenticação que o servidor SSH usará. A opção Autenticação de Senha configura o servidor para utilizar a autenticação por senhas em texto plano através do tunelamento criptografado, ou seja, o usuário poderá utilizar a sua senha do sistema. Se você quiser forçar os seus usuários a utilizar apenas a autenticação com passphrases e chaves criptográficas assimétricas, configure esse campo com o valor "NO". Os campos Autenticação RSA e Autenticação DSA configuram se o servidor deve utilizar esse tipo de chave assimétrica para autenticar os usuários. O campo Registra Grace Time configura quanto tempo o servidor SSH deve esperar pela autenticação do usuário antes de se desconectar.

Opções Gerais

Aqui se encontram algumas opções relativas ao comportamento do servidor após o usuário estabelecer a conexão, como se o servidor deve ou não verificar se há mensagens novas para o usuário ou se deve ou não imprimir a mensagem do dia.

Opções do X11

Por padrão, o servidor SSH não permite o tunelamento de aplicações gráficas via conexão SSH, e para habilitá-las você deverá selecionar o valor yes no campo Envio do X11. Se você deseja utilizar aplicações gráficas remotamente através do SSH habilite essa opção.

Suporte do skey

Especifica se a autenticação skey é permitida.

Suporte a Kerberos

Nesta aba se encontram opções de configuração relativas à autenticação via Kerberos. Utilize essas opções apenas se você possuir um servidor de autenticação com suporte a Kerberos.

Finalize a configuração do servidor SSH ativando a inicialização automática do serviço sshd acessando a opção Controle -> Painel de controle -> Controle de atividade dos serviços do Linuxconf.

Configuração do cliente SSH

O cliente SSH não necessita nenhuma configuração para funcionar, no entanto, se você pretende utilizar autenticação com chaves assimétricas, como a chave RSA, será necessário gerar essas chaves. Para gerar essas chaves cada usuário deverá utilizar o comando ssh-keygen. Veja como proceder:

  1. Abra um terminal e digite o comando:

    $ ssh-keygen
  2. O comando irá gerar a sua chave no diretório .ssh dentro de sua área home, e utilizará por padrão o arquivo identity. Ao aparecer a mensagem abaixo pressione ENTER para confirmar ou insira um outro nome de arquivo.

    Generating public/private rsa1 key pair.
    Enter file in which to save the key (/home/usuario/.ssh/identity):
  3. O comando solicitará então que você entre com uma passphrase (uma frase-senha). É possível utilizar uma frase-senha vazia pressionando-se apenas um ENTER, logo a autenticação será feita utilizando-se apenas as chaves. Insira a sua frase-senha ao aparacer a mensagem:

    Enter passphrase (empty for no passphrase):

    Insira-a novamente para confirmar ao aparecer a mensagem:

    Enter same passphrase again:
  4. O ssk-keygen criará então as chaves e mostrará uma mensagem como esta:

    Your identification has been saved in /home/usuario/.ssh/identity.
    Your public key has been saved in /home/usuario/.ssh/identity.pub.
    The key fingerprint is:
    69:85:b7:a9:74:d9:92:ea:5c:e3:92:cb:47:b2:70:03 \
    usuario@kepler.minhaorganizacao
  5. Para funcionar corretamente é necessário que o diretório .ssh/ possua as permissões corretas. Ele deve ter permissão de leitura, escrita e execução apenas para o dono. Você poderá ajustar as permissões deste diretório utilizando o seguinte comando:

    $ chmod 700 ~/.ssh
  6. Entre no diretório .ssh/ e adicione a sua chave pública ao arquivo de chaves autorizadas utilizando o seguinte comando:

    $ cat identity.pub >> authorized_keys
  7. Ajuste a permissão do arquivo contendo as chaves com o comando:

    $ chmod 600 authorized_keys
  8. As configurações necessárias na máquina que será o alvo da conexão SSH estão prontas, simplesmente especifique o arquivo que contém a chave privada na linha de comando ao se conectar.

Utilizando o Cliente SSH

A utilização do cliente é bastante simples. Para se conectar a um servidor SSH basta utilizar o comando ssh como no exemplo abaixo:

$ ssh [-i arquivo-chave] [usuario@]servidor [-X]

Os parâmetros entre colchetes são opcionais. A opção -i arquivo-chave especifica a sua chave privada, caso você esteja utilizando este tipo de autenticação e a sua chave não se encontre no local padrão (diretório .ssh/). Caso o seu login no servidor seja diferente do que você esteja utilizando na máquina cliente, você deverá especificar o seu login na forma usuario@. Substitua servidor pelo nome da máquina-alvo da conexão e, finalmente, utilize a opção -X para permitir o tunelamento do X11 através do canal criptografado.

Utilizando o scp

O comando scp permite a cópia de arquivos entre duas máquinas utilizando-se os recursos de criptografia do SSH e pode ser uma alternativa ao uso do FTP.

Sua forma básica é:

$ scp arquivo-origem arquivo-destino

A origem e o destino podem se localizar na máquina cliente ou na máquina servidor, além do mais, pode ser necessário fornecer o login também. Por exemplo, para copiar um arquivo da máquina local para o servidor você poderá usar o scp assim:

$ scp arquivo usuario@servidor:/home/usuario

Note que é necessário indicar o caminho absoluto no servidor e não o caminho relativo apenas à sua área home. Para copiar um arquivo do servidor para sua máquina utilize:

$ scp usuario@servidor:/caminho/arquivo .

Testando a configuração

Para testar a configuração do servidor SSH tente se conectar a ele utilizando o cliente SSH. Você poderá fazer isso com o seguinte comando:

$ ssh usuario@kepler.minhaorganizacao

Se o servidor foi configurado para aceitar conexões com senhas apenas, ele solicitará a sua senha do sistema, ou pedirá sua frase-senha se tiver sido configurado para utilizar chaves RSA. Você poderá obter mais informações do que está acontecendo ao se conectar utilizando a opção -v no final do comando.

Experimente também copiar um arquivo da máquina cliente para o servidor, utilizando o comando scp.

Conexões Discadas

A utilização de linhas telefônicas comuns para conectar computadores em rede, além de ter permitido a popularização da Internet, permitiu também que empresas e organizações conectassem suas redes locais de matrizes e filiais de uma maneira simples. Embora hoje existam alternativas mais eficientes (como linhas ADSL), as conexões discadas ainda são uma alternativa simples e relativamente barata. Além disso, conexões discadas permitem um alto grau de mobilidade, e podem ser utilizadas, por exemplo, por funcionários em viagem para acessar a rede de sua empresa.

Serão apresentados aqui duas soluções utilizando conexões via linha discada: a primeira permitirá que usuários se conectem em seu servidor e a segunda permitirá conectar a sua intranet à Internet através de uma conexão com um provedor de acesso.

O protocolo PPP

Para poder enviar e receber dados via conexão discada é necessário utilizar um protocolo especial para esse fim, o PPP ou protocolo ponto a ponto[4].

O protocolo PPP é utilizado para enviar datagramas através de uma conexão serial, e permite que ambos os lados da conexão negociem certas opções como endereços IP e o tamanho máximo dos datagramas, além de prover modos de autenticação do cliente.

O protocolo PPP é implementado no Linux em duas partes: a primeira é implementada através de módulos do kernel e a segunda através do serviço pppd. Os módulos do kernel são carregados dinamicamente quando necessários, e são eles os responsáveis pelas interfaces virtuais pppX (onde X é um número), utilizadas em conexões discadas. O serviço pppd auxilia o kernel executando as funções de inicialização e autenticação, que precedem o envio ou recebimento de informações através da conexão.

Ao se iniciar uma conexão, o pppd utilizará um dispositivo serial (um modem ligado a uma porta serial, como, por exemplo, /dev/ttyS2) ligando-o ao modo PPP e criando assim a interface ppp0, que a partir desse momento funcionará de maneira bastante semelhante a uma interface de rede comum (ethernet). O pppd procede então com a autenticação utilizando para isso a autenticação via PAP (protocolo de autenticação por senha[5]) ou via CHAP (protocolo de autenticação por desafio de cumprimento[6]). O pppd pode ser configurado também para alterar as rotas padrões do sistema de acordo com a nova conexão estabelecida.

Servidor PPP

Um servidor PPP é um serviço que permite que seus usuários se conectem ao seu servidor através de uma conexão discada, implementando assim um serviço semelhante ao de um provedor de acesso.

Implementação

Pré-requisitos

Para implementar o servidor PPP você precisará de:

  • no mínimo uma porta serial (com um modem);

  • uma linha telefônica dedicada ao acesso remoto;

  • uma conexão com a Internet (opcional).

Instalação

Selecione para instalação com o Synaptic os seguintes pacotes:

  • ppp

  • mgetty

Se você preferir abra um terminal e instale os pacotes com os seguintes comandos:

# apt-get install ppp mgetty

Configuração

Para configurar o servidor siga os seguintes passos:

  1. Use o editor de textos de sua preferência para abrir o arquivo /etc/inittab.

    No inittab você deve incluir uma linha para cada porta utilizada para o PPP. Por exemplo, se você pretende utilizar um modem na porta ttyS2, a linha correspondente no inittab deverá ser:

    S2:2345:respawn:/sbin/mgetty ttyS2 -D /dev/ttyS2

    Obviamente, se você utilizar uma placa multisserial o nome do dispositivo será diferente. Por exemplo, uma placa Cyclades® se chamará, provavelmente, ttyCn, onde n é um número seqüencial.

  2. Após salvar o arquivo e sair do editor de textos, você deve fazer o init ler o /etc/inittab novamente para utilizar as novas configurações:

    # init q
  3. Acesse o diretório de configurações do mgetty:

    # cd /etc/mgetty+sendfax
  4. Use o editor de textos de sua preferência para editar o arquivo login.config.

    Ao abrir o arquivo, você deve procurar uma linha comentada (iniciada com "#") semelhante a:

    #/AutoPPP/ - a_ppp /usr/sbin/pppd auth -chap +pap login debug

    Ao encontrá-la, você deve editá-la retirando o "#" inicial.

    Note que você pode definir as opções do PPP nesta linha.

    No caso, o PPP irá usar autenticação PAP usando usuários do /etc/passwd.

  5. Salve o arquivo e saia do editor. Em seguida, acesse o diretório de configurações do ppp:

    # cd /etc/ppp
  6. Você deve criar um arquivo para cada porta utilizada para acesso remoto. Os nomes desses arquivos devem ter o formato options.PORTA. Por exemplo, para a porta ttyS2 o arquivo se chamará options.ttyS2.

    Este arquivo deve incluir duas informações: o endereço de IP do servidor e o endereço de IP do cliente. Por exemplo, se o arquivo options.ttyS2 tiver o seguinte conteúdo:

    203.120.219.12:203.120.220.2

    quando um cliente conectar-se através da porta ttyS2, ele terá o endereço de IP 203.120.220.2 e o endereço de IP do servidor é 203.120.219.12.

Atenção

A solução apresentada aqui permite apenas que o cliente se comunique com o servidor. Para que o cliente seja capaz de se comunicar com o resto da intranet ou mesmo com a Internet utilizando-se um link do servidor será necessário implementar também um roteamento com repasse de pacotes IP ou o mascaramento IP (veja a seção Roteamento para mais detalhes).

Testando a configuração

Para testar o funcionamento do seu servidor PPP será necessário configurar uma máquina cliente para discar para o número de telefone ligado ao servidor. Experimente então se conectar ao servidor fornecendo um login e uma senha de um usuário comum do servidor. Após a conexão, todos os serviços normalmente disponíveis para uma máquina conectada via rede deverão estar disponíveis também para a máquina ligada via PPP com o servidor.

Caso o servidor não atenda a chamada do cliente, verifique a configuração do mgetty e se ele foi iniciado. Se o servidor está atendendo a chamada mas não consegue completar a conexão verifique o arquivo /var/log/messages em busca de mensagens de erro.

Conexões dialout

A conexão via linha discada ainda é uma das principais formas de acesso à Internet.

Uma solução para permitir a conexão de sua intranet à Internet utilizando uma conexão discada é implementar um serviço de discagem por demanda, ou seja, sempre que for solicitado o acesso à uma máquina ou endereço fora da intranet, o servidor se encarregará de discar para o seu provedor de acesso estabelecendo e compartilhando essa conexão com a intranet.

Implementação

Pré-requisitos

Para uma instalação bem-sucedida do serviço de discagem por demanda é necessário:

  • um modem instalado e configurado;

  • que a rede local esteja configurada corretamente;

  • um servidor DNS instalado e configurado.

Instalação

Selecione para instalação com o Synaptic os pacotes:

  • ppp

  • iptables

Ou digite em um terminal o comando:

# apt-get install ppp iptables

Configuração

A configuração do serviço de discagem por demanda exige a criação e edição de alguns arquivos. Acompanhe os passo necessários:

  1. Utilizando o seu editor de texto preferido crie o arquivo /usr/bin/ppp e insira o seguinte conteúdo:

    pppd /dev/modem 38400 asyncmap 0 lock modem mtu 1500 mru 1500 
    \ crtscts noipdefault 192.168.0.1:192.168.0.100
    \ demand persist idle 600 ipcp-accept-local ipcp-accept-remote
    \ defaultroute holdoff 5 user "login" connect "/usr/bin/disca"

    Por razões estéticas, as linhas iniciadas com o "\" foram quebradas, ou seja, todo o conteúdo do arquivo está contido em uma única linha. Edite o arquivo, substituindo os itens listados a seguir:

    /dev/modem

    Esse é o arquivo de dispositivo do seu modem. Se o sistema estiver configurado adequadamente /dev/modem é um link para a porta serial onde o modem se encontra, como por exemplo /dev/ttyS2.

    38400

    Velocidade da porta serial. Utilize o valor 38400 para modens até 33.6k ou 57600 para modens de 56k.

    192.168.0.1:192.168.0.100

    O primeiro número IP deve ser preenchido com o número IP da sua máquina, enquanto o segundo número deve ser um número IP inválido qualquer, que será automaticamente substituído por um número dado pelo provedor de acesso ao se realizar a conexão.

    idle 600

    Este parâmetro indica quanto tempo, em segundos, de inatividade o servidor deve-se esperar para encerrar a conexão. O valor 600 indica um tempo de 10 minutos.

    holdoff 5

    Quanto tempo, em segundos, o servidor deve esperar antes de tentar uma nova discagem, caso a discagem anterior tenha falhado.

    persist

    Esse parâmetro permite a conexão automática.

    "login"

    Substitua essa parâmetro pelo seu login no provedor de acesso. Caso o login contenha espaços substitua-os por ponto, como por exemplo: nome.sobrenome.

  2. Crie o arquivo /usr/bin/disca e insira a seguinte linha nele:

    /usr/sbin/chat -v -f /usr/bin/provedor.chat
  3. Crie o arquivo /usr/bin/provedor.chat com o seguinte conteúdo:

    ABORT 'NO CARRIER' '' "AT&FX3" OK ATDT0,0000000 CONNECT''

    Note que as aspas duplas somente são usadas em "AT&FX3". Se a sua linha telefônica for do tipo "pulse" utilize ATDP e se for do tipo "tone" mantenha o parâmetro ATDT. Logo após esse parâmetro insira o número do telefone de acesso. Caso o seu telefone seja um ramal e seja necessário discar o "0" para pegar uma linha utilize o "0," antes do número do telefone.

  4. Altere a permissão dos arquivos recém-criados para que ele possuam permissões de escrita, leitura e execução apenas para o usuário root. Você poderá fazer isso com os comandos:

    # chmod 700 /usr/bin/ppp
    # chmod 700 /usr/bin/disca
    # chmod 700 /usr/bin/provedor.chat
  5. Edite os arquivos /etc/ppp/pap-secrets e /etc/ppp/chap-secrets, inserindo a seguinte linha:

    login * senha

    Substitua login pelo seu login no provedor de acesso (deve ser o mesmo login que você inseriu no arquivo /usr/sbin/ppp). Substitua a senha pela sua senha do provedor de acesso.

    Estes dois arquivos devem possuir permissões de escrita e leitura apenas para o usuário root. Você poderá fazer isso com os comandos:

    # chmod 600 /etc/ppp/pap-secrets
    # chmod 600 /etc/ppp/chap-secrets
  6. Para permitir que o serviço seja iniciado automaticamente insira no final do arquivo /etc/rc.d/rc.local as linhas:

    /sbin/iptables -t nat -P POSTROUTING DROP 
    /sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
    /usr/bin/ppp

    As duas linhas com o comando iptables habilitam o mascaramento de endereços (esse assunto será visto com mais detalhes na seção NAT). A última linha inicia o serviço de discagem por demanda toda vez que o sistema for reiniciado.

    Dica: Você poderá optar por iniciar o serviço manualmente ou apenas em algumas horas do dia. Para fazer isso, não insira a última linha no arquivo, em vez disso execute o comando ppp manualmente ou adicione-o ao crontab.

  7. Para permitir que o servidor faça o repasse de pacotes IP da intranet para a Internet, edite o arquivo /etc/sysctl.conf e altere a linha abaixo:

    net.ipv4.ip_forward=1

    Ela deve apresentar o valor 1. Veja mais sobre o repasse de pacotes IP na seção Roteamento.

  8. Acrescente o número IP do servidor de nomes do seu provedor de acesso à lista de repetidores do seu servidor de nomes, acessando a opção Configuração -> Rede -> Tarefas de servidor -> DNS - servidor de nomes de domínio -> Configurar -> Configurar repetidores do Linuxconf.

Após configurar o servidor será necessário configurar as máquinas clientes para que utilizem o servidor de discagem por demanda como gateway e como resolvedor de nomes.

Testando a Configuração

Após terminar a configuração do servidor inicie o serviço de discagem por demanda manualmente, digitando em um terminal o comando:

# /usr/bin/ppp

Em uma máquina cliente abra um navegador de Internet e tente acessar um endereço qualquer fora da sua rede. O servidor deverá iniciar a discagem para o seu provedor de acesso. Você poderá procurar por mensagens de erro no arquivo /var/log/messages do servidor.

Conectando redes

A criação de grandes redes de computadores é possível graças à interligação de pequenas redes de computadores. No entanto, essa divisão de redes em pequenas unidades gera a necessidade de se criar meios que permitam que essas unidades sejam capazes de se conectar e trocar informações.

Além dos meios físicos (cabos, hubs, roteadores, etc.) são necessários também os meios lógicos que permitam essa troca de informação. Serão estudados a seguir os conceitos básicos sobre roteamento, e em seguida será visto um tipo particular de roteamento chamado NAT (tradução de endereços de rede[7]).

Roteamento

Para entender melhor como funciona o processo de transmissão de um pacote de dados dentro de uma rede, pode ser feita uma analogia com o processo de uma ligação telefônica. Ao se discar o número do telefone com quem se deseja falar, a sua central telefônica verifica se o número está conectado a ela, se não estiver ela "encaminha" a sua ligação para outra central que por sua vez faz o mesmo teste, até chegar a central onde se localiza o número de destino. Os códigos de país, área e o prefixo do telefone são utilizados para determinar para qual central sua ligação deve ser encaminhada. Cada central por onde a ligação passa, além de decidir para onde encaminhar a ligação, funciona também como uma espécie de retransmissora ao receber sua ligação de uma central e repassá-la para outra.

Um processo bastante semelhante acontece em uma rede de computadores, ou seja, quando um computador tenta se comunicar com outro que não esteja diretamente ligado a ele (ou em sua sub-rede), ele deve enviar seus datagramas para uma máquina especial, ligada a duas ou mais redes e que encaminhará os datagramas para o destino. Essa máquina especial recebe o nome de gateway ou roteador, e ao processo de decidir para onde repassar os datagramas chamamos de roteamento.

A idéia básica do roteamento é a criação de regras que estabeleçam que caminho um datagrama deve tomar baseado no endereço de destino dele. Em uma máquina cliente essa regra é bastante simples: tudo que não for para a rede local deve ser enviado para a máquina gateway (essa regra é chamada rota padrão). Já em uma máquina gateway podem ser necessárias muito mais regras, principalmente se essa máquina está conectada a um grande número de redes.

Rotas estáticas e dinâmicas

Existem dois tipos de rotas que podem ser utilizadas por um roteador: rotas estáticas e dinâmicas. As rotas estáticas são explicitamente configuradas pelo administrador, enquanto que as rotas dinâmicas podem ser "aprendidas" através da utilização de um serviço especial para esse fim.

As rotas dinâmicas utilizam protocolos especiais como o RIP[8], OSPF[9] e BGP[10] para divulgar e aprender rotas. O Linux possui serviços como o routed e o Zebra, que são capazes de utilizar estes protocolos.

As rotas estáticas podem ser configuradas com o auxílio do Linuxconf, e não necessitam de nenhum serviço adicional. Será visto aqui apenas a configuração de rotas estáticas, já que a utilização de rotas dinâmicas normalmente só é necessária em redes complexas e Sistemas Autônomos (AS).

Gateway

Um gateway ou roteador funciona como uma porta de saída de uma rede; ele é um máquina equipada com duas ou mais interfaces ou dispositivos de rede e é capaz de fazer o repasse de datagramas para fora ou para dentro da rede.

Essa máquina possui diferentes números IPs associados a cada interface. O Linux é capaz de decidir automaticamente por qual interface de rede ele deve enviar datagramas baseado nos IPs de cada interface e na definição da rota padrão.

Existem alguns casos nos quais é necessário informar ao seu gateway como alcançar uma determinada rede, por exemplo, no caso dessa rede estar por trás de um outro gateway. Para esses casos especiais é necessário inserir uma rota estática para esta rede (caso não se esteja usando um serviço de rotas dinâmicas).

Implementando um gateway

Se você precisa interligar duas ou mais redes, ou ligar sua rede à Internet através de um link dedicado, será necessário o auxílio de uma máquina que funcione como gateway para a sua rede. Acompanhe o procedimento a seguir.

Pré-requisitos

Para a implementação de um gateway é necessário:

  • um servidor DNS configurado;

  • duas ou mais interfaces de rede instaladas e configuradas.

Instalação

As funções necessárias ao funcionamento de um gateway já se encontram embutidas no kernel, logo, não é necessário instalar um pacote específico, bastando apenas configurar alguns parâmetros do serviço de redes do sistema.

Configuração

Para configurar rotas estáticas, inicie o Linuxconf e acesse a opção Configuração -> Rede -> Tarefas de cliente -> Roteamento e roteadores; para definir a rota padrão, clique em Definir padrões, e uma janela como a da Figura 6-2 será mostrada:

Figura 6-2. Definindo a rota padrão

Insira o número IP da máquina para o qual devem ser enviados todos os pacotes que não atendam regras específicas de roteamento. Marque a opção Ative o roteamento para permitir que outra máquinas de sua rede utilizem sua máquina para enviar pacotes para fora da rede.

Dica: Se o seu gateway está ligado apenas a uma máquina fora de sua rede, e esta máquina é capaz de fazer roteamento, então basta definir a rota padrão, não sendo necessário definir rotas específicas para outras redes. No caso específico de se estar usando uma conexão discada, o pppd se encarrega de inserir a rota padrão para o seu provedor de acesso.

Para inserir rotas para redes específicas clique na opção Definir rotas para outras redes e em seguida no botão Adicionar. Uma janela como Figura 6-3 será mostrada:

Figura 6-3. Definindo rotas para outras redes

Insira no campo Roteador o endereço do roteador responsável pela rede em questão. No campo Destino insira o endereço IP da rede e no campo Máscara insira a máscara de rede para a qual se deseja criar a rota.

Se for necessário criar uma rota para acessar uma máquina específica utilize a opção Definir rotas para outras máquinas.

Testando a Configuração

Para testar se o roteamento está correto utilize o comando traceroute, fornecendo um número IP ou um nome de máquina. O comando irá listar as máquinas pelas quais os datagramas passam para alcançar a máquina de destino.

Netfilter

O kernel do Linux possui recursos bastante sofisticados para filtrar e transformar pacotes IP. Esses recursos, agrupados sob o nome de netfilter, podem ser configurados com o auxílio do comando iptables. O netfilter permite a construção de firewalls e de gateways com NAT (Tradução de Endereços de Rede[11]).

Serão estudados aqui os conceitos básicos do netfilter e como utilizar o recurso de NAT.

Anatomia do netfilter

O netfilter possui um conjunto de ganchos[12] em vários pontos da pilha de um protocolo (será considerado aqui somente o protocolo IPv4). Cada gancho é um ponto no caminho que um pacote IP percorre ao entrar ou sair de uma máquina, conforme a Figura 6-4:

Figura 6-4. Estrutura do netfilter

O gancho PRE-ROUTING está ligado à entrada de pacotes na máquina; após a decisão de roteamento os pacotes que não são destinados à máquina local atravessam o gancho FORWARD e finalmente saem da máquina passando pelo gancho POST-ROUTING. O gancho INPUT é atravessado pelos pacotes que chegam com destino à máquina local enquanto que o gancho OUTPUT é utilizado pelos pacotes originados na máquina local.

Para filtrar ou transformar pacotes IP, o netfilter possui estruturas chamadas tabelas, que se ligam a conjuntos de ganchos. Essas tabelas são implementadas através de módulos do kernel. Por padrão o kernel possui três tabelas: filter, nat e mangle.

Cada tabela possui regras ligadas a cada um dos ganchos usados por ela. Estas regras podem ser criadas pelo administrador, de acordo com suas necessidades (isto é, um firewall, NAT, etc.). Cada regra especifica um padrão ou critério a ser comparado com pacotes IPs e um alvo, ou o que fazer com cada pacote que casa com o padrão especificado. Os alvos podem ser ações pré-definidas de cada tabela, como por exemplo, DROP ou MASQUERADE, que, respectivamente, descartam ou mascaram um pacote, ou ainda uma outra regra.

A tabela nat, que será utilizada a seguir, está ligada aos ganchos PRE-ROUTING, POST-ROUTING e OUTPUT.

NAT

Os números IPs da Internet são finitos e cada número deve ser único. O crescimento explosivo da Internet tem transformado estes números em um recurso escasso, e para se obter um número ou conjunto de IPs válidos é necessário requisitá-los a um órgão regulador e pagar por eles. Logo, em muitos casos não se justifica construir redes locais utilizando-se números IPs válidos.

Como alternativa certos intervalos de números IPs são considerados reservados, isto é, não são utilizados na Internet, permitindo assim que eles possam ser utilizados em intranets sem problemas, ou seja, várias intranets podem utilizá-los desde que não estejam diretamente conectadas umas às outras. No entanto, isso cria um dilema: como conectar uma intranet que utiliza números IPs inválidos à Internet?

A resposta a essa pergunta é através da utilização de um roteador que possua um número IP válido e que seja capaz de fazer uma tradução de endereços de rede (NAT). Para entender melhor o que isso significa considere o seguinte cenário: uma rede local ligada à Internet através de um roteador com conexão discada. Ao se conectar na Internet, a máquina gateway recebe um número IP válido do provedor de acesso. Quando uma máquina da intranet precisa se conectar a um site (por exemplo), ela envia seus pacotes IPs com a requisição à máquina gateway, que por sua vez altera os cabeçalhos destes pacotes inserindo o número IP que ela recebeu do provedor e os envia através de sua conexão. O site responde à requisição enviando a resposta para a máquina gateway que altera novamente os cabeçalhos dos pacotes e os envia à máquina que originalmente os requisitou. Dessa forma, cada máquina da intranet se comporta como se estivesse ligada diretamente à Internet, enquanto que as várias máquinas na Internet "enxergam" apenas a sua máquina gateway.

Tipos de NAT

É possível dividir o NAT em dois tipos: o NAT de origem (SNAT) e o NAT de destino (DNAT).

O NAT de origem é quando você altera o endereço de origem de um pacote, isto é, a conexão passa a ter um outro endereço de origem. Esse tipo de NAT é sempre criado utilizando-se o gancho POSTROUTING, logo antes do pacote sair da máquina. O mascaramento (como é também conhecido) é uma forma de SNAT.

O NAT de destino se caracteriza pela alteração do endereço de destino do pacote, isto é, alterando o destino de uma conexão que passa pela máquina. Este tipo de NAT é sempre criado utilizando-se o gancho PRE-ROUTING. Balanceamento de carga, proxys transparentes e repasse de portas são tipos de DNAT.

Criando regras NAT

Tomando como ponto de partida a situação descrita na seção NAT, deseja-se criar uma regra que troque o endereço fonte do pacote IP antes dele ser enviado, logo deve-se criar uma regra que atue sobre o gancho POSTROUTING, isto é, no momento em que o pacote está prestes a sair da máquina. A tabela a ser usada é, obviamente, a tabela nat, e o alvo (o que fazer com o pacote) é MASQUERADE. A regra abaixo faz exatamente isso.

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

O parâmetro -t nat indica que será utilizada a tabela nat, o parâmetro -A POSTROUTING indica que será usado o gancho POSTROUTING e o -o ppp0 informa que a interface de saída será a interface ppp0 (modem). Finalmente o alvo é definido através do parâmetro -j MASQUERADE. Note que essa regra é específica para conexões discadas e o alvo MASQUERADE é capaz de utilizar o IP designado para sua conexão discada automaticamente. Caso você possua um link dedicado, ou simplesmente envie seus pacotes através de uma interface com um IP fixo, a regra a ser utilizada será outra outra, como por exemplo:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4

Os parâmetros iniciais são similares, no entanto, o alvo é diferente e é definido por -j SNAT --to 1.2.3.4, ou seja, o SNAT indica que será alterada a origem do pacote e o --to 1.2.3.4 é o endereço que será utilizado. Assim, todos os pacotes que deixarem a máquina através da interface eth0 terão como endereço de origem o IP 1.2.3.4. Você deve substituir o 1.2.3.4 pelo seu endereço IP válido. A seguir será visto como inserir essas regras em um script a ser carregado automaticamente.

Implementação de um serviço NAT

Um serviço de NAT é necessário em soluções como a estudada na seção Conexões Discadas, mas pode ser utilizado também como uma forma de aumentar a segurança de uma intranet, uma vez que ele "esconde" as máquinas da rede mostrando para o resto do mundo apenas a máquina gateway.

Pré-requisitos

Para uma implementação bem-sucedida deste serviço é necessário:

  • que sua rede esteja corretamente configurada;

  • uma conexão com a Internet (modem ou um link dedicado);

  • um kernel da série 2.4.x.

Instalação

Selecione para instalação com o Synaptic o pacote:

  • iptables

Ou utilize o seguinte comando:

# apt-get install iptables

Configuração

Embora seja possível inserir e remover regras dinamicamente no kernel com o comando iptables, será criado neste exemplo um pequeno script, a ser usado durante a inicialização do sistema para configurar automaticamente um serviço NAT. Acompanhe abaixo os passos necessários:

  1. Crie no diretório /etc/init.d/ um arquivo chamado iptables com o seguinte conteúdo:

    #! /bin/sh
    # description: Inicialização do iptables
    #
    # chkconfig: 2345 80 30
    # processname: iptables
    # pidfile: /var/run/iptabless.pid

    . /etc/rc.d/init.d/functions
    . /etc/sysconfig/network

    if [ ${NETWORKING} = "no" ]
    then
    exit 0
    fi

    case "$1" in
    start)
    gprintf "Iniciando o serviço de %s: " "IPtables"
    echo
    echo 1 > /proc/sys/net/ipv4/ip_forward
    /usr/sbin/iptables -t nat -P POSTROUTING DROP
    /usr/sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

    ;;

    stop)

    gprintf "Parando o serviço de %s: " "IPtables"
    echo
    /usr/sbin/iptables -F

    ;;
    *)
    gprintf "Uso: iptables (start|stop)"
    echo
    ;;
    esac

    exit 0

    O script insere as regras necessárias para o mascaramento. Os módulos do kernel são carregados automaticamente. Em seguida, forneça as permissões necessárias:

    # chmod 755 iptables

    Dica: Você poderá também inserir novas regras neste script, de acordo com as necessidades de sua rede.

  2. Acesse a opção Controle ->Painel de Controle -> Controle de atividade de serviços do Linuxconf. Selecione o serviço iptables, marque a opção Inicialização com o valor automática e na aba níveis de execução os níveis nos quais esse serviço deve ser iniciado automaticamente (tipicamente níveis 3 e 5).

Testando a configuração

O teste de configuração pode variar de acordo com as regras que você criou. Para o exemplo de mascaramento de IP para uma conexão discada, você deverá se conectar ao seu provedor e a partir de uma máquina cliente solicitar uma página web da Internet. Caso não funcione verifique se o serviço iptables foi realmente iniciado. Você poderá iniciá-lo manualmente com o comando abaixo:

# service iptables start

Verifique se a seguinte linha é mostrada com o comando lsmod:

ip_tables     10464  4 [ipt_MASQUERADE iptable_nat]

Isso mostra que o módulo está carregado e o serviço está funcionando.

Referências

Notas

[1]

Secure SHell.

[2]

Sniffers.

[3]

E para verificar assinaturas.

[4]

Point to Point Protocol.

[5]

Password Authentication Protocol.

[6]

Challenge Handshake Authentication Protocol.

[7]

Network Address Translation.

[8]

Routing Information Protocol.

[9]

Open Shortest Path First.

[10]

Border Gateway Protocol.

[11]

Network Address Translation.

[12]

Também chamados de cadeias ou chain.