23.3. PPP уровня ядра

Части документа первоначально предоставили Gennady B. Sorokopud, Robert Huff.

23.3.1. Настройка PPP уровня ядра

Перед началом настройки PPP на вашем компьютере, убедитесь, что pppd находится в /usr/sbin и каталог /etc/ppp существует.

pppd может работать в двух режимах:

  1. В качестве ''клиента'' -- когда вы хотите подключить компьютер к внешнему миру через последовательное соединение PPP или модемную линию.

  2. В качестве ''сервера'' -- когда компьютер подключен к сети и используется для подключения других компьютеров через PPP.

В обеих случаях вам потребуется настроить файл параметров (/etc/ppp/options или ~/.ppprc если на вашем компьютере более одного пользователя работают с PPP).

Вам потребуется также программа для модемных/последовательных линий (предпочтительно comms/kermit) для дозвона и установки соединения с удаленным хостом.

23.3.2. Использование pppd в качестве клиента

Основано на информации, предоставленной Trev Roydhouse.

Для подключения к линии PPP терминального сервера Cisco может использоваться следующий файл /etc/ppp/options.

crtscts  # enable hardware flow control
modem   # modem control line
noipdefault  # remote PPP server must supply your IP address
    # if the remote host does not send your IP during IPCP
    # negotiation, remove this option
passive   # wait for LCP packets
domain ppp.foo.com  # put your domain name here

:<remote_ip> # put the IP of remote PPP host here
    # it will be used to route packets via PPP link
    # if you didn't specified the noipdefault option
    # change this line to <local_ip>:<remote_ip>

defaultroute # put this if you want that PPP server will be your
    # default router

Для подключения:

  1. Дозвонитесь на удаленный хост, используя kermit (или любую другую модемную программу), и введите ваше имя пользователя и пароль (или те данные, которые требуются для установления PPP соединения с удаленным хостом).

  2. Выйдите из kermit (без обрыва соединения).

  3. Введите следующее:

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

    Убедитесь, что выбраны подходящая скорость и правильное имя устройства.

Теперь ваш компьютер подключен по PPP. Если соединение не состоялось, вы можете добавить параметр debug к файлу /etc/ppp/options, и отследить проблему по сообщениям на консоли.

Следующий скрипт /etc/ppp/pppup проведет все 3 стадии в автоматическом режиме:

#!/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 это скрипт kermit, который дозванивается до удаленного хоста и проходит необходимую авторизацию (пример такого скрипта находится в конце этого раздела).

Используйте следующий скрипт /etc/ppp/pppdown для отключения от 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

Проверьте, запущен ли еще pppd, выполнив /usr/etc/ppp/ppptest, который выглядит примерно так:

#!/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

Для обрыва соединения, выполните /etc/ppp/kermit.hup, который должен содержать:

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 ATH013
echo 13
exit

Существует альтернативный метод, использующий chat вместо kermit:

Для установления соединения pppdдостаточно двух файлов.

/etc/ppp/options:

/dev/cuaa1 115200

crtscts  # enable hardware flow control
modem  # modem control line
connect "/usr/bin/chat -f /etc/ppp/login.chat.script"
noipdefault # remote PPP serve must supply your IP address
   # if the remote host doesn't send your IP during
    # IPCP negotiation, remove this option
passive   # wait for LCP packets
domain <your.domain> # put your domain name here

:  # put the IP of remote PPP host here
   # it will be used to route packets via PPP link
    # if you didn't specified the noipdefault option
    # change this line to <local_ip>:<remote_ip>

defaultroute # put this if you want that PPP server will be
   # your default router

/etc/ppp/login.chat.script:

Замечание: Все это может быть расположено на одной строке.

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

Как только эти файлы будут созданы и отредактированы, необходимо только запустить pppd, вот так:

# pppd

23.3.3. Использование pppd в качестве сервера

/etc/ppp/options должен содержать примерно следующее:

crtscts       # Hardware flow control
netmask 255.255.255.0   # netmask (not required)
192.114.208.20:192.114.208.165 # IP's of local and remote hosts
        # local ip must be different from one
        # you assigned to the Ethernet (or other)
        # interface on your machine.
        # remote IP is IP address that will be
        # assigned to the remote machine
domain ppp.foo.com    # your domain
passive       # wait for LCP
modem       # modem line

Следующий скрипт /etc/ppp/pppserv укажет pppd работать в качестве сервера:

#!/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

Используйте этот скрипт /etc/ppp/pppservdown для остановки сервера:

#!/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

Следующий kermit скрипт (/etc/ppp/kermit.ans) включит/отключит режим ответа модема на входящие звонки. Он должен выглядеть примерно так:

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 ATH013
inp 5 OK
echo 13
out ATS0=113 ; change this to out ATS0=013 if you want to disable
    ; autoanswer mode
inp 5 OK
echo 13
exit

Скрипт, называющийся /etc/ppp/kermit.dial, используется для дозвона и аутентификации на удаленном хосте. Вам потребуется приспособить его под собственные нужды. Поместите ваш логин и пароль в этот скрипт; вам также потребуется изменить операторы input в зависимости от ответов от модема и удаленного хоста.

;
; put the com line attached to the modem here:
;
set line /dev/tty01
;
; put the modem speed here:
;
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       ; put the modem in command mode
echo Put the modem in command mode.
clear       ; Clear unread characters from input buffer
pause 1
output +++      ; hayes escape sequence
input 1 OK1310    ; wait for OK
if success goto slhup
output 13
pause 1
output at13
input 1 OK1310
if fail goto slcmd    ; if modem doesn't answer OK, try again

:slhup       ; hang up the phone
clear       ; Clear unread characters from input buffer
pause 1
echo Hanging up the phone.
output ath013     ; hayes command for on hook
input 2 OK1310
if fail goto slcmd    ; if no OK answer, put modem in command mode

:sldial       ; dial the number
pause 1
echo Dialing.
output atdt9,5503111310    ; put phone number here
assign \%x 0     ; zero the time counter

:look
clear       ; Clear unread characters from input buffer
increment \%x     ; Count the seconds
input 1 {CONNECT }
if success goto sllogin
reinput 1 {NO CARRIER1310}
if success goto sldial
reinput 1 {NO DIALTONE1310}
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     ; zero the time counter
pause 1
echo Looking for login prompt.

:slloop
increment \%x     ; Count the seconds
clear       ; Clear unread characters from input buffer
output 13
;
; put your expected login prompt here:
;
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   ; try 10 times to get a login prompt
else goto slhup     ; hang up and start again if 10 failures

:sluid
;
; put your userid here:
;
output ppp-login13
input 1 {Password: }
;
; put your password here:
;
output ppp-password13
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:

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.

Обновлено: 12.03.2015