> Linux服务器 > VPN >

Linux下架设PPTP VPN服务器

1.2实现过程及功能特性

    首先编译内核,以加入对mppe和mppc的支持,然后架设PPTP VPN服务器,实现终结用户VPN拨号的功能。

    linux服务器IP地址:192.168.1.251

    windows客户IP地址:192.168.1.55

    2编译内核

    2.1.1

    MPPE:Microsoft Point-to-Point Encryption,微软的点对点加密协议,可以对在点对点链路上传输的数据包进行加密,详细介绍请见RFC3078和RFC3079。

    MPPC:Microsoft Point-to-Point Compression,微软的点对点压缩协议,可以对在点对点链路上传输的数据包进行压缩,详细介绍请见RFC21189。

    我们需要编译内核及PPP,从而使它们都能够支持MPPE和MPPC。

    2.1.2

    DO  Remember that : use IE brower "Save as " to download kernel patch!

    安装CentOS5.2时采用自定义软件,然后选中“based”并取消其它全部选定,进行基本安装。安装完成进入系统,首先安装GCC。

    [root@mm CentOS]# rpm -ivhU kernel-headers-2.6.18-92.el5.i386.rpm

    [root@mm CentOS]# rpm -ivhU glibc-headers-2.5-24.i386.rpm

    [root@mm CentOS]# rpm -ivhU glibc-devel-2.5-24.i386.rpm

    [root@mm CentOS]# rpm -ivhU libgomp-4.1.2-42.el5.i386.rpm

    [root@mm CentOS]# rpm -ivhU cpp-4.1.2-42.el5.i386.rpm

    [root@mm CentOS]# rpm -ivhU gcc-4.1.2-42.el5.i386.rpm

    查看一下:

    [root@mm CentOS]# gcc -v

    Using built-in specs.

    Target: i386-redhat-linux

    Thread model: posix

    gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)

    再查看当前内核版本:

    [root@mm CentOS]# uname -r

    2.6.18-92.el5

    还需要安装如下RPM包,这个包是在#make menuconfig 时必需的,否则报错:

    [root@mm CentOS]# rpm -ivhU ncurses-devel-5.5-24.20060715.i386.rpm

    2.1.3

    下面开始编译内核:

    [root@mm kernel]# tar zxvf linux-2.6.19.tar.gz

    [root@mm kernel]# ln -s /home/kernel/linux-2.6.19 /usr/src/linux

    [root@mm kernel]# cd /usr/src/linux/

    下面的命令给内核打补丁

    [root@mm linux]# bzcat /home/kernel/linux-2.6.19-mppe-mppc-1.3.patch.bz2 | patch -p1

    还需要修改如下文件,否则编译时出错:

    [root@mm linux]# vi scripts/kconfig/mconf.c

    将static struct menu *current_menu;这一行注释掉,

    并添加struct menu *current_menu;如下:

    //static struct menu *current_menu;

    struct menu *current_menu;

    把以前的配置文件拷贝到当前内核目录,以继承原有配置:

    [root@mm linux]# cp /boot/config-2.6.18-92.el5 ./.config

    [root@mm linux]# make mrproper   @@@删除不必要的文件和目录,初次编译内核不需要

    [root@mm linux]# make clean       @@@删除不必要的模块和文件

    [root@mm linux]# make menuconfig  @@@基于文本选单的配置界面,字符终端下推荐使用

    选择相应的配置时,有三种选择,它们分别代表的含义如下:

    Y--将该功能编译进内核

    N--不将该功能编译进内核

    M--将该功能编译成可以在需要时动态插入到内核中的模块

    1.Go to “Load an Alternate Configuration File” and choose “。config”

    2.Go to “General setup” select “Local version …” and input “-default”

    3.Go to “Device Drivers  --->”  “Network device support  --->”

    然后以模块形式选中如下两项:

    <M>  PPP BSD-Compress compression

    <M>  Microsoft PPP compression/encryption (MPPC/MPPE)

    然后保存退出内核配置模式。

    [root@mm linux]# make dep          @@@链接程序代码和函数库

    [root@mm linux]# make bzImage      @@@开始编译系统内核,此步大约需要25分钟

    [root@mm linux]# make modules      @@@开始编译外挂模块,此步大约需要1个小时

    [root@mm linux]# make modules_install@@@安装编译完成的模块

    [root@mm linux]# make install        @@@将刚才编译完成的内核安装到系统里面

    编译内核完成后,用新内核启动,然后进入系统,查看如下:

    [root@mm pppoe]# modprobe -l | grep mppe

    /lib/modules/2.6.19-default/kernel/drivers/net/ppp_mppe_mppc.ko

    可以看到ppp_mppe_mppc.ko模块已经被编译了。

    #lsmod 却看不到ppp_mppe_mppc ,说明该模块还没有被内核挂载,我们手动挂载:

    #modprobe ppp_mppe_mppc

    再次用#lsmod查看 ,已经成功被内核挂载了

    只有当ppp_mppe_mppc模块被挂载到内核以后,PPPOE服务器才能够支持mppc、mppe(压缩及加密功能)。

    将模块添加为自启动:

    因为我们是以模块方式来安装补丁的,所以每次系统启动时都需要加载模块才行,因此我们要在/etc/rc.d/rc.local里面写入一行:

    /sbin/modprobe ppp_mppe_mppc

    3 架设PPTP-VPN服务器 3.1查看是否有/dev/ppp 设备文件,这是ppp拨号所必需的。

    若没有则如下创建一个:

    # mknod --mode=664 /dev/ppp c 108 0

    3.2确保 /etc/modules.conf 里面有如下几行:

    alias char-major-108 ppp_generic

    alias tty-ldisc-3 ppp_async

    alias tty-ldisc-13 n_hdlc

    alias tty-ldisc-14 ppp_synctty

    alias net-pf-24 pppoe

    alias ppp-compress-18 ppp_mppe_mppc

    3.3安装 ppp-2.4.3.tar.gz

    解压缩之后,打上ppp-2.4.3-mppe-mppc-1.1.patch.gz 补丁,然后编译安装:

    # tar zxvf php-2.4.3.tar.gz

    # patch -p0 -i ppp-2.4.3-mppe-mppc-1.1.patch.gz

    # cd ppp-2.4.3

    # ./configure --prefix=/usr/local/ppp

    # make

    # make install

    # cp /usr/local/ppp/sbin/pppd /usr/sbin/pppd

    3.4安装pptpd

    # tar zxvf pptpd-1.3.4.tar.gz

    # cd pptpd-1.3.4

    # ./configure

    # make

    # make install

    3.5 配置文件:

    将pptpd-1.3.4/samples/下的文件

    pptpd.conf 拷贝至/etc下

    chap-secrets 拷贝至/etc/ppp下

    options.pptpd 拷贝至/etc/ppp下

    3.5.1 配置文件/etc/pptpd.conf

    它是Poptop的配置文件

    # cp  /home/pptp-vpn/pptpd-1.3.4/samples/pptpd.conf /etc/pptpd.conf

    #vi  /etc/pptpd.conf

    内容修改如下:

    ppp /usr/sbin/pppd

    option /etc/ppp/options.pptpd

    debug

    Logwtmp

    localip  192.168.1.251  //实际的VPN服务器该IP地址总为一个公网地址,除非采用了NAT

remoteip 172.17.0.1-254

    netmask 255.255.255.0  //指定子网掩码,不过我配置上好像没作用,仍然是32位掩码

    3.5.2 配置文件/etc/ppp/options.pptpd,

    它是Poptop的选项文件

    # cp /home/pptp-vpn/pptpd-1.3.4/samples/options.pptpd /etc/ppp/options.pptpd

    # vi /etc/ppp/options.pptpd

    内容修改如下:

    name pptpd

    refuse-pap

    refuse-chap

    refuse-mschap

    require-mschap-v2

    mppe required

    #require-mppe-128

    ms-dns 10.0.0.1

    ms-dns 10.0.0.2

    proxyarp

    lock

    # Disable BSD-Compress compression

    #nobsdcomp

    nologfd

    3.5.3 配置文件/etc/ppp/chap-secrets

    它是Poptop的账号、密码文件

    #vi  /etc/ppp/chap-secrets

    如下添加用户:

    # Secrets for authentication using CHAP

    # client        server     secret                IP addresses

    test1          *       test1                     *

    pptptest1     pptpd    pptptest1                10.10.20.55

    pptptest2     pptpd    pptptest2                   *

    其中IP地址这一列,我们可以为特定用户手工指定特定IP。

    如果没有指定,为“*”,那么PPTP VPN服务器从/etc/pptp.conf文件中我们设定的remoteip中选择一个分配给客户端。

    3.6 开启IP转发并挂载pptp服务所需的相应内核模块

    #echo  1  > /proc/sys/net/ipv4/ip_forward

    #/sbin/depmod -a

    #/sbin/modprobe ip_tables

    #/sbin/modprobe iptable_nat

    #/sbin/modprobe ipt_LOG

    【知识】

    depmod 命令用来创建模块依赖关系的列表

    这个模块管理工具是创建模块依赖关系的列表,有几个参数我们注意一下就行了,目前的Linux 发行版所用的内核是2.6x版本,是自动解决依赖关系,所以这个命令知道就行了;模块之前也有依赖关系,比如我们想驱动USB 移动硬盘,目前有两种驱动,一种是udev ,在内核中有,但目前不太稳定;另一种办法是用usb-storage驱动,而usb-storage 依赖的模块是scsi 模块,所以我们要用usb-storage 的模块,也得把scsi 编译安装;

    # depmod -a 注:为所有列在/etc/modprobe.conf 或/etc/modules.conf 中的所有模块创建依赖关系,并且写入到modules.dep文件;3WiLinux联盟

    # depmod -e 注:列出已挂载但不可用的模块;3WiLinux联盟

    # depmod -n 注:列出所有模块的依赖关系

    3.7 启动pptpd服务

    #/usr/local/sbin/pptpd

    连接过程如下:

 

 



 

 

 



 


 


 




 


 

上图中我们可以看到该VPN连接采用了MPPE-128加密,MPPC压缩。

下面的连接是pptptest1,获得的IP是我们事先设定好的:

 

下面的连接是pptptest2,获得的IP是从地址池中获得的:

 

    【问题】

    1,  我在启动服务后发现不能连接VPN服务器,出错信息如下:

    #cat /var/log/messeges

    Dec 16 01:17:12 mm pptpd[6259]: MGR: Manager process started

    Dec 16 01:17:12 mm pptpd[6259]: MGR: Maximum of 100 connections available

    Dec 16 01:17:16 mm pptpd[6260]: CTRL: Client 192.168.1.55 control connection started

    Dec 16 01:17:16 mm pptpd[6260]: CTRL: Starting call (launching pppd, opening GRE)

    Dec 16 01:17:16 mm pppd[6261]: /usr/lib/pptpd/pptpd-logwtmp.so: cannot open shared object file: No such file or directory

    Dec 16 01:17:16 mm pppd[6261]: Couldn't load plugin /usr/lib/pptpd/pptpd-logwtmp.so

    Dec1601:17:16mm pptpd[6260]: GRE: read(fd=6,buffer=8058f40,len=8196) from PTY failed:status = -1 error = Input/output error, usually caused by unexpected termination of pppd, check option syntax and pppd logs

    Dec 16 01:17:16 mm pptpd[6260]: CTRL: PTY read or GRE write failed (pty,gre)=(6,7)

    Dec 16 01:17:16 mm pptpd[6260]: CTRL: Client 192.168.1.55 control connection finished

    提示缺少pptpd-logwtmp.so文件,我们按照提示复制到相关目录即可:

    # mkdir /usr/lib/pptpd

    # cp /home/pptp/pptpd-1.3.4/plugins/pptpd-logwtmp.so /usr/lib/pptpd/pptpd-logwtmp.so

    再次连接,即可正常连接PPTP VPN Server。

(责任编辑:IT)