18.3. Usando PPP em modo kernel

Partes originalmente contribuidas por Gennady B. Sorokopud e Robert Huff.

18.3.1. PPP em modo kernel

Antes que você inicie o ajuste do PPP na sua máquina, certifique-se de que o pppd está no diretório /usr/sbin e que o diretório /etc/ppp existe.

O pppd pode funcionar de dois modos:

  1. Como um ``cliente'' -- você quer conectar sua máquina com o mundo exterior através de uma conexão PPP serial ou de um de modem.

  2. Como um ``servidor'' -- sua máquina está localizada em uma rede e é utilizada para conectar outros computadores através de PPP.

Nos dois casos você deverá ajustar o arquivo de opções (/etc/ppp/options ou ~/.ppprc se você tem mais de um usuário na máquina que utiliza PPP).

Você irá também precisar de um software para modem/serial (preferencialmente comms/kermit), para que você possa discar e estabelecer uma conexão com a máquina remota.

18.3.2. Usando o pppd como Cliente

Baseado em informações providas por Trev Roydhouse.

O arquivo /etc/ppp/options abaixo pode ser utilizado para se conectar a um servidor PPP da Cisco.

crtscts     # ativa controle de fluxo por hardware
modem      # linha de controle do modem
noipdefault # o servidor PPP remoto deve definir um endereço IP para você
        # se a máquina remota não definir o endereço durante a 
        # negociação IPCP, remova esta opção
passive     # espera por pacotes LCP
domain ppp.foo.com      # coloque seu domínio aqui

:<remote_ip>    # ponha o endereço da máquina remota aqui
        # isso será utilizado para rotear os pacotes pelo link PPP
        # se você não especificou a opção noipdefault 
        # mude essa linha para <local_ip>:<remote_ip>

defaultroute    # coloque isso se você deseja que o servidor PPP seja
        # o seu roteador padrão

Para conectar:

  1. Disque para o host remoto usando o kermit (ou outro programa para o modem) e digite seu usuário e senha (ou o que quer que seja necessário para ativar PPP no host remoto.

  2. Saia do kermit (sem desconectar a linha).

  3. Digite o seguinte:

    # /usr/src/usr.sbin/pppd.new/pppd /dev/tty01 19200
    

    Certifique-se de usar a velocidade e o nome do dispositivo apropriados.

Agora seu computador está conectado por PPP. Se a conexão falhar, você pode adicionar a opção debug ao arquivo /etc/ppp/options e verificar as mensagens no console para diagnosticar o problema.

O script /etc/ppp/pppup abaixo irá fazer os 3 estágios automaticamente:

#!/bin/sh
ps ax |grep pppd |grep -v grep
pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
if [ "X${pid}" != "X" ] ; then
    echo 'killing pppd, PID=' ${pid}
    kill ${pid}
fi
ps ax |grep kermit |grep -v grep
pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
if [ "X${pid}" != "X" ] ; then
    echo 'killing kermit, PID=' ${pid}
    kill -9 ${pid}
fi

ifconfig ppp0 down
ifconfig ppp0 delete

kermit -y /etc/ppp/kermit.dial
pppd /dev/tty01 19200

/etc/ppp/kermit.dial é um script do kermit que disca e faz toda a autorização necessária no host remoto (um exemplo de tal script está anexado ao final deste documento).

Use o seguinte script /etc/ppp/pppdown para desconectar a linha PPP:

#!/bin/sh
pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
if [ X${pid} != "X" ] ; then
    echo 'killing pppd, PID=' ${pid}
    kill -TERM ${pid}
fi

ps ax |grep kermit |grep -v grep
pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
if [ "X${pid}" != "X" ] ; then
    echo 'killing kermit, PID=' ${pid}
    kill -9 ${pid}
fi

/sbin/ifconfig ppp0 down
/sbin/ifconfig ppp0 delete
kermit -y /etc/ppp/kermit.hup
/etc/ppp/ppptest

Verifique se o pppd está ainda executando através do comando /usr/etc/ppp/ppptest, que deverá se parecer com o seguinte:

#!/bin/sh
pid=`ps ax| grep pppd |grep -v grep|awk '{print $1;}'`
if [ X${pid} != "X" ] ; then
    echo 'pppd running: PID=' ${pid-NONE}
else
    echo 'No pppd running.'
fi
set -x
netstat -n -I ppp0
ifconfig ppp0

Para desligar, execute o /etc/ppp/kermit.hup, que deve conter:

set line /dev/tty01    ; put your modem device here
set speed 19200
set file type binary
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none

pau 1
out +++
inp 5 OK
out ATH0\13
echo \13
exit

Um método alternativo é usar o comando chat invés do kermit:

Os dois arquivos seguintes são suficientes para estabelecer uma conexão com pppd.

/etc/ppp/options:

/dev/cuaa1 115200

crtscts     # ativa controle de fluxo por hardware
modem       # linha de controle do modem
connect "/usr/bin/chat -f /etc/ppp/login.chat.script"
noipdefault     # o servidor PPP remoto deve definir um endereço IP para você
                # se a máquina remota não definir o endereço durante a
                # negociação IPCP, remova esta opção
passive         # espera por pacotes LCP
domain <your.domain>      # coloque seu domínio aqui
        # ponha o endereço da máquina remota aqui
                # isso será utilizado para rotear os pacotes pelo link PPP
                # se você não especificou a opção noipdefault
                # mude essa linha para <local_ip>:<remote_ip>

defaultroute    # coloque isso se você deseja que o servidor PPP seja
                # o seu roteador padrão

/etc/ppp/login.chat.script:

Nota: O conteúdo abaixo deve ficar em uma única linha:

ABORT BUSY ABORT 'NO CARRIER' "" AT OK ATDT<phone.number>
  CONNECT "" TIMEOUT 10 ogin:-\\r-ogin: <login-id>
  TIMEOUT 5 sword: <password>

Uma vez que eles estiverem instalados e modificados corretamente, tudo que você precisa fazer é executar o pppd da seguinte maneira:

# pppd

18.3.3. Usando o pppd como Servidor

O arquivo /etc/ppp/options deve conter algo similar ao seguinte:

crtscts             # Controle de fluxo por hardware
netmask 255.255.255.0      # máscara de rede (não requerido)
192.114.208.20:192.114.208.165  # IP's da máquina remota e local
                # IP local pode ser diferente do qual
                # você definiei para a interface ethernet
                # na sua máquina.
                # IP remoto é o endereço IP que será definido
                # para a máquina remota.
domain ppp.foo.com        # seu domínio
passive          # esperar por LCP
modem              # linha do modem

O script /etc/ppp/pppserv abaixo irá fazer com que o pppd se comporte como um servidor:

#!/bin/sh
ps ax |grep pppd |grep -v grep
pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
if [ "X${pid}" != "X" ] ; then
    echo 'killing pppd, PID=' ${pid}
    kill ${pid}
fi
ps ax |grep kermit |grep -v grep
pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
if [ "X${pid}" != "X" ] ; then
    echo 'killing kermit, PID=' ${pid}
    kill -9 ${pid}
fi

# reset ppp interface
ifconfig ppp0 down
ifconfig ppp0 delete

# enable autoanswer mode
kermit -y /etc/ppp/kermit.ans

# run ppp
pppd /dev/tty01 19200

Use o script /etc/ppp/pppservdown para para o servidor:

#!/bin/sh
ps ax |grep pppd |grep -v grep
pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'`
if [ "X${pid}" != "X" ] ; then
    echo 'killing pppd, PID=' ${pid}
    kill ${pid}
fi
ps ax |grep kermit |grep -v grep
pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'`
if [ "X${pid}" != "X" ] ; then
    echo 'killing kermit, PID=' ${pid}
    kill -9 ${pid}
fi
ifconfig ppp0 down
ifconfig ppp0 delete

kermit -y /etc/ppp/kermit.noans

O script para kermit abaixo (/etc/ppp/kermit.ans) irá ativar/desativar o modo de atendimento automático do seu modem. Ele deve se parecer com o seguinte:

set line /dev/tty01
set speed 19200
set file type binary
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none

pau 1
out +++
inp 5 OK
out ATH0\13
inp 5 OK
echo \13
out ATS0=1\13   ; mude isso para ATS0=0\13 se você quer desabilitar
        ; o modo de atendimento automático.
inp 5 OK
echo \13
exit

O script chamado /etc/ppp/kermit.dial é utilizado para discagem e autenticação na máquina remota. Você precisará customizá-lo para suas necessidades. Coloque seu usuário e senha nesse script; você também precisará mudar a indicação de entrada dependendo das respostas do seu modem e da máquina remota.

;
; ponha a linha serial a qual o modem está ligado:
;
set line /dev/tty01
;
; velocidade do modem:
;
set speed 19200
set file type binary        ; full 8 bit file xfer
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
set term bytesize 8
set command bytesize 8
set flow none
set modem hayes
set dial hangup off
set carrier auto        ; Then SET CARRIER if necessary,
set dial display on      ; Then SET DIAL if necessary,
set input echo on
set input timeout proceed
set input case ignore
def \%x 0              ; login prompt counter
goto slhup

:slcmd            ; Poe o modem em modo de comando
echo Put the modem in command mode.
clear              ; Limpa caracteres não lidos do buffer de entrada
pause 1
output +++            ; hayes escape sequence
input 1 OK\13\10        ; wait for OK
if success goto slhup
output \13
pause 1
output at\13
input 1 OK\13\10
if fail goto slcmd        ; if modem doesn't answer OK, try again

:slhup            ; desliga o telefone
clear              ; Limpa caracteres não lidos do buffer de entrada
pause 1
echo Hanging up the phone.
output ath0\13        ; hayes command for on hook
input 2 OK\13\10
if fail goto slcmd        ; se não houve resposta OK, poe o modem em modo de comando

:sldial          ; disca o número
pause 1
echo Dialing.
output atdt9,550311\13\10          ; ponha o número do telefone aqui
assign \%x 0            ; zera o contador de tempo

:look
clear              ; Limpa caracteres não lidos do buffer de entrada
increment \%x          ; Conta os segundos
input 1 {CONNECT }
if success goto sllogin
reinput 1 {NO CARRIER\13\10}
if success goto sldial
reinput 1 {NO DIALTONE\13\10}
if success goto slnodial
reinput 1 {\255}
if success goto slhup
reinput 1 {\127}
if success goto slhup
if < \%x 60 goto look
else goto slhup

:sllogin            ; login
assign \%x 0            ; Zera o contador de tempo
pause 1
echo Looking for login prompt.

:slloop
increment \%x          ; Conta os segundos
clear              ; Limpa caracteres não lidos do buffer de entrada
output \13
;
; ponha o prompt de login esperado aqui:
;
input 1 {Username: }
if success goto sluid
reinput 1 {\255}
if success goto slhup
reinput 1 {\127}
if success goto slhup
if < \%x 10 goto slloop  ; tenta 10 vezes conseguir o prompt de login
else goto slhup      ; desliga e tenta denovo se falhou 10 vezes

:sluid
;
; ponha seu usuário aqui:
;
output ppp-login\13
input 1 {Password: }
;
; ponha sua senha aqui:
;
output ppp-password\13
input 1 {Entering SLIP mode.}
echo
quit

:slnodial
echo \7No dialtone.  Check the telephone line!\7
exit 1

; local variables:
; mode: csh
; comment-start: "; "
; comment-start-skip: "; "
; end:

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.