15.2. Setting up Kernel PPP

Contributed by Gennady B. Sorokopud .

Before you start setting up PPP on your machine make sure that pppd is located in /usr/sbin and directory /etc/ppp exists.

pppd can work in two modes:

  1. as a ``client'', i.e. you want to connect your machine to outside world via PPP serial connection or modem line.

  2. as a ``server'', i.e. your machine is located on the network and used to connect other computers using PPP.

In both cases you will need to set up an options file (/etc/ppp/options or ~/.ppprc if you have more then one user on your machine that uses PPP).

You also will need some modem/serial software (preferably kermit) so you can dial and establish connection with remote host.

15.2.1. Working as a PPP client

I used the following /etc/ppp/options to connect to CISCO terminal server PPP line.


    crtscts         # enable hardware flow control

    modem           # modem control line

    noipdefault     # remote PPP server 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 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

To connect:

  1. Dial to the remote host using kermit (or other modem program) enter your user name and password (or whatever is needed to enable PPP on the remote host)

  2. Exit kermit (without hanging up the line).

  3. enter:

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

    Use the appropriate speed and device name.

Now your computer is connected with PPP. If the connection fails for some reasons you can add the debug option to the /etc/ppp/options file and check messages on the console to track the problem

Following /etc/ppp/pppup script will make all 3 stages automatically:


    #!/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 is kermit script that dials and makes all necessary authorization on the remote host. (Example of such script is attached to the end of this document)

Use the following /etc/ppp/pppdown script to disconnect the PPP line:


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

Check if PPP is still running (/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

Hangs up modem line (/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 ATH0\13

    echo \13

    exit

Here is an alternate method using chat instead of kermit.

Contributed by Robert Huff .

The following two files are sufficient to accomplish a pppd connection.

/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:

(This should actually go into a single line.)


    ABORT BUSY ABORT 'NO CARRIER' "" AT OK ATDT<phone.number>

      CONNECT "" TIMEOUT 10 ogin:-\\r-ogin: <login-id>

      TIMEOUT 5 sword: <password>

Once these are installed and modified correctly, all you need to do is


    # pppd

This sample based primarily on information provided by: Trev Roydhouse <Trev.Roydhouse@f401.n711.z3.fidonet.org> and used by permission.

15.2.2. Working as a PPP server

/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

Following /etc/ppp/pppserv script will enable ppp server on your machine:


    #!/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 this /etc/ppp/pppservdown script to stop ppp server:


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

Following kermit script will enable/disable autoanswer mode on your modem (/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 ATH0\13

    inp 5 OK

    echo \13

    out ATS0=1\13   ; change this to out ATS0=0\13 if you want to disable

                    ; autoanswer mod

    inp 5 OK

    echo \13

    exit

This /etc/ppp/kermit.dial script is used for dialing and authorizing on remote host. You will need to customize it for your needs. Put your login and password in this script, also you will need to change input statement depending on responses from your modem and remote host.


    ;

    ; 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 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                          ; hang up the phone

    clear                           ; Clear unread characters from input buffer

    pause 1

    echo Hanging up the phone.

    output ath0\13                  ; hayes command for on hook

    input 2 OK\13\10

    if fail goto slcmd              ; if no OK answer, put modem in command mode

    

    :sldial                         ; dial the number

    pause 1

    echo Dialing.

    output atdt9,550311\13\10               ; 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 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                    ; 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-login\13

    input 1 {Password: }

    ;

    ; put your password here:

    ;

    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:



Banner.Novgorod.Ru