Linux下架设PPTP VPN服务器
时间:2014-05-17 11:00 来源:linux.it.net.cn 作者:it
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)
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) |