segunda-feira, 11 de abril de 2011

Configurando o kernel

Todo o processo de mascaramento de endereço IP - NAT - é uma funcionalidade do kernel. Para que seu NAT funcione, o kernel de seu sistema deve ter os seguintes suporte: (opções configuradas na compilação):

* 1.Under General Setup Networking support Sysctl support
* 2.Under Networking Options Network packet filtering TCP/IP networking
* 3.Under Networking Options -> IP: Netfilter Configuration Connection tracking IP tables support Full NAT REDIRECT target support
* 4.Under File Systems /proc filesystem support

Estas configurações são relativas ao kernel 2.4, no kernel 2.2 há algumas modificações. Pois o kernel 2.2 utiliza do ipchains enquanto o kernel 2.4 utiliza do iptables. Ipchains e iptable são assuntos que estão tratados posteriormente.

Caso seu kernel não esteja suportando estas opções, será necessário recompilá-lo. Porém, provavelmente isto não será necessário porque na instalação básica do Linux o kernel já vem com estas configurações.

IP masquerade com o ipchains

A configuração do IP masquerade é muito simples, a configuração do IP masquerade se traduz em dois comandos:

#echo 1 > /proc/sys/net/ipv4/ip_forward

Este comando ativa o ip_forward, funcionalidade do kernel que ativa o roteamento.

hand O comando anterior já era conhecido, veja o próximo comando:

#ipchains -A forward -s 10.1.0.0/16 -d 0.0.0.0/0 -j MASQ

Estes dois comandos devem ser executados toda vez que a máquina for reiniciada. Para evitar este trabalho manual, coloque estes comandos nos scripts de inicialização do sistema, no caso do Conectiva Linux, este arquivo é o /etc/rc.d/rc.local, no caso do Slackware o arquivo é o /etc/rc.d/rc.inet1. Neste exemplo, consideramos a rede privada sendo 10.1.0.0/16 que neste caso será a origem dos pacotes.

O IP masquerade é ativado através do comando ipchains. O ipchains tem uma grande gama de configurações, pois ele pode controlar os pacotes de entrada e saída do sistema, assim o ipchains pode ser utilizado para configurar seu Linux como um filtro de pacotes. Este tipo de funcionalidade do ipchains é bastante utilizado em configurações de firewall. Aqui estaremos estudando apenas as opções apresentadas, para maiores informações veja as páginas de manual do ipchains.

hand Para listar quais regras foram definidas, execute:

ipchains -L

Vejamos agora algumas das opções suportadas pelo ipchains:

* -A : Esta opção adiciona uma nova regra de ipchains, no exemplo anterior a regra é forward.
* -s address/máscara [port[:port]] : Define a origem do pacote para o qual será aplicado a regra do ipchains. Address pode ser um endereço de host, um endereço de rede com sua respectiva máscara. Port deve ser um número ou um nome de porta do arquivo /etc/services. Se nenhum valor for passado, a regra é atribuída a todas as portas. Veja um exemplo de comando onde é definido uma faixa de porta:

#ipchains -A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 1024:65535 -i ppp0 -p 17 -j ACCEPT

Este último comando define que as regras de entrada input será atribuída a apenas as portas de 1024 a 65535. A opção -i define a interface para o qual se aplica a regra.

* -d address/máscara [port[:port]] : Define o destino do pacote para o qual será aplicado a regra do ipchains.
* -j target : Identifica o método de manipulação do pacote, define o tipo de controle do pacote. Neste caso é o MASQ, este tipo define o IP masquerade.

A configuração dos clientes é bastante simples, basta adicionar uma rota padrão nas máquinas clientes. O gateway desta rota será a máquina que está com o IP masquerade configurado. Observe que não há a necessidade de configurar o navegador do cliente.

A este ponto os clientes podem utilizar de outros serviços, não se limitando ao acesso a Internet, o cliente pode utilizar de serviços como ftp, email, ICQ, etc. Pois o mascaramento foi feito para todas as portas do sistema. Logo, a rede fica transparente em relação aos acessos dos clientes.

IP masquerade com o iptables

A finalidade do iptables é a mesma do ipchains. Obviamente, a estrutura do iptables difere do ipchains, porém explicar a forma de trabalho destes filtros de pacotes foge do objetivo deste material, para maiores informações veja um livro específico de segurança em redes.

hand No caso do iptables, antes definir suas regras é necessário carregar seu módulo correspondente.

#modprobe ip_tables

hand É necessário também ativar ip_forward.

#echo 1 > /proc/sys/net/ipv4/ip_forward

hand Agora é hora de adicionar a regra utilizando o iptables.

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

Uma consideração a ser feita é o uso da interface ppp0. Neste exemplo, estamos considerando que esta máquina tem uma conexão com a Internet através do Protocolo Ponto a Ponto, ou seja, está máquina possui uma conexão discada com a internet e quer dar acessos às demais máquinas da rede.

hand É possível verificar quais regras do iptables foram definidas, para isto execute:

#iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Proxy Transparente com o Squid.

Vimos que o IP masquerade faz com que os serviços oferecidos pelo Linux fique transparente aos seus clientes quando os mesmos estão em uma rede privada, pois não é necessário configurar o navegador [browser] do cliente. Agora observe sobre os seguintes questionamentos:

* Como utilizar o Squid e não precisar configurar o browser do cliente?
* Como utilizar o Squid e não ficar restrito aos protocolos HTTPS, HTTP, FTP e gopher?

A resposta para primeira pergunta é redirecionar a porta 80 para a porta 3128, porta onde tradicionalmente o squid trabalha. A resposta da última reside em utilizar o squid e o IP masquerade conjuntamente. Logo, surge uma nova pergunta:

Como utilizar do IP masquerade e ao mesmo tempo utilizar o Squid para o acesso a WEB?, analise a seguinte idéia: se o IP masquerade estiver rodando e o squid também, o cliente ao solicitar uma página WEB, o mesmo fará uma requisição na porta 80 do gateway onde está o IP masquerade - para isto o cliente deve estar com uma rota padrão definida cujo o gateway será o proxy -, o gateway buscará a página na Internet e entregará para o cliente utilizando o IP masquerade, logo este cliente não utilizará o Squid, pois o Squid utiliza a porta 3128. E, neste caso, nós queremos que o cliente utilize o Squid sem configurar o seu browser, pois assim você está forçando a utilização do Squid e também utilizando das funcionalidades que o squid tem. Haja visto que o IP masquerade não suporta determinadas funcionalidades que o squid comporta.

Logo, a solução é redirecionar a porta 80 para a porta 3128. Pois assim, toda requisição feita na porta 80 do servidor será direcionada para a porta 3128. Então, não será mais necessário configurar o navegador [browser] do cliente. Assim somente será necessário, no caso dos clientes, definir uma rota para o proxy assim como no exemplo anterior. Com relação ao cliente não ficar restrito ao protocolos HTTPS, HTTP, FTP e gopher, basta depois de fazer o redirecionamento de porta, fazer o IP masquerade como explicado anteriormente.

pag_395a.jpg
Fig. 7 - Ilustração do processo de redirecionamento de porta.

Nota: Ao trabalhar com proxy transparente não foi obtido sucesso com o sistema de autenticação do Squid. Por alguma razão ainda desconhecida, o squid não solicita a autenticação de usuário.

Configurando o Proxy transparente no kernel 2.2.
Os comando que se seguem são relativos ao kernel 2.2, se seu sistema utiliza o kernel 2.2, você deve seguir os comandos abaixo.

hand Primeiramente, execute:

#echo 1 > /proc/sys/net/ipv4/ip_forward

hand Bom, este comando você já conhece, vejamos os próximos:

#ipchains -A input -j REDIRECT 3128 -p tcp -d 0/0 80 -l

Este comando redireciona a porta 80 para a porta 3128, porém este atributo está relativo a apenas ao protocolo tcp - observe a opção -p. Além deste protocolo, devemos também redirecionar requisições que utilizam o protocolo udp. Vejamos o exemplo:

hand

#ipchains -A input -j REDIRECT 3128 -p udp -d 0/0 80 -l

Agora utilizaremos o IP masquerade para fazer o serviço de proxy para os demais serviços:

#ipchains -A forward -s 10.1.0.0/16 -d 0.0.0.0/0 -j MASQ -l

Depois de redirecionado as portas, é hora de habilitar o squid para aceitar este redirecionamento de porta, para isto é necessário editar o arquivo /etc/squid/squid.conf e adicionar as seguintes entradas:

hand

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

A localização destas linhas no arquivo squid.conf é diferente para cada distribuição. Portando, procure pela palavra httpd_accel dentro do arquivo, provavelmente existirá algum comentário relacionada a esta entrada. Depois de encontrada, você pode começar a adicionar as novas definições. Reinicie o squid e teste as novas configurações.

Para testar seu proxy transparente, vá até o seu primeiro cliente, adicione uma rota para o servidor proxy e, em seguinte, teste se você está tendo acesso a Internet.

Para saber se você está realmente utilizando o Squid e não o IP masquerade para ter acesso a Internet, verifique o arquivo de log do squid - obviamente depois de acessar a Internet através de um cliente.

Observe que você conseguirá também utilizar de programas como ssh, ftp, ICQ e etc...

Nota: Todos os serviços utilizarão NAT, somente o HTTP (porta 80) utilizará o proxy.

Configurando o proxy transparente no kernel 2.4

Para o kernel 2.4, o comando utilizado não é mais o ipchains, o comando que faz o trabalho de redirecionamento de portas e mascaramento da rede é o iptables.

O iptables, também chamado de netfilter, pode ser baixado do endereço http://netfilter.samba.org, e compilado e instalado na máquina local. Vejamos o comando de redirecionamento de porta utilizando o iptables:

#iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
#iptables -t nat -A PREROUTING -i eth0 -p udp --dport 80 -j REDIRECT --to-port 3128

Neste comando há duas considerações: a interface que está sendo utilizada para fazer o serviço de proxy é a eth0, ou seja, está interface é a interface de saída, ou seja, que dá acesso à outra rede; a outra consideração é relativa a porta onde o squid está escutando, neste exemplo estamos utilizando a porta padrão de comunicação do squid - porta 3128.

hand Agora devemos fazer o IP masquerade através do iptables. O comando será:

#iptables -t nat -A POSTROUTING -o -s 10.1.0.0/16 -d 0.0.0.0/0 -j MASQUERADE

Depois disto altere o arquivo squid.conf da mesma forma que mostrado no exemplo para o kernel 2.2.

Aqui termina nossa configuração do proxy, para maiores informações sobre o iptables veja o endereço http://www.linuxdoc.org/HOWTO/mini/TransparentProxy-4.html . Faça bom proveito!!!!

Utilizando o ipchains no kernel 2.4
O ipchains pode ser utilizado no kernel 2.4. Basta carregar o módulo do ipchains antes de tentar utilizá-lo. Vejamos:

hand

#modprobe ipchains

A partir deste instante você pode utilizar o ipchains no kernel 2.4.

Links indicados

* http://www.squid-cache.org - É o site oficial do Squid - Contém código-fonte e várias documentações.

* http://tldp.org/HOWTO/IP-Masquerade-HOWTO/index.html - É um como-fazer (HOWTO) de como implementar o IP masquerade (NAT).

* http://ldp-br.linuxdoc.org/documentos/comofazer/html/IPCHAINS/IPCHAINS-HOWTO.txt - É um documento como-fazer (HOWTO) que mostra como utilizar a ferramenta ipchains. Em português.

* http://squid-docs.sourceforge.net/latest/html/book1.htm - guia oficial do Squid - de autoria Oskar Person, é um guia bastante completo, englobando vários tópicos, como: instalação, configuração básica, inicialização, configuração do navegador, otimização e proxy transparente. É um documento ideal para aqueles que desejam se aprofundar no Squid. Em inglês.

* http://www.freshmeat.net - site especializado em busca de aplicativos - É um site obrigatório para administradores achar aplicativos, principalmente software livre (GPL), podendo verificar classificação, site oficial, etc.

* http://www.squid-cache.org/Doc/FAQ/FAQ.html - é o FAQ (perguntas e respostas) oficial do squid. Tem informações interessantes sobre a origem, comunicação com os navegadores, arquivos de log, gerenciamento de cache, etc.

Terminologia utilizada neste capítulo

* acl - lista de controle de acesso, utilizado para restringir o acesso ao proxy.

* Cache - é um dispositivo de armazenamento utilizado para se obter maior desempenho em operações de entrada e saída (I/O); a técnica de caching se baseia em armazenar em um cache as informações mais utilizadas, assim evita-se acessar a fonte de informação a toda solicitação de acesso. Geralmente o dispositivo usado para cache é mais veloz que a origem da informação. Por exemplo, para guardar informações mais utilizadas do disco é utilizado um cache em memória (RAM); para armazenar páginas obtidas na rede por um proxy pode-se utilizar memória RAM ou disco rígido.

* FTP - File Transfer Protocol - Protocolo utilizado para transferir arquivos em uma rede de computadores TCP/IP.

* Gopher - é um mecanismo para a recuperação de informações, é semelhante a própria Web, porém aceita somente textos - o gopher não aceita imagens.

* Hacker - Indivíduo hábil em enganar os mecanismos de segurança de sistemas de computação e conseguir acesso não autorizado aos recursos destes, geralmente a partir de uma conexão remota em uma rede de computadores.

* HTTP - HyperText? Transfer Protocol - Protocolo padrão dos servidores Web.

* HTTPS - Protocolo utilizado pelos servidores Web para implementar conexão segura. Este protocolo é implementado por SSL - Secure Socker Layer - e permite que toda transação entre o cliente e o servidor Web seja criptografado.

* ip masquerade -Mesmo que NAT, forma de compartilhamento de Internet através de manipulações no pacote TCP.

* ipchains - Também conhecida como um ferramenta de filtro de pacotes, é utilizada para configurações de firewall e NAT - IP masquerade.

* iptables - Similar ao ipchains; porém específica do kernel 2.4.

* NAT - Network Address Translation. Utilizado para transladar endereços não válidos na Internet para endereços válidos na Internet cuja finalidade é compartilhar o acesso a Internet. A ferramenta que implementa NAT é o ipchains.

* proxy - Intermediário/Procurador, tem a função de compartilhar uma conexão Internet via conexão TCP.

* proxy transparente - Intermediário transparente, configuração de proxy onde não há necessidade de configurar o navegador do cliente.

* URL - Uniform Resource Locator - Utilizado para localizar um recurso específico em uma máquina, é dividido em três partes: O protocolo, o nome da máquina e geralmente um arquivo do sistema remoto. Exemplo:http://www.sistemasabertos.com.br/bem-vindo.html.

Exercícios de Revisão

* 1. Qual a finalidade do Proxy? O Proxy Squid trabalha com quais protocolos? Explique a função de cada um destes protocolos.

* 2. Explique o funcionamento do proxy, relatando como o proxy é capaz de compartilhar seu acesso a Internet com máquinas que não possuem endereço válido na Internet.

* 3. Como implementar restrições ao meu servidor Proxy? Como eu poderia restringir acesso ao meu servidor proxy através de autenticação de usuários?

* 4. Qual é o arquivo de Log do Proxy onde posso obter informações sobre sites acessados e negados?

* 5. O que é proxy transparente? Como criar um proxy transparente? Qual a sua vantagem?

* 6. O que é NAT? Qual ferramenta pode ser utilizada para implementar o NAT? Explique a vantagem do NAT em relação ao proxy.

* 7. Como funciona o NAT(IP Masquerade)?

* 8. Como utilizar o Proxy e o IP Masquerade conjuntamente, sendo que o proxy será utilizado apenas para trabalhar com o protocolo HTTP e o IP Masquerade para trabalhar com os demais protocolos?

* 9. Qual as vantagens e as desvantagens do proxy em relação ao IP Masquerade?

* 10. Qual a diferença entre a ferramenta ipchains e iptables?

O Protocolo PPP

Este documento trata de conexões utilizando interfaces seriais através do protocolo PPP, com enfoque em conexões por linhas telefônicas, tratando aspectos de configuração tanto do cliente quanto do servidor.

pag_405a.jpg

Comunicação Serial - O Protocolo PPP
Para comunicação entre dois pontos, podemos fazer uso do protocolo PPP (Protocolo ponto-a-ponto). A forma mais simples de uso deste protocolo, é utilizando dois computadores conectados um com o outro através de um cabo ligando suas portas seriais.

Outra forma mais complexa e largamente utilizada é através de uma linha telefônica, ou seja, ligando-se cada computador de cada ponta em um modem e os modem's ligados um com outro através da linha telefônica. Cada modem tem a função de possibilitar a comunicação no meio físico (linha telefônica) que originalmente foi projetado para trafegar apenas voz, e não dados. Para se ter uma idéia do PPP, hoje o grande sucesso da Internet é uma conseqüência da bem sucedida conexão ponto a ponto - a conexão discada através de linhas telefônicas.

O protocolo SLIP também é um protocolo para comunicação serial, mas foi superado pelo PPP, uma vez que:

* permite que as pontas da conexão negociem opções como endereço IP e tamanho máximo do datagrama durante a sua inicialização;
* provê uma forma de autenticação de acesso para clientes.
* permite o encapsulamento de diversos protocolos como o IP (Internet), IPX (Novell) ou Appletalk (Apple). Isto é possível graças a um dos componentes do PPP, o protocolo NCP, que tem uma implementação específica para cada tipo de protocolo de rede. Por exemplo, para o IP, o NCP utilizado é o IPCP. (Para saber de mais detalhes, veja o documento http://www.freesoft.org/CIE/Topics/65.htm)

A pilha de protocolo PPP corresponde ao nível de enlace do modelo de referência OSI, e é composta de NCP, LCP e HDLC (para saber mais, veja o endereço http://www.cisco.com/warp/public/779/smbiz/service/knowledge/wan/ppp_auth.htm).

------------------------------------
Outros protocolos acima do nível enlace
------------------------------------
Network-Control Protocol (NCP)
------------------------------------
Link-Control Protocol (LCP)
------------------------------------
High-Level Data Link Control (HDLC)
------------------------------------
Camada Física (tal como EIA-232, V.24, V.35)
------------------------------------

Seguem a descrição de cada protocolo:

* NCP - Na verdade NCP é uma camada composta de vários NCPs, que permitem comunicar com protocolos de redes específicos
o IPCP - Internet Protocol Control Protocol - para encapsulamento do protocolo IP.
o IPXCP - Internetwork Packet Exchange Control Protocol - para encapsulamento do protocolo IPX da Novell.

* LCP - Protocolo de Controle de Conexão. O LCP negocia opções referente à conexão de dados, como por exemplo a Unidade Máxima de Transferência - MTU - que define o tamanho máximo do datagrama que uma das pontas da conexão pode suportar. O LCP também auxilia e monitora a qualidade de conexão que está estabelecida sobre a porta serial.

* HDLC - High-level Data Link - Controle de Conexões de Dados de Alto Nível. Tem como principal funções: o controle de fluxo (não permitir o fluxo de envio de dados maior que o receptor pode suportar), a correção de erros (utiliza um esquema de verificação de erros denominado CRC , geralmente de 16 a 32 bits, é análogo ao dígito verificador utilizado em CPF's) e a ordenação de informações (permitir que todos os frames de dados alcancem o receptor na ordem em que foram enviadas pelo emissor).. Para saber mais sobre o HDLC, veja http://www.freesoft.org/CIE/Topics/122.htm.

Nota: Caso você queira saber mais sobre o protocolo PPP, aconselha-se estudar os documentos referenciados na seção “Links indicados”.

Detectando e configurando o modem

pag_407a.jpg
Fig. 1 - Esquema de interação aplicação > Dispositivo > Kernel > Hardware.

Depois que o modem estiver fisicamente conectado ao computador, o próximo passo é descobrir em qual porta serial o modem foi detectado. Na maioria dos PC's, temos por padrão quatro portas seriais e estas são associadas a arquivos de dispositivos (ttyS*), com endereços de porta e IRQ padrões, conforme a tabela:

----------------------------------------------------------
nome do dispositivo Endereço da Porta IRQ
----------------------------------------------------------
/dev/ttyS0 (COM 1) 3F8 4
/dev/ttyS1 (COM 2) 2F8 3
/dev/ttyS2 (COM 3) 3E8 4
/dev/ttyS3 (COM 4) 2E8 3
----------------------------------------------------------

hand Para sabermos quais portas seriais o kernel está reconhecendo, execute:

#dmesg | grep ttyS*

hand Depois da porta ser encontrada é interessante criarmos um link simbólico padrão denominado modem apontando para o arquivo de dispositivo. Para nosso exemplo vamos considerar que o modem foi encontrado na porta ttyS2 (com3).

#ln -s /dev/ttyS2 /dev/modem

O link é interessante pelo fato de que alguns softwares, como padrão, procuram pelo link /dev/modem.

O próximo passo é configurar a porta. Se a velocidade do seu modem for menor do que 38400 e se você estiver usando um dos pares padrões de IRQ/endereço de porta serial, não há mais o que fazer. No entanto, se precisar mudar algumas definições, você pode fazê-lo com o utilitário setserial. Veremos mais à frente mais detalhadamente o uso do comando setserial.

Nota: O assunto sobre dispositivos seriais no Linux é um assunto extenso. Se o leitor quiser saber mais, visite http://ldp-br.linuxdoc.org/documentos/comofazer/html/Serial-HOWTO/Serial-HOWTO.pt_BR.html

setserial

O comando setserial tem como objetivo obter informações e configurar as portas seriais do Linux. O setserial informa sobre configurações de I/O e IRQ de uma porta serial em uso.

Durante o processo de boot, apenas as portas COM 1 a COM4 são inicializadas, estas irão usar valores padrões de I/O e IRQ. O programa setserial pode ser usado para mudar estas configurações padrões. Tipicamente o comando setserial é colocado para ser executado no arquivo /etc/rc.d/rc.local. Caso nenhum parâmetro seja especificado, o setserial irá imprimir o tipo de porta (i.e., 8250, 16450, 16550, 16550A, etc.), a porta de I/O do hardware, o IRQ, a taxa de baud, e algumas variáveis operacionais.

hand O setserial tem uma sintaxe de consulta assim:

setserial dispositivo

As seguintes opções de consulta são as mais utilizadas:

* -a : Esta opção faz com que seja mostrada todas as configurações de uma porta específica. Por exemplo, setserial -a /dev/ttyS0.
* -b : Esta opção mostra apenas as informações essenciais da configuração da porta serial. As informações mostradas são: o endereço de I/O, o número de interrupção e o tipo de UART (chip responsável pela conversão de dados em bits seriais e vice-versa). Este tipo de comando é muito utilizado na inicialização da máquina; note que é a mesma mensagem retornada pelo comando dmesg | grep tty. Veja o exemplo:

# setserial -b /dev/ttyS0
/dev/ttyS0 at 0x03f8 (irq = 4) is a 16550A

* -G : Mostra as opções utilizadas para se configurar o dispositivo serial tal como está configurado. Veja o exemplo:

# setserial -G /dev/ttyS0
/dev/ttyS0 uart 16550A port 0x03f8 irq 4 baud_base 115200 spd_normal skip_test

Note que neste exemplo, o resultado deste comando informa exatamente como este dispositivo poderia ser configurado com as configurações atuais:

#setserial /dev/ttyS0 uart 16550A port 0x03f8 irq 4 baud_base 115200 spd_normal skip_test

Através do setserial também é possível alterar as configurações para um dispositivo serial, porém a sintaxe de consulta é ligeiramente diferente (não se utilizam as opções anteriores):

setserial dispositivo .

Abaixo está explicado os principais parâmetros que podem ser utilizados pelo comando setserial:

port número_da_porta

Este parâmetro é utilizado para configurar a porta de I/O. É a área da memória RAM onde os dados serão armazenados pelo hardware. Por isso muitas vezes é também chamado de “porto”, pois é o local onde os dados são despejados e carregados.

irq número_irq

A opção irq configura o IRQ do hardware. É o número de referência que o hardware serial irá utilizar para solicitar pedidos de interrupção para a CPU. A combinação irq e o número da porta devem ser únicos para o computador. Se existirem dois dispositivos com mesmo irq e mesmo número de irq, ocorre um conflito de hardware, impedindo o funcionamento normal de um dos dispositivos. Para verificar quais são as atuais combinações das irq+portas utilizados pelos dispositivos do seu computador, você deve prestar atenção nas mensagens da BIOS de sua máquina, e listar os arquivos /proc/ioports e /proc/interrupts. Caso você não tenha uma noção boa sobre interrupções e portas I/O de hardware, procure bibliografia especializada sobre assuntos de hardware, o qual não são abordados aqui.

uart tipo_uart

Esta opção é utilizada para configurar o tipo UART. Os tipos permitidos são: 8250, 16450, 16550, 16550A, 16650, 16650V2, 16654, 16750, 16850, 16950, e 16954. Usar o tipo UART none irá desabilitar a porta. UARTs (Transmissor e Receptor Assíncrono Universal ou Universal Asynchronous Receiver Transmitter) são chips localizados na placa serial do PC (caso se utilize uma) ou na placa mãe. A função da UART pode ser executada também por chips que executam outras funções. O propósito da UART é converter dados para bits, enviá-los pela linha serial e reconstruir os dados novamente na outra extremidade da linha. UARTs lidam com dados divididos em pedaços de bytes, os quais são convenientemente o tamanho dos caracteres ASCII. Os modelos de UART ajudam no desempenho de I/O. A mais comum delas é a UART 16550A, que tem um ótimo desempenho comparados aos outros.

autoconfig

Quando está opção é ativada, o setserial fará com que o kernel estabeleça uma configuração automática para a porta serial. A porta I/O será corretamente configurada, e o kernel irá tentar determinar o tipo UART, e caso o parâmetro auto_irq esteja configurado, o Linux irá tentar automaticamente determinar o IRQ. As opções port, auto_irq e skip_test deve ser configurado separadamente, ou seja, o parâmetro autoconfig não fará as configurações automaticamente destes parâmetros.

spd_hi

Usa a velocidade de 57.6kb/s quando o programa de comunicação solicita 38.4kb/s. Esta opção é utilizada para aumentar a velocidade na conexão.

spd_vhi

Usa 115kb/s quando o programa de comunicação requer 38.4kb/s. Esta opção é utilizada para aumentar a velocidade na conexão.

spd_shi

Usa 230kb/s quando o programa de comunicação requer 38.4kb/s. Esta opção é utilizada para aumentar a velocidade na conexão.

spd_warp

Usa 460kb/s quando o programa de comunicação requer 38.4kb/s. Esta opção é utilizada para aumentar a velocidade na conexão.

spd_normal

Usa 38.4kb/s quando o programa de comunicação requer 38.4kb/s. Esta opção é utilizada para aumentar a velocidade na conexão.

#setserial -a /dev/modem

hand A saída ficará parecida com a seguinte:

/dev/modem, Line 1, UART: 16550A, Port: 0x02f8, IRQ: 3
Baud_base: 115200, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal skip_test

Esta saída nos fornece um IRQ igual a 3 e usa a porta 2F8. A taxa de BAUD é a maior velocidade disponível nesta porta serial, em particular ela é geralmente 115200. Note que não há taxa de baud - este número é atribuído quando um aplicativo abre a porta. A maioria dos programas abre a porta solicitando uma taxa de baud de 38400, mas você pode usar o setserial para configurar uma taxa maior. O seguinte comando irá configurar a porta de forma que qualquer solicitação de 38400 resultará em uma taxa de baud real de 57400:

#setserial /dev/modem spd_hi

Também é possível usar o setserial para configurar os números do IRQ e da porta. Para alterá-las use o comando setserial da seguinte forma:

#setserial /dev/modem port 0x3A8 irq 10

Comunicando com o modem

Uma vez que o seu modem estiver devidamente instalado, você pode começar a comunicar com ele através de comandos baseados em strings, que de certa maneira é nada amigável. Várias strings são padrões para todos modens, outras são proprietárias. Através de strings enviadas para o modem você pode configurar, inicializar, programar, discar (por tom ou pulso), etc; enfim controlar completamente o modem.

Existem vários utilitários para comunicação com o modem. Os mais conhecidos no Linux são o kermit e o minicom. O primeiro é totalmente em linha de comando (veja a seção de links indicados para saber mais) e o segundo é baseado em uma tela em modo caractere. Neste documento iremos somente lidar com o minicom. Para chamá-lo através da linha de comando, digite:

hand

#minicom

Se tudo estiver funcionando como planejado, o minicom abriu a porta do modem e está esperando por suas instruções. No menu do minicom vá até configuração da porta serial, esta permite alterar a configuração do dispositivo serial - por padrão o minicom estará usando o link /dev/modem.

Como é mostrado na tela inicial do minicom:

* Pressione Crtl+A e depois Z, para exibir a lista de comandos.
* Selecione o comando M para inicializar o modem.
* Clique em yes, e depois de alguns segundos, se tudo ocorre bem, você verá a mensagem de OK na tela, a partir deste momento você poderá comunicar diretamente com o modem através das strings.
* Segue abaixo um exemplo da string de discagem:
* ATDT 5232323

Esta string - ATDT - tem como parâmetro o número do telefone a ser discado. A string ATDT faz ligações multifreqüenciais (tom), suportadas em linhas digitais e analógicas; para fazer discagem decádica (pulso), suportadas em linhas analógicas use a string ATDP. Se você desejar saber mais sobre como são as strings de comunicação, veja o endereço http://www.zoltrix.com/support_html/modem/USEMODEM.HTM, que cita as strings para o modem da marca Zoltrix, mas também apresenta strings padrões.

pag_413a.jpg
Fig. 2 - Interação do usuário com modem através do minicom.

A partir deste instante, você pode até mesmo discar diretamente para o seu ISP - Provedor de Serviços Internet. Quando uma conexão é feita, a palavra "login:" aparecerá. Depois de digitado o provedor solicitará "password:". Assumindo que o ISP está esperando para fazer uma conexão ponto a ponto (PPP), você receberá uma sequência de caracteres contendo o endereço IP do ISP e o endereço que está sendo atribuído a você para esta sessão. Depois de algumas informações inúteis na tela, o ISP começa a comunicar com você seguindo o protocolo PPP, sobre o qual o minicom nada sabe. Veremos mais adiante como estabelecer uma comunicação PPP.

Nota: O minicom fornece um controle de baixo nível para o modem, porém existem outros utilitários mais amigáveis como o wvdial que é usado na linha de comando. Para interfaces gráficas existem o kppp, gnome-ppp, etc. Estes dois últimos possuem uma interface gráfica bastante amigável e são geralmente bastante adequadas para usuários finais.

PPP no Linux

Instalação do PPP

No Linux, a implementação do PPP mais popular e praticamente a única é a de autoria de Paul Mackerras, com homepage oficial em http://www.samba.org/ppp. Na distribuição conectiva, este mesmo pacote é disponibilizado em formato rpm, facilmente instalável através do comando:

hand

#rpm -i ppp*.rpm

Este pacote, além de documentação e arquivos de configuração, também instala os seguintes arquivos:

* chat - um utilitário que interage com o modem, discando através de scripts.
* pppd - o daemon ppp, que veremos a utilidade mais a seguir.

Caso você queira instalar a versão através do código-fonte do pacote oficial, leia o arquivo README.linux. A instalação básica é baseada nos comandos:

#./configure
#make
#make install

Arquitetura

Você pode utilizar o linux para discar de um modem para outro e assim estabelecer uma conexão dial-up (discar para). Assim como também é possível receber ligações de outros modens, em uma configuração denominada dial-in (receber ligações).

O Linux também utiliza um daemon denominado pppd tanto no cliente quanto no servidor, que interage com um módulo ppp (arquivo ppp.o), que por sua vez interage com o modem através do kernel. Veja o esquema:

pag_415a.jpg
Fig. 3 - Estrutura do cliente/servidor PPP.

O módulo ppp.o

Para que tenhamos acesso ao serviço PPP, temos que possuir um kernel com suporte a módulos e ter o módulo ppp.o, que é responsável pela implementação de todo a pilha de protocolo PPP no linux. Na verdade, este módulo também faz uso de outro módulo, chamado slhc, responsável pela otimização através da compactação de cabeçalhos TCP/IP (header compression).

Este módulo é obtido através dos fontes do kernel, para saber se o módulo foi criado após a compilação, liste o diretório /lib/modules//net. Por exemplo:

hand

# ls /lib/modules/2.2.17-14cl/net/ppp.o

hand Uma vez confirmado a existência do módulo, já é permitido carregar o módulo ppp.o. Para isto execute:

# modprobe ppp.o

Neste exemplo acima, apenas mostramos como verificar e testar para ver o suporte PPP de seu kernel. Na prática isto não é necessário, porque isto já é feito automaticamente quando se usa um discador.

O daemon pppd

A primeira ação que o pppd toma após a sua inicialização é negociar as diversas características da conexão com o usuário remoto usando o LCP. Depois desta primeira fase, o pppd irá então negociar os parâmetros com a outra ponta da conexão usando o IPCP, o protocolo de controle de IP. Uma vez que não especificamos qualquer endereço IP em particular para o servidor pppd, ele tentará obter o endereço da máquina local através da pesquisa junto ao servidor DNS local. Logo, ambos anunciarão o seu endereço, um para o outro. Porém, é sempre interessante que o endereço seja definido no servidor e o mesmo seja passado dinamicamente para o cliente PPP.

pag_416a.jpg
Fig. 4 - Comunicação PPP e as funções do Daemon PPPD.

Depois das considerações acima, é hora do servidor pppd preparar a camada de rede da máquina para uso da conexão PPP. Inicialmente ele configura a interface de rede PPP como uma conexão ponto a ponto, usando para isto a interface ppp0 para a primeira interface ppp ativa. Depois de configurado a interface ppp0, o servidor pppd irá, então, adicionar uma entrada na tabela de roteamento que apontará para a outra ponta da conexão, geralmente uma rota padrão definida através da opção defaultroute do pppd.

hand Para inicialização através da linha de comando devemos seguir a sintaxe do pppd que segue abaixo:

pppd [options]

* tty-device: Determina o nome do dispositivo serial no qual o protocolo PPP trabalhará.
* speed : Determina a velocidade de transmissão da porta escrita em bits por segundo
* options : Determina opções de linha de comando

Existe um enorme número de opções que podem ser passado para o pppd. Existem também arquivos que armazenam opções, segue abaixo estes arquivos:

* /etc/ppp/options: Este arquivo é usado para armazenar opções de PPP válidos para todo o sistema [system-wide]. Este arquivo sempre é pesquisado quando o pppd é inicializado. Logo, este arquivo deve ser utilizado para passar parâmetros globais, uma vez que ele pode restringir determinados privilégios de clientes.

* .ppprc: É usado para estabelecer opções PPP personalizadas, para isso ele deve ser criado no diretório pessoal do usuário. Ele permite que cada usuário tenha suas próprias configurações padrões.

* /etc/ppp/options.device : Estabelece opções PPP para um dispositivo serial específico. Por exemplo, options.ttyS1 estabelece opções PPP /dev/ttyS1

Nota: A ordem de prioridade das configurações relativa a estes arquivos é: /etc/ppp/options.device ,.ppprc e por último /etc/ppp/options.

Abaixo estão algumas das principais opções que podem ser passado para o pppd, vejamos: /dev/modem

Este será necessariamente um link para o porta de seu modem. Portanto, geralmente será um link para um dos dispositivos: /dev/ttyS0(COM1), /dev/ttyS1(COM2), /dev/ttyS2(COM3).

* 38400 : Está será a velocidade de comunicação.

* crtscts : Ativa o controle de fluxo por hardware.

* defaultroute : Adiciona um rota padrão na tabela de roteamento do kernel. O roteador padrão será a máquina da outra ponta da conexão PPP. Esta rota é retirada automaticamente quando a conexão PPP é terminada. Está opção é utilizada por padrão, para não utilizar desta funcionalidade utilize da opção nodefaultroute.

* auth : Esta opção faz com que o PPP exija autenticação.

* connect script : Ao inicializar a conexão PPP, o script específico script será executado.

* persist : Está linha faz com que o pppd tente restabelecer a conexão caso a conexão venha a cair.

* noipdefault : Define que o endereço IP local será fornecido pelo servidor PPP.

* Endereço-IP-Local:Endereço-IP-Remoto : Este parâmetro é muito utilizado no servidor para definir o endereço IP da interface PPP do servidor e para definir o endereço IP que o cliente irá obter. Neste caso o endereço IP local será o endereço do servidor PPP e o endereço remoto será o endereço IP do cliente PPP. Como o cliente irá receber o endereço IP do servidor, o cliente não deve passar o endereço IP como parâmetro e sim aguardar que o servidor atribua o endereço. Logo, é interessante que o cliente tenha a opção noipdefault apesar de não ser necessariamente.

* login : Faz com que o PPP utilize do arquivo de senhas do Linux.

Servidor PPP dial-up

Conforme já citado anteriormente, o pppd pode tanto atuar discando (dial-up) quanto recebendo ligações (dial-in). Iremos nesta seção mostrar como o pppd atua como servidor dial-up.

Configurando um Servidor PPP

hand Para configurar o pppd, basta adicionar uma linha no arquivo de inicialização /etc/rc.d/rc.local. Segue abaixo a linha que deve ser adicionada:

pppd /dev/ttyS1 115700 crtscts

Este comando inicia o daemon PPP e o conecta ao dispositivo serial ttyS1.

As opções:

* 115700: estabelece a velocidade desta linha dedicada em bps.
* crtscts
* abre o controle de fluxo de hardware Request To Send (RTS) e o Clear To Send (CTS). O controle de fluxo de hardware usa pinos RTS E CTS na interface serial para controlar o fluxo de dados.

hand Para o cliente PPP a linha de comando seria similar, com a adição da opção defaultroute, veja abaixo:

pppd /dev/ttyS1 115700 crtscts defaultroute

* defaultroute : Este parâmetro adiciona automaticamente uma rota padrão para o servidor PPP remoto. uma rota definida, esta opção é ignorada.

É importante atentarmos para o fato de que estas configurações são para servidores e cliente de linhas dedicadas. Atualmente é mais comum máquinas serem conectadas via linhas seriais dial-up. Este último tipo de configuração é mais complexo.

Inicialização do pppd dial-up

Podemos iniciar o daemon pppd através da linha de comando, porém é interessante que isto seja realizado na inicialização do sistema. Em algumas distribuições é fornecido um script para inicialização do serviço. Na verdade, a utilização de scripts é freqüente em servidores.

Em distribuições Red Hat e Conectiva temos o script que já vem pré-configurado em /etc/sysconfig/network-scripts/ifup-ppp, este script é utilizado para inicializar automaticamente o serviço. Ele é controlado através de ferramentas como o linuxconf e kppp.

Servidor dial-up sob demanda

É possível configurar o pppd para discar para um provedor sob demanda, ou seja, de acordo com a solicitação de tráfego externo a partir da rede local. Conforme o esquema:

pag_420a.jpg
Fig. 5 - Servidor Dial-Up sob demanda.

Neste esquema acima, o servidor dial-up irá discar automaticamente para um servidor dial-in quando existir alguma solicitação de uma estação da rede local. O servidor dial-up irá atuar como um roteador para as estações da rede local. Vejamos como isto pode ser feito:

* 1) Configure o servidor dial-up com as seguintes opções:

demand
idle 180

A opção demand faz com que conexão ppp seja feita sob demanda, ou seja, a conexão é automaticamente quando haver necessidade de tráfego externo pelo modem.

A opção idle configura o tempo em que o link será desconectado quando não houver mais pacotes a serem transmitidos através dele. Ou seja, se não houver mais solicitações de tráfego externo, quanto tempo ele ficará aguardando pelo próximo pacote; caso este pacote não venha antes deste intervalo, o modem é automaticamente desconectado.

* 2) Configure o servidor para realizar ipmasquerading (nat)

hand

# ipchains -A forward 10.1.0.0/16 -j MASQ

Aqui mostramos como utilizar o ipchains para realizar o NAT. Para o iptables é um comando semelhante. Neste exemplo consideramos habilitar o NAT para a rede 10.1.0.0, com máscara de sub-rede 255.255.0.0.

* 3) Habilite o roteamento

hand

# echo 1 > /proc/sys/net/ipv4/ip_forward

* 4) Configure as estações com roteador padrão o servidor ppp dial-up.

hand No Linux, você deve executar:

#route add -net 0.0.0.0/0 gw 10.1.0.1

Neste exemplo estamos considerando que o roteador padrão (a interface de rede do servidor dial-up sob demanda) tem número IP 10.1.0.1.

Caso você deseje saber mais sobre servidor dial-up sob demanda, consulte o endereço http://www.tldp.org/LDP/nag2/x7297.html#AEN7379.

Configuração de servidor Dial-In

Na configuração do servidor PPP é importante atentarmos para as suas necessidades. No lado servidor, o mesmo necessita de um modem e um processo escutando este modem, o servidor também necessita do daemon pppd. No lado cliente, o mesmo necessitará de um modem, um aplicativo para fazer discagem e, assim como no servidor, o daemon pppd também é necessário no cliente.

Configurando atendimento do modem

Para configurar o atendimento do modem, é importante relembrar alguns conceitos básicos do Unix. Lembrem-se que toda comunicação com dispositivos é realizada através de arquivos especiais de dispositivo (os arquivos do diretório /dev, lembra?). O modem não poderia ser diferente. Ele utiliza os arquivos /dev/ttyS*, onde "*", pode ser 0, 1, ... n, onde n é o número de portas serias que você possui. Cada modem deverá estar associado a uma das portas seriais de seu sistema.

Uma vez conectado os modens em cada porta serial, é necessário um aplicativo que abra o arquivo serial, "ouvindo" qualquer atividade e "respondendo" às solicitações recebidas. Este tipo de aplicativo é um tipo de tty. O termo tty na linguagem unix é um aplicativo de terminal, do qual você pode enviar e receber caracteres. Um tipo de tty apropriado para a comunicação com modem é o aplicativo mgetty.

Nota: o Unix é um sistema que tem um suporte a comunicação serial através de terminais. Hoje é mais popular o uso da Interface Gráfica com sistemas em plataforma Cliente/Servidor, porém ainda existem muitos sistemas com comunicação serial, baseados em telas em modo caractere, principalmente onde a largura de banda é limitada.

Utilizando o mgetty

Para utilizarmos o mgetty para atender uma ligação vinda de um modem, temos que ter em mente os seguintes problemas:

* Onde inicializar o mgetty?
* Qual nível de execução o mgetty será executado?
* Uma vez o mgetty atender uma ligação e esta cair, o mgetty deverá ser chamado novamente?

pag_423a.jpg
Fig. 6 - Funcionalidades mgctty.

Nota: Com esta configuração e com um cliente utilizando o minicom,este cliente terá disponível um terminal remoto através da interface serial e poderá executar comandos caso tenha uma conta de usuário na máquina remota. Em outras palavras, só é necessário utilizar o mgetty para configurar um servidor de terminal remoto através de interface serial.

Para inicializarmos o mgetty iremos utilizar o arquivo /etc/inittab, neste arquivo é definido o processo que escuta o modem. Note que o arquivo /etc/inittab é o arquivo de configuração do init - programa que inicia todos os outros processos do sistema. Cada entrada no inittab, além da primeira que define o nível de execução padrão, é uma sequência de quatro campos separados por dois-pontos. O programa que fica escutando a porta serial do modem chama-se mgetty, para que o mgetty escute o modem e abra uma sessão com a máquina remota, adicione a seguinte entrada mgetty através da linha:

md:3:respawn:/sbin/mgetty ttyS1 -D /dev/ttyS1

Neste arquivo os campos são separados por ":", segue abaixo a descrição de cada campo

* md : Define um nome de referência, deve ser único no arquivo e no máximo ter dois caracteres.
* 3 : Diz ao programa init para que o programa mgetty seja inicializado apenas no nível de execução 3 do init.
* respawn: Responde indefinidamente às solicitações. Caso uma conexão caia, este parâmetro faz com que o mgetty novamente esteja esperando por uma nova conexão.
* /sbin/mgetty ttyS1 -D /dev/ttyS1 : Este é o programa a ser chamado pelo init e, consequentemente, ser executado. Este é o programa que tem como finalidade ficar escutando o modem e atender a uma solicitação de conexão. Observe que estamos considerando que o modem foi detectado na porta /dev/ttyS1

hand O próximo passo é fazer com que o init leia novamente o seu arquivo de configuração, para isso digite:

#init q

Caso tudo ocorra bem, seu modem será inicializado e o mgetty estará esperando por uma ligação telefônica. Porém é preciso fazer com que o serviço pppd seja inicializado no servidor quando houver uma tentativa de conexão ao servidor. Há ainda a necessidade de passarmos alguns parâmetros para o pppd como por exemplo: endereço IP local da interface "ppp0", endereço IP que o cliente irá receber, etc.

Nota: Com esta configuração e com um cliente utilizando o minicom, este cliente terá disponível um terminal remoto através da interface serial e poderá executar comandos caso tenha uma conta de usuário na máquina remota. Em outras palavras, só é necessário utilizar o mgetty para configurar um servidor de terminal remoto através de interface serial. Entretanto, para configurar o servidor PPP dial up, o mgetty é apenas um pré-requisito.

Como inicializar o serviço pppd no servidor?

Para que duas máquinas comuniquem fazendo uso do protocolo PPP, o serviço do PPP deve ser ativado tanto no cliente como no servidor. No caso do cliente, o próprio discador utilizado fará esta tarefa. Já no caso do servidor existe duas maneiras:

* 1.Criar um shell para os usuários dial-up.
* 2.Utilizar do AutoPPP? do programa mgetty

pag_425a.jpg
Fig. 7 - Processo de inicialização do PPPD no Servidor.

Em ambos os casos, a finalidade desta configuração é inicializar o serviço pppd no servidor PPP.

Criando o shell para usuários PPP.

Para configurar este servidor é necessário criarmos usuários dial-up. Depois de criar o usuário edite o arquivo /etc/passwd, configurando a seguinte linha:

hand

lima:x:502:502:Joao Paulo de lima:/tmp:/etc/ppp/ppplogin

Depois que este usuário efetuar logon, através da linha acima, é direcionado para o diretório /tmp. O sistema então inicia o login shell do usuário lima. Neste caso, o login shell é o /etc/ppp/ppplogin, que atualmente é um script shell que inicia o servidor PPP, Segue abaixo um exemplo:

hand

#!/bin/sh
mesg n
stty -echo
exec /usr/sbin/pppd -detach passive crtscts modem

Este shell do usuário tem como finalidade inicializar o serviço pppd no lado do servidor, pois no lado do cliente o próprio "discador" fará esta tarefa.

Quando a sessão login for aberta, o pppd será iniciado do lado servidor, haja visto que deve haver o processo pppd ativo nos dois lados da conexão.

Não precisa necessariamente o script ser igual a este, você pode criar o seu. Neste exemplo temos:

* mesg n : Previne os usuários de enviar mensagens para este terminal com programas como o talk, write e wall.
* stty -echo : Desabilita o comando echo.
* exec : Esta instrução do shell chama outro processo, este processo que é requisitado denomina-se processo filho. Logo, verificamos que esta instrução é utilizada para iniciar o serviço pppd.

Na última linha não é necessário passar parâmetro de velocidade, na verdade, esta velocidade da linha é obtida da configuração da porta. Assim, você pode usar o script para outras portas seriais.

Abaixo encontra-se as opções que ainda não foram estudadas:

* modem : Diz ao PPP daemon para monitorar o indicador do modem Data Carrier Detect - DCD. Ao monitorar o DCD, o sistema local pode dizer se o sistema remoto deixou cair a linha. Isto é útil porque nem sempre é possível para o sistema remoto fechar gentilmente a conexão.
* passive : Diz ao pppd para esperar até que ele receba do sistema remoto um pacote de Protocolo de Controle de Link - LCP - válido. Normalmente, o PPP daemon tenta iniciar uma conexão enviando os pacotes LCP apropriados. Se ele não receber uma resposta apropriada do sistema remoto, ele deixa cair a conexão. Usar a opção passive dá tempo para o sistema remoto iniciar o PPP daemon. Com a opção passive estabelecida, o pppd mantém a linha aberta até que o sistema remoto envie um pacote LCP.
* auth : Solicita ao sistema remoto sua autenticação. Esta não é uma autenticação de nome de usuário e de senha exigida pelo login, e não substitui a segurança do login. A segurança PPP é uma segurança adicional projetada para autenticar o usuário e o computador na outra extremidade da conexão PPP.

Usando o AutoPPP? do programa mgetty

Esta forma de configuração é menos trabalhosa que a anterior. O AutoPPP? é um parâmetro do programa mgetty que tem a função de inicializar o serviço pppd toda vez que for feita uma requisição de conexão na porta serial do servidor PPP.

A primeira definição é relativa ao usuário dial-up, o shell deste usuário deve ser um shell falso, para isto edite o arquivo /etc/passwd:

hand

lima:x:502:502::/tmp:/bin/false

Novamente estamos usando o usuário lima como exemplo, logo este será o usuário dial-up.

O arquivo /etc/mgetty+sendfax/login.config

Neste arquivo procure pela entrada AutoPPP?, a linha que contém esta entrada está comentada. Vejamos o exemplo:

hand

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

hand Descomente esta linha e deixe-a da seguinte forma:

/AutoPPP/ - a_ppp /usr/sbin/pppd noauth debug

Configurando os parâmetros do pppd

Os arquivos que se seguem são arquivos de configurações do daemon pppd, ou seja, são usados para passar argumentos para o serviço pppd.

hand O arquivo /etc/ppp/options Edite este arquivo e coloque as seguintes opções:

#vi /etc/ppp/options
modem
crtscts

hand Caso você queira atribuir dinamicamente o endereço IP dos servidores de nomes para seus clientes PPP, adicione as seguintes linhas neste arquivo:

ms-dns 10.1.0.101
ms-dns 10.1.0.102

Neste exemplo estamos considerando como servidor primário a máquina 10.1.0.101 e como servidor secundário a máquina 10.1.0.102.

Como as opções já são conhecidas daremos prosseguimento à nossa configuração.

O arquivo /etc/ppp/options.ttyS1

Seguindo a nossa sequência de configuração, o próximo passo é criar o arquivo que define as opções específicas para uma porta serial. Este arquivo deve ser criado dentro do diretório /etc/ppp e deve ter o nome options e sua extensão deve ser o dispositivo serial a ser configurado. Neste exemplo devemos criar o options.ttyS1, haja visto que nosso modem foi detectado na porta /dev/ttyS1. Neste arquivo iremos definir o endereço IP que as respectivas interfaces do servidor e do cliente irão receber. Vejamos um exemplo deste arquivo:

10.3.0.50:10.3.0.51

Adicionado estes parâmetros, você garante que o cliente irá receber o endereço "10.3.0.51", enquanto o servidor ficará com o endereço "10.3.0.50". Este IP poderá ser visualizado depois que a conexão for estabelecida, para isto utilize do comando ifconfig

Pronto seu servidor PPP está configurado e pronto para receber ligações. Veja a configuração do cliente para discar para o servidor criado por você.

A este nível de configuração o seu servidor também está apto a também receber conexões de clientes Windows.

Caso você deseje saber mais sobre servidor PPP dial-in, consulte um dos endereços: http://www.swcp.com/~jgentry/pers.html ou http://www.yolinux.com/TUTORIALS/LinuxTutorialPPP-Dial-in.html.

Segurança PPP

Em conexões PPP existem dois tipos de protocolos de autenticação. O processo pelo qual uma máquina convence a outra de sua identidade é chamado de autenticação. Isto envolve o primeiro par [peer] que emite seu nome ao outro, junto com algum tipo da informação secreta que poderia somente vir do usuário autorizado. Esta autenticação tem como finalidade evitar possíveis ataques externos através das portas seriais.

O primeiro tipo de protocolo denomina-se PAP - Password Authentication Protocol - e o Challenge Handshake Authentication Protocol - CHAP. O PAP trabalha com um sistema de senhas simples, enquanto o CHAP é um sistema que usa strings criptografados e chaves secretas para a autenticação. Logo abaixo será mostrado como utilizar o método de autenticação PAP.

Autenticação PAP

pag_430a.jpg
Fig. 8 - Esquema de autenticação PPP usando PAP.

Na autenticação PAP, o cliente emite seu nome e uma senha em texto limpo para o servidor PPP, este irá fazer ou não a autenticação do cliente. Através da autenticação PAP você pode estabelecer quais usuários podem acessar o servidor PPP, pode estabelecer quais interfaces PPP (interface ppp0, ppp1, etc) podem ser inicializados do lado do servidor e ainda pode estabelecer qual endereço IP o cliente está autorizado a usar. Veja agora como utilizar desta tecnologia:

hand Edite o arquivo /etc/ppp/options e adicione a seguintes entradas:

auth
login
+pap

Nota: caso já exista definido neste arquivo a opção noauth, retire-a e adicione, como mostrado acima, a opção auth.

hand Edite o arquivo pap-secrets

lima * senhadolima 10.3.0.51

A sintaxe deste arquivo pode ser deduzida da seguinte forma:

usuario interfacePPP senhadousuario Endereço IP do cliente

Logo, observamos que o primeiro campo é o usuário autorizado, o segundo define a interface PPP que pode ser inicializada no servidor, o * permite que seja inicializada qualquer interface PPP (ppp0, ppp1, etc), o terceiro campo é a senha deste usuário e o último campo é o endereço IP que o cliente está autorizado a utilizar.

Nota: No cliente PPP também é necessário alterar o arquivo pap-secrets para que haja uma sincronia na negociação PPP, entretanto a maioria dos discadores (wvdial, kppp, etc) alteram este arquivo automaticamente.

É importante saber se o PPP exige algum tipo de autenticação. Observamos durante algumas experiências que somente é necessário autenticação quando há alguma rota definida no servidor PPP.

Configurando o Cliente dial-up PPP

Primeiramente, o usuário deve ser capaz de discar o número de telefone do servidor e executar qualquer procedimento de login necessário. Em seguida deve-se inicializar o pppd com os seguintes parâmetros:

hand

#pppd /dev/ttyS1 115700 connect "chat -v dial-server" crtscts modem defaultroute

As opções que ainda não conhecemos estão apresentadas abaixo:

* connect: Esta opção identifica o comando usado para ativar a conexão de linha serial. No exemplo, o comando está entre aspas porque contém caracteres com espaços em branco. O comando completo chat -v dial-server.
* chat: É usado para comunicar com dispositivos. A opção -v faz com que o chat anexe informações sobre possíveis defeitos através do serviço syslogd. Neste exemplo, dial-server é um script que o chat utiliza para controlar sua interação com o modem e o servidor remoto.

Fazendo conexões através do wvdial

O utilitário wvdial permite fazer conexões PPP, ou seja, através dele podemos discar para o nosso ISP e conectarmos na Internet. Um dos fatores interessantes para utilizarmos o wvdial é o fato de que inicializa automaticamente o daemon PPP. O wvdial utiliza um arquivo de configurações onde passamos configurações gerais como número de telefone, login, password, etc. Este arquivo situa-se no diretório /etc e chama-se wvdial.conf.

Existe um programa que vem junto ao pacote do wvdial que é utilizado para gerar um exemplo do arquivo /etc/wvdial.conf, este programa também detecta onde o modem está instalado.

pag_432a.jpg
Fig. 9 - Interação do wvdial com o modem e o processo de discagem.

Nota: O pppd não tem a função de discagem e quem faz isso é o wvdial, ou outro programa discador, como por exemplo o chat.

hand Vejamos um exemplo deste comando:

#wvdialconf /etc/wvdial.conf

Scanning your serial ports for a modem.

Port Scan<*1>: Ignoring ttyS0 because /dev/mouse is a link to it.
ttyS1<*1>: ATQ0 V1 E1 -- OK
ttyS1<*1>: ATQ0 V1 E1 Z -- OK
ttyS1<*1>: ATQ0 V1 E1 S0=0 -- ATQ0 V1 E1 S0=0
ttyS1<*1>: ATQ0 V1 E1 -- ATQ0 V1 E1 ttyS1<*1>: ATQ0 V1 E1 -- ATQ0 V1 E1 ttyS1<*1>: ATQ0 V1 E1 S11=55 -- ATQ0 V1 E1 S11=55
ttyS1<*1>: ATQ0 V1 E1 +FCLASS=0 -- ATQ0 V1 E1 +FCLASS=0
ttyS1<*1>: Modem Identifier: ATI -- 5601
ttyS1<*1>: Speed 2400: AT -- OK
ttyS1<*1>: Speed 4800: AT -- OK
ttyS1<*1>: Speed 9600: AT -- OK
ttyS1<*1>: Speed 19200: AT -- OK
ttyS1<*1>: Speed 38400: AT -- OK
ttyS1<*1>: Speed 57600: AT -- OK
ttyS1<*1>: Speed 115200: AT -- OK
ttyS1<*1>: Max speed is 115200; that should be safe.
ttyS1<*1>: ATQ0 V1 E1 -- OK
Port Scan<*1>: S3

Found a modem on /dev/ttyS1.
ttyS1: Speed 115200; init "ATQ0 V1 E1"

Depois de executado este comando, o wvdialconf irá gerar no arquivo algumas entradas padrões no arquivo /etc/wvdial.conf. Observe que a saída do exemplo acima indica que foi encontrado um modem na porta /dev/ttyS1.

hand Vejamos as novas definições do arquivo /etc/wvdial.conf:

[Dialer Defaults]
Modem = /dev/ttyS1
Baud = 115200
Init1 = ATZ
Init2 = ATQ0 V1 E1
; Phone =
; Username =
; Password =

A instrução entre colchetes define uma sessão, esta instrução é utilizada quando é necessário ter mais de uma conta de acesso, assim você pode definir outras sessões com outros telefones, logins, etc. No nosso exemplo só temos a sessão defaults que foi gerado pelo wvdialconf. Vamos analisar agora os parâmetros que seguem no exemplo:

* init1 e init2 : Estes parâmetros são utilizados para enviar strings para o modem, estas string tem como objetivo a inicialização do modem. Estas strings são enviadas seguindo uma numeração. Por padrão é utilizado a string ATZ para o init1.

* Dial command: É utilizado para denominar qual tipo de discagem será usado pelo modem, ATDT define discagem por tom (reconhecido somente por centrais digitais), ATDT define discagem por pulsos (reconhecido por centrais analógicas e digitais). Existe ainda a string ATX3DT que é utilizado por clientes que estão conectados a uma central telefônica privada, neste caso a discagem seria por tom, mas você poderia ainda passar a string ATX3DP para discagem em central telefônica utilizando comunicação por pulsos (analógica).

* Modem : Define a porta serial onde situa o modem instalado, neste caso optamos por um link simbólico que aponta para o arquivo de dispositivo real.

* Baud : Velocidade da porta serial modem.

* Phone : Define o número do telefone com o qual se deseja realizar a conexão.

* Username : Define o login do usuário.

* Password : Define a senha do usuário

Você pode discar de outra máquina para testar o seu servidor PPP, para isto descomente a linhas do arquivo referente ao Phone, Username, Password. Caso você for testar o servidor PPP configurado na seção Configurando o Servidor Dial-up, utilize usuário lima que nos configuramos anteriormente para ser usuário dial-up. Antes de discar você deve definir a string utilizada para a ligação, esta string deve ser escolhida de acordo com a sua linha telefônica, logo você deve adicionar no arquivo o parâmetro Dial command = ATDT por exemplo.

hand Depois de configurar o arquivo, o próximo passo é executar o wvdial:

#wvdial

Neste caso você não necessita passar parâmetro para o wvdial, pois no arquivo só existe uma sessão, a sessão [default].

hand Agora iremos criar uma nova conta de acesso no arquivo /etc/wvdial.conf, vejamos o exemplo:

[Dialer Defaults]
Modem = /dev/ttyS1
Dial command = atdt
Baud = 115200
Init1 = ATZ
Init2 = ATQ0 V1 E1
Phone = 2616617
Username = fulano
Password = senhadofulano

[Dialer isp]
Modem = /dev/ttyS1
Dial command = atdt
Baud = 115200
Init1 = ATZ
Init2 = ATQ0 V1 E1
Phone = 9999999
Username = beltrano
Password = senhadobeltrano

Observe que uma nova sessão foi definida, a sessão isp. Com esta flexibilidade, você pode ter várias contas de acesso a Internet.

hand Para discar para a conta isp basta executar:

#wvdial isp

O parâmetro isp nada mais é que a sessão definida no arquivo wvdial.conf. Em seguida, o wvdial inicializará o modem e depois o pppd, estabelecendo a conexão ppp.

Sempre que estabelecer uma conexão PPP, surgirá obviamente uma interface chamada ppp0 - primeira interface PPP ativa. É possível obter informações sobre ela através do comando ifconfig, veja abaixo:

hand

#ifconfig ppp0

A saída deste comando nos fornece o IP da máquina local e da máquina remota respectivamente. Ao efetuar uma conexão PPP, você, no momento, terá acesso apenas a máquina remota e não a toda rede a qual a máquina remota pertence, para ter acesso a esta rede, no caso de um provedor a Internet, deve-se atribuir uma rota padrão para está máquina remota. Isto é feito através do comando route. Muitos dos aplicativos, principalmente gráficos, já definem a máquina remota como o roteador padrão.

Não se esqueça que você deve ter um DNS para fazer a resolução de nomes - Veja o capítulo sobre DNS.

Existem outros aplicativos bem mais simples de serem usados. Como exemplo: linuxconf, kppp, gnome-ppp, etc. Obviamente eles não têm a mesma flexibilidade que os apresentados neste capítulo, mas para quem quer apenas uma simples conexão com a Internet, não deixa de ser uma boa opção.

Links indicados

* http://www.samba.org/ppp/index.html - Site oficial do pacote ppp - é o site oficial do pacote ppp, uma implementação do protocolo PPP, criado por Paul Mackerras. É onde você pode obter os fontes da localização oficial.
* http://www.cisco.com./univercd/cc/td/doc/cisintwk/ito_doc/ppp.htm - É um documento bem resumido de autoria da empresa CISCO, inclusive com questões de revisão no final do capítulo.
* http://www.ietf.org/rfc/rfc1661.txt - (RFC) Point to Point Protocol - rfc de alto nível técnico, uma das que descrevem como o PPP funciona.
* http://www.networksorcery.com/enp/protocol/PPP.htm - contém uma boa descrição de como é composto o protocolo PPP e uma lista bastante extensa de todos as RFCs que referenciam o PPP.
* http://www.tldp.org/HOWTO/PPP-HOWTO/index.html - Linux PPP Howto, escrito por Corwin Light-Williams e Joshua Drake - é um como-fazer bastante extenso, que informa como utilizar o PPP no Linux. Vários detalhes são abordados, inclusive sobre: o que deve estar habilitado no kernel, quais são os arquivos de configuração, principais problemas e como resolvê-los.
* http://www.tldp.org/LDP/nag2/x-087-2-ppp.html - Capítulo do livro sobre PPP do famoso livro “Network Administration Guide”, por Olaf Kirch e Terry Dawson. Esta é a segunda edição bastante melhorada desde a primeira, e é uma alternativa a mais ao Linux PPP HOWTO.
* http://www.freesoft.org/CIE/Topics/122.htm - Documento que explica o formato do frame HDLC, de como é checado erros (CRC).
* http://br.tldp.org/documentos/comofazer/html/Serial-HOWTO/Serial-HOWTO.pt_BR.html - É um como-fazer de autoria de Greg Hankins, traduzido em português pela empresa Conectiva. Explica sobre vários equipamentos seriais suportados no Linux, os programas que interagem com os dispositivos seriais e uma seção de problemas e repostas.
* http://members.tripod.com/~vkalra/hdlc.html - É um tutorial sobre HDLC, utiliza uma linguagem técnica avançada, cita alguns detalhes do protcolo e contém várias referências bibliográficas sobre HDLC.
* http://www.sangoma.com/hdlc.htm - É um tutorial sobre HDLC que utiliza uma linguagem bem simples, bem resumido e objetivo.
* http://www.columbia.edu/kermit/ - É o site oficial do kermit, um utilitário para comunicação direta com o modem, de mesma funcionalidade que o minicom, porém é totalmente por linha de comando. Foi desenvolvido e é mantido pela Universidade de Columbia, é um site que tem uma documentação muito interessante sobre o assunto.
* http://www.tldp.org/LDP/LG/issue38/gentry.html - É um artigo que trata especificamente do uso do PPP com servidor de atendimento de chamadas (dial-in).

Terminologia utilizada neste capítulo

* CHAP -Challenge Handshake Authentication Protocol - Outra forma de autenticação utilizado pelo PPP(forma mais segura que o PAP, pois utiliza de criptografia)
* Cliente PPP - Máquina que faz requisições ao servidor PPP, geralmente utiliza de um discador para este propósito
* dial-in - é o termo utilizado para o processo de recebimento de discagens.
* dial-out - ou dial-up, é o termo utilizado para o processo de discagem para provedor.
* Dispositivo de comunicação serial - qualquer dispositivo que pode ser associado uma porta serial, geralmente um modem.
* HDLC -High-level Data Link - Controle de Conexões de Dados de Alto Nível. É um protocolo de transmissão de dados utilizado na camada 2 (enlace), conforme o modelo OSI. Tem como principal funções: o controle de fluxo (não permitir o fluxo de envio de dados maior que o receptor pode suportar), a correção de erros (utiliza um esquema de verificação de erros denominado CRC , geralmente de 16 a 32 bits, é análogo ao dígito verificador utilizado em CPF's) e a ordenação de informações (permitir que todos os frames de dados alcancem o receptor na ordem em que foram enviadas pelo emissor).
* ISP - Provedor de acesso a Internet.
* LCP - Link Control Protocol - Protocolo de Controle de conexão. O LCP negocia opções referente à conexão de dados, como por exemplo a Unidade Máxima de Transferência - MTU - que define o tamanho máximo do datagrama que uma das pontas da conexão pode suportar. O LCP também auxilia emonitora a qualidade de conexão que está estabelecida sobre a porta serial.
* NCP - Network Control Protocol - Protocolo de Controle de Rede. O NCP permite comunicar com protocolos de redes específicos.
* PAP -Password Authentication Protocol -Forma padrão de autenticação utilizado pelo PPP (envia senha em texto puro)
* PPP - Protocolo Ponto-a- Ponto. Sua finalidade é viabilizar conexões TCP/IP sobre linhas seriais.
* pppd -Daemon do PPP. O daemon pppd é responsável pela negociação das conexões. A negociação inclui diversas formas de autenticação e coleta de informações.
* Servidor PPP - Denominado como a máquina que recebe requisições em porta serial, no caso servidor PPP Dial-up este irá receber as ligações.
* tty - é o termo utilizado em Linux para denominar terminais em modo caractere. Toda comunicação serial em geral é realizada através de um tty.

Exercícios de revisão

* 1.Em que situação é utilizado PPP sob demanda? Quais seriam os passos para se implementar um servidor PPP sob demanda? Quais opções deveriam ser configuradas no servidor PPP?
* 2.Suponha que você deseje discar para um provedor através do utilitário minicom. Uma vez executado o minicom e o minicom ter reconhecido o modem sem problemas, qual ou quais comandos necessários para: - discar para o seu provedor por uma linha analógica direta; - discar para o seu provedor por uma linha digital direta; - discar para um provedor por uma linha dentro de uma central telefônica digital, deve-se discar o O antes, para liberar a linha;
* 3.Por que o PPP pode ser considerado como um pilha de protocolos? Quais protocolos que o PPP se compõe? Qual a função de cada um?
* 4.O PPP daemon deve ser utilizado tanto no cliente quanto no servidor. Esta afirmação é verdadeira? Explique o porquê.
* 5.Qual é a função do mgetty em um servidor ppp? Onde ele é configurado?
* 6.Para configurar um servidor de terminal remoto o que é necessário? Qual aplicativo deve ser utilizado no cliente para acessar o servidor de terminal remoto?
* 7.Quais as diferenças entre um servidor de terminal remoto e um servidor PPP?

Sem comentários:

Enviar um comentário