A 10-Minute Guide for Using PPP to Connect Linux to the Internet

Having trouble connecting to the Internet? Here's an easy way to do it using PPP.

Connecting your Linux machine to the Internet with PPP is easy in most situations. In this article I show you how to configure PPP for the most common type of connection. We assume your Linux machine is a stand-alone machine that dials into an Internet Service Provider and performs an automatic login, and the Internet Service Provider allocates the IP address that your machine will use. You can find details of how to configure PPP for other situations in the PPP-HOWTO by Robert Hart. You will need the right software and a couple of pieces of information before you start. Let's get started.


First, check that you have the right software. The program that manages PPP for Linux is called pppd. The pppd program is linked very tightly with the kernel, so you must run a version of pppd that matches your kernel.

Kernel Version    pppd version
1.2.*             2.1.2d
1.3.0 -> 1.3.84   2.1.2d
1.3.84 -> 1.3.99  2.2.0f
2.0.*             2.2.0f
2.1.*             2.2.0f

Check the version of pppd and kernel that you have installed with the following commands:

$ /usr/sbin/pppd version
$ uname -a
The first command is a trick. The pppd command doesn't actually have a version option. However, the version number will appear in the error message pppd returns, since you have supplied it with a bad argument.

If the first command fails, you probably don't have PPP installed. You can obtain the latest version of the source from:


If you have installed from a distribution such as Debian, Red Hat or Slackware, the pppd program is available precompiled within those distributions. You just have to get the package and install it.

Next you must check that your kernel has PPP support. Do this by giving the command:

$ dmesg | grep -i ppp

You should see the following messages:

PPP: version 2.2.0 (dynamic channel allocation)
PPP Dynamic channel allocation code copyright 1995 Caldera, Inc.
PPP line discipline registered.
If not, PPP may have been installed as a module. Become root and try:
# insmod ppp
If that fails, you will have to rebuild your kernel with PPP support. Follow the instructions in /usr/src/linux/README, and when configuring your kernel ensure that you answer “Yes” to:
General setup  --->
        [*] Networking support
Network device support  --->
        [*] Network device support
        <*> PPP (point-to-point) support
These prompts may be different in non-2.0 kernels.

Next you must note what keystrokes you will send and what prompts you will receive to log in to your ISP. The best way to collect these is to try manually logging into your ISP using a terminal program such as minicom. Be sure to make note of the capitalization of prompts such as the “login:” prompt as this will be important later.

A typical scenario follows:

Expect      Send                 Comment
------      ----                 -------
nothing     AT&F/r               (mode reset)
OK          AT&D2&C1/r           (mode initialization)
OK          AT&D555-9999/r       (modem dialing command)

The modem dials, sends CONNECT message and then you enter userid and password as follows:

login:  username/r
password: password/r

Lastly, you must know the IP address of a nameserver so that you can configure your name resolver and use host names instead of IP addresses. Get this information from your ISP.

Configuring PPP

The pppd program can accept configuration parameters from two places. The first is from the command line, and the second is from “options” files. The arguments supplied are close to identical in either case, but the command line method can be messy. So I will describe how to configure PPP using the options files instead.

The normal location of the options file is:


The options file is a simple text file containing parameters pppd will use when it is executed—one parameter per line. The options file must be readable by whoever will execute the pppd program. In most installations this will be root, either directly or by executing pppd from a program like sudo.

If you don't have an /etc/ppp directory, as root create one using the following commands:

# mkdir /etc/ppp
# chown root:root /etc/ppp
# chmod 755 /etc/ppp

Create an /etc/ppp/options file that looks like the following example:

connect /etc/ppp/net-connect
asyncmap 0
This example assumes:
  1. You want PPP to give you diagnostic information as it runs.

  2. Your modem is connected to serial device /dev/ttyS0.

  3. You want the serial port speed to be set at 38400 bps.

  4. You want to listen to the Data Carrier Detect signal.

  5. You will use hardware (RTS/CTS) handshaking.

  6. Your dialer program is /etc/ppp/net-connect.

  7. You have a full 8 bit clean connection.

  8. By default datagrams should be sent via the PPP link.

  9. You want the PPP server that you call to assign the IP address you will use.

These are all fairly typical defaults for an ISP connection. You will have to adjust the serial device to suit where you have your modem connected and, if you are using data compression, you might want to set your serial port speed to something higher. PPP provides a means of escaping select characters, so that they do not interfere with your connection. For example, if you were running PPP over a link that would disconnect if it received a control-D character, you could ask PPP to escape that character, and it would automatically replace it with another and reverse the process at the other end. While the default is safe, it escapes a number of characters that normally don't need escaping and this will decrease the performance of your link. Since most ISPs provide 8 bit clean links you don't need to escape any characters, so we tell pppd not to, using the asyncmap option.

The pppd package includes a program called chat. The chat program is a simple program that can be used to automate the dialing procedure. The chat program also accepts arguments from the command line or from a file. Again I'll describe how to configure it from a file as this is the better method.

To make use of the chat program from within pppd, we must ensure that the connect option points to a script that calls chat. Create a script called /etc/ppp/net-connect that looks like:

/usr/sbin/chat -v -t 60 -f /etc/ppp/net-chat

This shell script will invoke the chat command with the -v, -t and -f arguments. The -v argument is useful when you are configuring pppd, as it sends verbose diagnostic messages to the system log to show you what is happening as the chat program runs. The -t 60 argument simply tells the chat program to wait 60 seconds for the expected text to arrive before timing out with an error. The -f argument tells chat the name of the file it should use to get the expect/send sequences it will use to login.

Make sure the script is readable and executable by whoever will invoke pppd. Assuming again that “whoever” is root, use the following commands:

# chmod 500 /etc/ppp/net-connect
# chown root:root /etc/ppp/net-connect

Create a chat script called /etc/ppp/net-chat that will automate the login sequence as described earlier. I will base this script on the details presented in the table.

""            AT&F\r
OK              AT&D2&C1\r
OK              ATD555-9999\r
The first two lines are special. The ABORT keyword is a special token that allows you to specify strings of characters that will cause the chat program to exit. In the example presented, if the chat program receives either the string "BUSY" or the string "NO CARRIER" then it will abort immediately. The rest of the file is a simple list of expect/send pairs, based on the information we gathered when we manually logged in. The above example reads in full:

ABORT the script if we receive "BUSY" or "NO CARRIER". Expect nothing, then send AT&F< carriage-return> to reset the modem to factory configuration, expect to receive OK then send AT&D2&C1<carriage-return>, then expect OK and send ATD555-9999<carriage-return>, then expect login: and send username<carriage-return>, then expect sword: and send password<carriage-return>, and then exit normally.

There are a couple of important points to note in this example. First, the modem initialization string I've suggested will, in most modems, ensure that the modem will raise the Data Carrier Detect line when a call is connected, and will hang up the call if the DTR line is lowered. This ensures that the modem is matched with the modem option supplied to pppd. Second, I haven't used the full prompt, but only the last few characters. This is generally good practice because under some circumstances the first characters from a line may be dropped. Looking only for the last few characters ensures our login succeeds even if this occurs. Finally, you will notice the <carriage-return> is coded as \r. There are a range of other characters may be encoded and sent in this way, if necessary. The chat man page explains what they are should you need to use them.

Finally, we must ensure this script is readable by whoever will invoke pppd. Again assuming that whoever is be root, you can use the following commands:

# chown root:root /etc/ppp/net-chat
# chmod 600 /etc/ppp/net-chat


Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

regarding GPRS modem connection and ppp link

Anonymous's picture

Dear Sir,

I am able to establish a ppp connection through modem but when i kiil the process then i am not able to reconnect .

I am havingppp-on entry in the inittab file aslo. all options are set correct. Modem doesnot process AT commands untill hard reseted i.e power downing the modem.

Any help & suggestions would be highly appreciated.