Linux的VPN服务器
时间:2006-06-01 来源:snowtty
VPN(Virtual Private Network,虚拟专用网络)是专用网络的延伸,它可以通过共享Internet或公共网络连接模拟点对点专用连接的方式,在本地计算机和远程计算机之间发送数据。
它具有良好的保密性和不受干扰性,使双方能够进行自由而安全的点对点连接。下面介绍一种快速构建VPN服务器的方法。
安装软件
1.安装PPP
安装PPP(Point-to-Point Protocol,点到点协议)2.4.2以上的版本,可以到http://sourceforge.net/project/showfiles.php?group_id=44827下载ppp-2.4.3-0.cvs_20040527.1.i386.rpm软件包。
安装命令如下:
#rpm -Uvh ppp-2.4.3-0.cvs_20040527.1.i386.rpm
2.安装内核MPPE补丁
安装内核MPPE(Microsoft Point to Point Encryption,微软点对点加密)补丁需要根据内核选择相应的版本。笔者使用的Linux内核是2.4.20-31.9版本,可以到http: //pptpclient.sourceforge.net/mppe/kernel-mppe-2.4.20-31.9.i686.rpm下载相应的 kernel-mppe-2.4.20-31.9.i686.rpm软件包。安装命令如下:
#rpm -ivh kernel-mppe-2.4.20-31.9.i686.rpm
用以下命令检查内核MPPE补丁是否安装成功:
#modprobe ppp-compress-18
3.检查PPP是否支持MPPE
用以下命令检查PPP是否支持MPPE:
#strings '/usr/sbin/pppd' grep -i mppe wc --lines
如果以上命令输出为“0”则表示不支持;输出为“30”或更大的数字就表示支持。
4.安装PPTPD
到http://sourceforge.net/project/showfiles.php?group_id=44827下载pptpd-1.1.4-b4.i386.rpm软件包,并安装。
# rpm -ivh pptpd-1.1.4-b4.i386.rpm
修改配置文件
1.修改modules.conf文件
编辑/etc/modules.conf配置文件,加入如下内容:
alias net-pf-47 ip_gre
2.修改pptpd.conf文件
编辑/etc/pptpd.conf配置文件,添加如下内容,确定本地VPN服务器的IP地址和客户端登录后分配的IP地址范围。
debug
option /etc/ppp/options.pptpd
localip 192.168.0.254 #本地VPN服务器的IP
remoteip 192.168.1.1-254 #客户端被分配的IP范围
3.修改options.pptpd文件
编辑/etc/ppp/options.pptpd配置文件,替换成如下内容:
auth
lock
debug
proxyarp
lock
name rh9vpn #VPN服务器的名字
multilink
refuse-pap
refuse-chap
refuse-mschap
refuse-eap
refuse-mschap-v2
require-mppe
ms-wins 192.168.1.2 #把想要在网络邻居中看到的机器的IP填写到这里
ms-dns 192.168.1.2 #DNS服务器地址
dump
logfile /var/log/pptpd.log #日志存放的路径
4.修改chap-secrets文件
编辑/etc/chap-secrets配置文件,添加如下内容:
# client server secret IP addresses
"[email protected]" * "test" *
上面第二行代码的四项内容分别对应第一行中的四项。“[email protected]”是Client端的VPN用户名;“server”对应的是 VPN服务器的名字,该名字必须和/etc/ppp/options.pptpd文件中指明的一样,或者设置成“*”号来表示自动识别服务器; “secret”对应的是登录密码;“IP addresses”对应的是可以拨入的客户端IP地址,如果不需要做特别限制,可以将其设置为“*”号。
5.设置IP伪装转发
只有设置了IP伪装转发,通过VPN连接上来的远程计算机才能互相ping通,实现像局域网那样的共享。用下面的命令进行设置:
#echo 1 > /proc/sys/net/ipv4/ip_forward
可以将这条命令放到文件/etc/rc.d/rc.local里面,以实现每次开机时自动运行该命令。
6.打开防火墙端口
将Linux服务器的1723端口和47端口打开,并打开GRE协议。
#/sbin/iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
#/sbin/iptables -A INPUT -p tcp --dport 47 -j ACCEPT
#/sbin/iptables -A INPUT -p gre -j ACCEPT
到这里Linux服务器的设置就完成了,下面将利用Windows客户端进行测试。
测试
下面以Windows Server 2003为例来进行测试。
1.新建连接
单击“开始→设置→网络和拨号连接”打开“网络和拨号连接”的窗口,再单击“新建连接”打开“网络连接向导”的窗口,然后依次选择或填写“连接到我的工作场所网络→虚拟专用网络连接→公司名(可以随便填写)→不拨初始连接→IP地址(填入VPN服务器的IP地址)”,最后单击“确定”,就建立了一个新的连接。
2. 修改连接属性
右击刚才创建的连接,再依次单击“属性→网络(选择TCP/IP协议)→属性→高级”,然后把“在远程网络上使用默认网关”前面的勾去掉后单击“确定”。
3.建立连接
双击刚才建立好的连接,填入提前设置好的用户名和密码,单击“确定”进行连接。如果连接成功,在连接的“详细信息”里应该可以看到服务器所分配的IP地址等信息。这时,就可以跟连接进入的局域网里的其它计算机进行通信了。
如果客户端使用的仍然是Windows 95或Windows 98,则需要到http://support.microsoft.com/support/kb/articles/q285/1/89.asp下载相关的拨号程序。
我所用到的软件,全在http://prdownloads.sourceforge.net/poptop/
系统为centos4.1
dkms-2.0.5-1.noarch.rpm
kernel_ppp_mppe-0.0.5-2dkms.noarch.rpm
ppp-2.4.3-5.rhel4.i386.rpm
pptpd-1.3.0-0.i386.rpm
配置:/etc/pptpd.conf localip 192.168.0.96 remoteip 192.168.0.200-210,192.168.0.254
/etc/ppp/chap-secrets
账户名 服务 口令 分配给该账户的IP
"snowtty" pptpd "1234" *
echo "1" > /proc/sys/net/ipv4/ip_forward
看到多了一个网络连接,IP为:192.168.0.10,正是前是配置文件里设置的远程IP,这样这台windows的客户端成功连上了这个VPN服务器
但是这里出现了一个问题,原来这台windows机器可以通过网关192.168.1.1上网,但连了VPN之后就不能上网了。因为数据全到VPN服务器上来了,为解决这个问题,我们可利用iptables发数据转发。
新建一个iptables文件,内容如下:
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "clear the iptables rules"
/etc/init.d/iptables stop
/sbin/iptables -A INPUT -p icmp -j DROP
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
/sbin/iptables -F FORWARD
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -t nat -A POSTROUTING -j MASQUERADE
/sbin/iptables -F FORWARD
/sbin/iptables -A FORWARD -p udp -s 192.168.1.0/24 --dport 53 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -s 192.168.1.0/24 --dport 1723 -j ACCEPT
/sbin/iptables -A FORWARD -p gre -s 192.168.1.0/24 -j ACCEPT
/sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
然后执行这个iptables文件,OK,windows的客户机可以上网了
PPTPD和PPTP client的安装配置- -
PPTPD和PPTP client本身的安装并不复杂,可以说相当直观。但是如果要用到mppp加密,需要做的工作就要多一些。 1、PPTPD的官方网站是http://www.poptop.org, PPTP client的官方网站是http://pptpclient.sourceforge.net 2、要支持mppe加密,需要安装mppe的内核模块和PPP的mppe支持。如果需要支持mppe加密,第三步和第五步对于PPTPD和PPTP client都是需要的。 3、下载地址http://heanet.dl.sourceforge.net/sourceforge/poptop/kernelmod-0.7.1.tar.gz 需要说明的是,目前为止我所看到的kernelmod最新版本为0.8.2, 但是在我的linux上运行kernelmod.sh并不能完成安装,所以我建议采用0.7.1 4、检查mppe内核模块的安装。如果安装成功,应该可以找到 /lib/modules/%{VERSION}-%{RELEASE}/kernel/drivers/net/ppp_mppe.o;%{VERSION}-%{RELEASE}对应于uname -a的输出结果。运行modprobe ppp-compress-18, 如果输出结果为空或者: Warning: loading /lib/modules/2.4.20-8/kernel/drivers/net/ppp_mppe.o will taint the kernel: non-GPL license - BSD without advertisement clause
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Module ppp_mppe loaded, with warnings 则表明,mppe的内核模块安装成功。参考http://pptpclient.sourceforge.net/howto-diagnosis.phtml#mppe_kernel 。 另外需要说明的是,mppe内核模块有两种授权模式,Openssl和BSD模式。默认情况下,采用的是BSD授权。之所以提到这个授权,是因为在第9步中,PPTPD的配置会有所不同。 5、安装PPP的mppe支持。按照第6步检查现有的PPP是否已经支持mppe, 如果不支持,到http://pptpclient.sourceforge.net/#download下载ppp的安装包,安装。 6、检查PPP的mppe支持的安装。运行 strings `which pppd`|grep -i mppe|wc --lines 如果结果为0,则说明现有的PPP安装不支持mppe; 如果大于0,则支持mppe. 注意,redhat 7.3发布的默认安装下,PPP不支持mppe,所以需要更新安装包。参考http://pptpclient.sourceforge.net/howto-diagnosis.phtml#mppe_pppd 7、PPTPD的安装。到http://sourceforge.net/projects/poptop下载最新的pptpd安装包或者源码包。安装 8、PPTP client的安装。到http://pptpclient.sourceforge.net/#download下载pptp-linux,和pptp-php-gtk。 pptp-linux就是PPTP client, pptp-php-gtk是PPTP client的配置界面,需要有xwindows支持。 9、PPTPD的配置。涉及到三个配置文件,/etc/pptpd.conf, /etc/ppp/chap-secrets, 和/etc/ppp/options.pptpd。pptpd.conf配置了一些全局的选项。需要说明的是options.pptpd的配置。如果采用OpenSSL授权,则采用 -chap
-chapms
+chapms-v2
mppe-40 # both 40-bits and 128-bits encryption bite eachother
mppe-128
mppe-stateless 如果采用BSD授权,则使用 refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe 请参考http://poptop.sourceforge.net/dox/ 参考: http://poptop.sourceforge.net/ PPTPD的sourceforge主页,下载和文档 http://pptpclient.sourceforge.net PPTP client的主页, 下载和文档 http://www.poptop.org PPTPD的主页,好像除了联接没有什么其它东西
[watermark]今天很是高兴,搞了三天的VPN服务器终于成功了,外加老鼠给我加了一点威望。为了表示感谢将VPN安装笔记奉上!
现在网上有很多基于LINUX的服务器的VPN服务器安装教程,但是过于简单,没有就实际问题给出答案,其实半小时内我就建立起了VPN服务器,为了实现加密和路由功能,折磨了我三个晚上,当然只到12:30,现在发现熬夜已经不行了。
好了,不多说了,现在开始准备工作 :
操作系统是REDHAT 9.0,软件如下:
ppp-2.4.2-b3.i386.rpm
pptpd-1.2.3-1.i386.rpm
kernelmod-0.7.1.tar.gz
安装步骤很简单
先升级PPP
rpm -Uvh ppp-2.4.2-b3.i386.rpm
然后是安装pptp
rpm -ivh pptpd-1.1.3-4.i386.rpm
最后是mppe的补丁
tar -zxvf kernelmod-0.7.1.tar.gz
cd kernelmod
./kernelmod.sh(生成kernel-mppe-2.4.20-8.i686.rpm)
注意这里在/usr/src下一定要有内核源代码,如:安装kernel-source.rpm
rpm –ivh kernel-mppe-2.4.20-8.i686.rpm
解下来是简单的配置:
vi /etc/pptpd.conf
option /etc/ppp/options.pptpd (option文件位置)
localip 192.168.1.254 VPN服务器地址。
remoteip 192.168.1.240-250 (分配的ip地址池)
vi /etc/ppp/options.pptpd
auth 实现口令验证
lock
debug
proxyarp 起用arp 代理
lock
name pptp 服务器名称
#下面是一句按意思是实现多人连接,但好象没有,也可以多人连接。
#multilink
#下面是对加密协议的规定,必须的。
refuse-pap
refuse-chap
refuse-mschap
refuse-eap
refuse-mschap-v2
require-mppe
ms-dns 10.38.113.254 连接后的DNS
dump
logfile /var/log/pptpd.log 保存日志记录
vi chap-secrets
test(username) pptpd(servername) test(secret) *(ipaddresses,看到有前辈说这里是禁止那些人的ip不能上,但是实际试验下来的得到的结果是这里的ipaddresses是分配给这个用户的ip地址,*表示从地址池内自动分配)
[root@localhost vpn]# /etc/rc.d/init.d/pptpd status
检查pptpd运行状态。
用以下命令检查内核MPPE补丁是否安装成功:
#modprobe ppp-compress-18
检查PPP是否支持MPPE,用以下命令检查PPP是否支持MPPE:
#strings ';/usr/sbin/pppd'; |grep -i mppe | wc --lines
如果以上命令输出为“0”则表示不支持;输出为“30”或更大的数字就表示支持。
下面是我实际中碰到的错误。
错误734:
PPP控制协议出错,客户端没有启动数据加密。
错误619:
客户端和服务端加密协议不一致。
错误741:
服务端没有启动数据加密。
故障:
客户端:w2k VPN拨入
正常拨入后,服务器上ifconfig显示接口有“eth0\lo\ppp0”
客户端断开后,显示接口仍然如上。
再次拨入,递加ppp1接口。但客户端无法正常使用了。必须手工KILL掉所有pppd进程。
检查/etc/ppp/options.pptpd配置文件
将multilink一句注释掉,该问题解决。
接入后为了能使用内网程序,必须起用IP转发。
#echo 1 > /proc/sys/net/ipv4/ip_forward
如果通过ADSL接入INTERNET后再拨入VPN,会出现无法访问internet,此时断开。将建立的VPN连接修改属性--网络--TCP/IP--高级--在远程网络上使用默认网关的勾取消即可。然后再拨入,内网程序如果要使用路由,自己再手工添加路由!
虽然借鉴了很多文章,但归纳和问题解决都是我自己研究出来的,和大家共享!
作者:virtuaboy
2005.10.01[/watermark]