≡ Menu

linux pptp

Debugging Linux pppd / PPTP VPN Problems

I've already written about setting up PPTP VPN client for proprietary Microsoft Point-to-Point vpn server using Linux pptp client. Learn how to troubleshoot and resolve common PPTP network connection problems.

You need to run pppd in debug mode by passing debug option. The debug option enables connection debugging facilities. If this option is given, pppd will log the contents of all control packets sent or received in a readable form. The packets are logged through syslog with facility daemon and level debug.

Step # 1: Find out location of your debug file, enter:
# grep debug /etc/syslog.conf
Sample output:

        news.none;mail.none     -/var/log/debug
#       *.=debug;*.=info;\

/var/log/debug is your debug file.
Step # 2: Start pppd with debug option, enter:
# pppd debug call office.vpn
To see debug log, enter:
# tail -f /var/log/debug
Sample output:

Jul 30 16:10:56 vivek-desktop pppd[30951]: using channel 28
Jul 30 16:10:57 vivek-desktop pppd[30951]: sent [LCP ConfReq id=0x1    ]
Jul 30 16:10:58 vivek-desktop pppd[30951]: rcvd [LCP ConfReq id=0x89     ]
Jul 30 16:10:58 vivek-desktop pppd[30951]: sent [LCP ConfAck id=0x89     ]
Jul 30 16:10:58 vivek-desktop pppd[30951]: rcvd [LCP ConfAck id=0x1    ]
Jul 30 16:10:58 vivek-desktop pppd[30951]: sent [LCP EchoReq id=0x0 magic=0xa3123563]
Jul 30 16:10:58 vivek-desktop pppd[30951]: rcvd [CHAP Challenge id=0x1 , name = ""]
Jul 30 16:10:58 vivek-desktop pppd[30951]: sent [CHAP Response id=0x1 <23962ce1340a0315661377969b543b870000000000000000f69db90c5ba79e5207ac61b073af5d732fbd6a605a7740d000>, name = "vivekgite"]
Jul 30 16:10:58 vivek-desktop pppd[30951]: rcvd [LCP EchoRep id=0x0 magic=0x61a31410]
Jul 30 16:11:07 vivek-desktop pppd[30951]: rcvd [CHAP Failure id=0x1 "E=691 R=0 M=Login incorrect"]
Jul 30 16:11:07 vivek-desktop pppd[30951]: sent [LCP TermReq id=0x2 "Failed to authenticate ourselves to peer"]
Jul 30 16:11:07 vivek-desktop pppd[30951]: rcvd [LCP TermReq id=0x8a]
Jul 30 16:11:07 vivek-desktop pppd[30951]: sent [LCP TermAck id=0x8a]
Jul 30 16:11:07 vivek-desktop pppd[30951]: rcvd [LCP TermAck id=0x8b]
Jul 30 16:11:07 vivek-desktop pppd[30951]: Script pptp offcie.vpn  --nolaunchpppd finished (pid 30952), status = 0x0

You can see my password or username failed (vpn authentication problem) to authenticate itself against the VPN server. Without debug message I won't able to solve any problem. You can fix chap authentication by editing /etc/ppp/chap-secrets file. See setting up PPTP VPN client tutorial for other debugging techniques.

With this tip you will be able to work from home using VPN and that too from Linux / FreeBSD system for the proprietary Microsoft Point-to-Point vpn server.

Different organization uses different VPN connection options such as SSL, PPTP or IPSEC. When you need to access corporate network and its services, you need to login using VPN.

The Point-to-Point Tunneling Protocol (PPTP) is a method for implementing virtual private networks. It works on Data link layer (#2 layer) on TCP/IP model. Personally I prefer IPSEC. PPTP Client is a Linux, FreeBSD, NetBSD and OpenBSD client for the proprietary Microsoft Point-to-Point Tunneling Protocol, PPTP. Allows connection to a PPTP based Virtual Private Network (VPN) as used by employers and some cable and ADSL internet service providers.

But many originations use PPTP because it is easy to use and works with Windows, Mac OS X, Linux/*BSD and other handled devices.

Compatibility note

I’ve tested instructions and pptp on:
[a] CentOS / RHEL / Fedora Core Linux running 2.6.15+ kernel
[b] Ubuntu and Debian Linux running 2.6.15+ kernel
[c] FreeBSD etc

I've found that pptp client is 100% compatible with the following servers/products:
[a] Microsoft Windows VPN Server
[b] Linux PPTP Server
[c] Cisco PIX etc

How do I install PPTP client under Linux?

By default most distro installs PPTP client called PPTP-linux which is the client for the proprietary Microsoft Point-to-Point Tunneling. Use apt-get or yum command to install pptp client:
$ sudo apt-get install pptp-linux network-manager-pptp
Fedora Core user can install client using rpm command:
# rpm -Uvh http://pptpclient.sourceforge.net/yum/stable/fc6/pptp-release-current.noarch.rpm
# yum --enablerepo=pptp-stable install pptpconfig

[a] network-manager-pptp or pptpconfig - A gui network management framework (PPTP plugin) for network-admin tool (frontend)
[b] pptp-linux - Point-to-Point Tunneling Protocol (PPTP) command line client

How do I configure client using command line (cli)?

You need to edit / create following configuration files

  • /etc/ppp/chap-secrets - Add your login name / password for authentication using CHAP. Pppd stores secrets for use in authentication in secrets files.
  • /etc/ppp/peers/myvpn-name - A dialup connection authenticated with PAP / CHAP configuration file. You need to add your dialup server name and other information in this file.

Sample configuration data

  1. PPTP server name: pptp.vpn.nixcraft.com
  2. VPN User Name : vivek
  3. VPN Password: VpnPassword
  4. Connection name: delhi-idc-01

Open /etc/ppp/chap-secrets file:
# vi /etc/ppp/chap-secrets
$ sudo vi /etc/ppp/chap-secrets
Append line as follows:
vivek PPTP VpnPassword *

Save and close the file.

Create a connection file called /etc/ppp/peers/delhi-idc-01 (replace delhi-idc-01 with your connection name such as office or vpn):
# vi /etc/ppp/peers/delhi-idc-01
Append configuration data as follows:
pty "pptp pptp.vpn.nixcraft.com --nolaunchpppd"
name vivek
remotename PPTP
file /etc/ppp/options.pptp
ipparam delhi-idc-01

Close and save the file. Where,

  • pty "pptp pptp.vpn.nixcraft.com --nolaunchpppd": Specifies that the command script is to be used to communicate rather than a specific terminal device. Pppd will allocate itself a pseudo-tty master/slave pair and use the slave as its terminal device. The script will be run in a child process with the pseudo-tty master as its standard input and output. An explicit device name may not be given if this option is used. (Note: if the record option is used in conjunction with the pty option, the child process will have pipes on its standard input and output.). In this case we are using pptp client to establishes the client side of a Virtual Private Network (VPN) using the Point-to-Point Tunneling Protocol (PPTP). pptp.vpn.nixcraft.com is my host name (or IP address) for the PPTP server. --nolaunchpppd option means do not launch pppd but use stdin as the network connection. Use this flag when including pptp as a pppd connection process using the pty option.
  • name vivek: VPN username
  • remotename PPTP: Set the assumed name of the remote system for authentication purposes to name. If you don't know name ask to network administrator
  • require-mppe-128: Require the use of MPPE, with 128-bit encryption. You must encrypt traffic using encryption.
  • file /etc/ppp/options.pptp: Read and apply all pppd options from options.pptp file. Options used by PPP when a connection is made by a PPTP client.
  • ipparam delhi-idc-01 : Provides an extra parameter to the ip-up, ip-pre-up and ip-down scripts (optional).

Route traffic via ppp0

To route traffic via PPP0 interface add following route command to /etc/ppp/ip-up.d/route-traffic
# vi /etc/ppp/ip-up.d/route-traffic
Append following sample code (modify NET an IFACE as per your requirments):
NET="" # set me
IFACE="ppp0" # set me
route add -net ${NET} dev ${IFACE}

Save and close the file:
# chmod +x /etc/ppp/ip-up.d/route-traffic

Task: connect to PPTP server

Now you need to dial out to your office VPN server. This is the most common use of pppd. This can be done with a command such as:
# pppd call delhi-idc-01
If everything is went correctly you should be online and ppp0 should be up. Remote server will assign IP address and other routing information. Here is the message from my /var/log/messages file:
# tail -f /var/log/messages

Jun 11 23:38:00 vivek-desktop pppd[30088]: pppd 2.4.4 started by root, uid 0
Jun 11 23:38:00 vivek-desktop pppd[30088]: Using interface ppp0
Jun 11 23:38:00 vivek-desktop pppd[30088]: Connect: ppp0 <--> /dev/pts/4
Jun 11 23:38:03 vivek-desktop pppd[30088]: CHAP authentication succeeded
Jun 11 23:38:03 vivek-desktop kernel: [37415.524398] PPP MPPE Compression module registered
Jun 11 23:38:03 vivek-desktop pppd[30088]: MPPE 128-bit stateless compression enabled
Jun 11 23:38:05 vivek-desktop pppd[30088]: local  IP address
Jun 11 23:38:05 vivek-desktop pppd[30088]: remote IP address

Task: Disconnect PPTP server vpn connection

Simply kill pppd service, enter:
# killall pppd
# kill {pppd-PID}

How do I configure PPTP client using GUI tools?

If you are using Debian / Ubuntu, just click on Network configuration Icon on taskbar > VPN Connection > Configure VPN > Add:

Click forward :
VPN PPTP Config # 1
(click to enlarge)

Select PPTP tunnel > Forward:
VPN PPTP Config # 2
(click to enlarge)
Enter Connection Name, VPN Server / Gateway hostname/IP address > Click on diffrent tabs to configure other parameters > Forward >
VPN PPTP Config # 3
(click to enlarge)

Save and close the dialog box. To connect via VPN click on Network Icon > Select VPN Connection > Connection name (Mumbai VSNL IDC) > Enter your VPN username and password and click on Ok
VPN PPTP Config # 4
If you are using Fedora core Linux, run pptpconfig as root and just follow on screen instructions:
# pptconfig &

Troubleshooting hints

If the connection fails, you might need to gather more information and try out following troubleshooting tips.

Q. I'm authenticated successfully but cannot route traffic..

A. Use route command to add route manually:
# ip route add {NETWORK} dev ppp0
# ip route add dev ppp0

Or use route command:
# route add -net netmask dev ppp0

Q. I'm authenticated successfully, I can ping to remote gateway but cannot access host by name...

A. Setup correct DNS server names in /etc/resolv.conf file:
# cat /etc/resolv.conf
search nixcraft.com

Q. How do I open my local network (laptop, desktop and other system) to talk with any computer behind VPN server via this local Linux ppp0 interface (i.e. act this computer as router)...?

A. Append following two rules in your existing iptables rules to turn on routing (adjust IP address range as per your setup):
iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE
iptables -I INPUT -s -i ppp0 -j ACCEPT
iptables --append FORWARD --in-interface eth0 -j ACCEPT

Q. Point-to-Point Encryption is not working and I'm not able to connect to remote PPTP server...

A. Make sure you are using 2.6.15 or above kernel. If you are using old kernel version upgrade to latest version and compile support for ppp_mppe kernel module. If you are using latest version, load driver using modprobe:
# modprobe ppp_mppe
# pppd call myoffice

Note: You can always get more information by reading pptp diagnosis howto here.

A note to readers

As I said earlier I prefer to use open source solution such as OpenVPN or IPsec as they are more secure. The PPTP is not secure enough for some information security policies. Next time I will write about OpenVPN and IPsec.

Further readings

  • Please read pppd, pptp, iptables man pages.
  • Official pptp client home page