CentOS(RedHat)创建PPTP客户端

2014/06/3015:45:24 1

本文将介绍以pptp方式拨入虚拟网络的VPN的方法。  

以下操作均在root用户下操作完成,并假设你的Linux系统已经安装了编译环境。  

1、下载pptp客户端  

wget http://nchc.dl.sourceforge.net/sourceforge/pptpclient/pptp-1.7.1.tar.gz

2、解压

tar zxvf pptp-1.7.1.tar.gz

3、编译和安装  

make && make install

4、编辑配置文件,设定拨号名为guozi

vim /etc/ppp/peers/guozi

内容如下:

remotename guozi

linkname guozi

ipparam guozi

pty "pptp www.hifyl.com --nolaunchpppd "

name guozi

usepeerdns

require-mppe

refuse-eap

noauth

其中,myaccount为用户名

5、编辑/etc/ppp/chap-secrets

加入用户名和帐号,这里假设myaccount的密码为mypassword
myaccount * mypassword *

6、拨号,运行以下命令

/usr/sbin/pppd call guozi logfd 1 updetach

  如果以上配置文件正确无误,则可正常拨入虚拟网管的pptp VPN网络中了,此时如果用ifconfig查看连接情况,可以看到多了一条ppp0的连接,并能正确分到IP地址了。

7、添加路由

  虽然已经拨号上来了,但此时你可能无法正常访问你的你的虚拟局域网资源了,你必需添加一条路由才行,这里假设你拨号上来的连接名为ppp0,并此你的虚拟局域网的IP段为192.168.1.0,那么,你需要加入以下命令: 

route add -net 192.168.1.0 netmask 255.255.255.0 dev ppp0

  至此,在Linux系统下以pptp方式拨入虚拟网络的VPN网络中了。下面将附上一键安装脚本pptp.sh(为了简单起见,有些不存在的目录可能没做出错处理,读者可自行添加容错代码)。

#!/bin/bash
# centos pptp client set 
# Made by Guozi QQ:411239339
pptp_server=''
pptp_user=''
pptp_pass=''
device_name=''
pwd_dir=''
function read_cfg()
{
        echo "======VPN client ======"
        while [ -z pptp_server ]
        do
            read -p "Please input your server ip; " pptp_server
        done
        echo -e "Your server ip is: pptp_server"
        while [ -z pptp_user ]
        do
            read -p "Please input your account: " pptp_user
        done
        echo -e "Your user name is: pptp_user"
        while [ -z pptp_pass ]
        do
            read -p "Please input your password; " pptp_pass
        done
        echo -e "Your password is: pptp_pass"
        read -p "Please input device name(Default eth0):" device_name
        [ -z device_name ] && device_name="eth0"
}
function test_network()
{
        echo -e "Network testing"
        ping -c 4 nchc.dl.sourceforge.net >/dev/null
        if [ ! ? = 0 ];then
                echo "Network is broken Please check your Network settings"
                exit 1
        else
                echo "Network is OK continue!"
        fi
}
function compile()
{
        if [ -d /root/pptp ]; then
                echo -e "Vpn client was installed!!!"
        else
                echo "downloading Vpn install packet......"
                mkdir /root/pptp
                cd /root/pptp
                wget http://nchc.dl.sourceforge.net/project/pptpclient/pptp/pptp-1.7.1%20\(stable\)/pptp-1.7.1.tar.gz
                echo "downloaded success"
                tar -zxvf pptp-1.7.1.tar.gz
                cd pptp-1.7.1
                make && make install
                echo "Vpn client installed success!"
        fi
        cd pwd_dir
}
function create_configure()
{
        head -n 1 /etc/ppp/peers/pptp_user | grep pptp_user >/dev/nul 2>&1
        if [ ! ? = 0 ];then
        cat  >>/etc/ppp/peers/pptp_user <<EOF
remotename pptp_user
linkname pptp_user
ipparam pptp_user
pty "pptp pptp_server --nolaunchpppd "
name pptp_user
usepeerdns
require-mppe
refuse-eap
noauth
EOF
fi
        cat /etc/ppp/chap-secrets | grep pptp_user >/dev/nul 2>&1
        if [ ! ? = 0 ];then
                echo "\"pptp_user\"  *  \"pptp_pass\"   *" >>/etc/ppp/chap-secrets
        fi
        if [ ! -f /usr/sbin/poff ];then
                cp ./pon /usr/sbin
                cp ./poff /usr/sbin/
                chmod 701 /usr/sbin/poff
        fi
}
function add_route()
{
        ip_seg=(ifconfig device_name | grep "inet addr" | awk -F: '{print 2}' | awk '{print 1}')
        ip_seg=(echo ip_seg | awk 'BEGIN{FS=".";OFS="."}{print 1,2,3,0}')
        mask=(ifconfig device_name | grep "Mask" | awk -F: '{print 4}' | awk '{print 1}')
        ifconfig ppp0  2&amp;amp;gt;&amp;amp;amp;1 | grep "RUNNING" > /dev/nul
        if [ ! ? = 0 ];then
                /usr/sbin/pppd call pptp_user logfd 1 updetach
                route add -net ip_seg netmask 255.255.255.0 dev ppp0
                sleep 1
        else
                poff > /dev/nul 2>&1
                echo -e ""
                echo -e "vpn was disconnected!!!"
                echo -e ""
        fi
}
read_cfg
test_network
compile
create_configure
#add_route

下面是用于一健拨号的脚本pon,很简单,就几行代码:

#!/bin/bash

pptp_user=$1

[ -z $pptp_user ] && echo "Example:pon user_name!" && exit 1

/usr/sbin/pppd call $pptp_user logfd 1 updetach

下面是用于断开拨号的脚本poff:

#!/bin/sh
if [ -x /usr/bin/kill ]; then
  KILL="/usr/bin/kill"
else
  KILL="/bin/kill"
fi
SIG=TERM
DONE="stopped"
MODE=""
usage ()
{
   cat &lt;&lt;!EOF!
usage: 0 [option] [provider]
options:
  -r        Cause pppd to drop the line and redial.
  -d        Toggle the state of pppd's debug option.
  -c        Cause pppd to renegotiate compression.
  -a        Stop all pppd's.  'provider' will be ignored.
  -h        Print this help summary and exit.
  -v        Print version and exit.
  none      Stop pppd.
Options may not be combined.
If 'provider' is omitted pppd will be stopped or signalled if and only if
there is exactly one running unless the '-a' option was given.  If
'provider' is supplied the pppd controlling the connection to that
provider will be stopped or signalled.
!EOF!
}
# Get option.  If there are none replace the "?" that getopts puts in
# FLAG on error with "null".
getopts rdcavh FLAG
if [ "?" -ne 0 ]; then
    FLAG="null"
fi
# Check for additional options.  Should be none.
getopts :rdcavh DUMMY
if [ "?" -eq 0 ]; then
    echo "0: Illegal option -- {OPTARG}."
    exit 1
fi
case FLAG in
 "r") SIG=HUP;  DONE=signalled; shift ;;
 "d") SIG=USR1; DONE=signalled; shift ;;
 "c") SIG=USR2; DONE=signalled; shift ;;
 "a") MODE="all"; shift ;;
 "v") echo "0Revision: 1.1 _TrickToPrint_RCS_Revision"; exit 0 ;;
 "h") usage; exit 0 ;;
 "?") exit 1;
esac
# Get the PIDs of all the pppds running.  Could also get these from
# /var/run, but pppd doesn't create .pid files until ppp is up.
PIDS=`pidof pppd`
# poff is pointless if pppd isn't running.
if test -z "PIDS"; then
    echo "0: No pppd is running.  None {DONE}."
    exit 1
fi
# Find out how many pppd's are running.
N=`echo "PIDS" | wc -w`
# If there are no arguments we can't do anything if there is more than one
# pppd running.
if test "#" -eq 0 -a "N" -gt 1 -a FLAG != "a" ; then
    echo "0: More than one pppd running and no "-a" option and 
no arguments supplied. Nothing {DONE}."
    exit 1
fi
# If either there are no arguments or '-a' was specified kill all the
# pppd's.
if test "#" -eq 0 -o "MODE" = "all" ; then
    KILL -SIG PIDS || {
        echo "0: KILL failed.  None {DONE}."
        exit 1
    }
    exit 0
fi
# There is an argument, so kill the pppd started on that provider.
PID=`ps axw | grep "[ /]pppd call 1 *\$" | awk '{print 1}'`
if test -n "PID" ; then
    KILL -SIG PID || {
        echo "0: KILL failed.  None {DONE}."
        exit 1
    }
else
   echo "0: I could not find a pppd process for provider '1'. None {DONE}."
   exit 1
fi
exit 0

使用方法:

先把上面三个脚本,分别为pptp.sh, pon  poff,创建好后,运行如下命令即可创建一个已经建立好连接的接口ppp0:

chmod a+x pptp.sh
./pptp.sh

连接的方法:

#这里假设你的连接名为guozi

pon guozi

断开拨号的方法,直接运行如下命令:

poff -a

(全文完)

  • 微信扫码赞助
  • weinxin
  • 支付宝赞助
  • weinxin

发表评论

您必须才能发表评论!

目前评论:1   其中:访客  0   博主  0   引用   1

    来自外部的引用: 1

    • melvin