百度百科介绍vpn的作用: VPN属于远程访问技术,简单地说就是利用公用网络架设专用网络。例如某公司员工出差到外地,他想访问企业内网的服务器资源,这种访问就属于远程访问。在传统的企业网络配置中,要进行远程访问,传统的方法是租用DDN(数字数据网)专线或帧中继,这样的通讯方案必然导致高昂的网络通讯和维护费用。对于移动用户(移动办公人员)与远端个人用户而言,一般会通过拨号线路(Internet)进入企业的局域网,但这样必然带来安全上的隐患。 让外地员工访问到内网资源,利用VPN的解决方法就是在内网中架设一台VPN服务器。外地员工在当地连上互联网后,通过互联网连接VPN服务器,然后通过VPN服务器进入企业内网。为了保证数据安全,VPN服务器和客户机之间的通讯数据都进行了加密处理。有了数据加密,就可以认为数据是在一条专用的数据链路上进行安全传输,就如同专门架设了一个专用网络一样,但实际上VPN使用的是互联网上的公用链路,因此VPN称为虚拟专用网络,其实质上就是利用加密技术在公网上封装出一个数据通讯隧道。有了VPN技术,用户无论是在外地出差还是在家中办公,只要能上互联网就能利用VPN访问内网资源,这就是VPN在企业中应用得如此广泛的原因。下面是一个简单的拓扑图:vpn工作原理 通常情况下,VPN网关采取双网卡结构,外网卡使用公网IP接入Internet。 1.网络一的终端A访问网络二的终端B,其发出的访问数据包的目标地址为终端B的内部IP地址。 网络一的VPN网关在接收到终端A发出的访问数据包时对其目标地址进行检查,如果目标地址属于网络二的地址,则将该数据包进行封装,封装的方式根据所采用的VPN技术不同而不同,同时VPN网关会构造一个新VPN数据包,并将封装后的原数据包作为VPN数据包的负载,VPN数据包的目标地址为网络二的VPN网关的外部地址。 2.网络一的VPN网关将VPN数据包发送到Internet,由于VPN数据包的目标地址是网络二的VPN网关的外部地址,所以该数据包将被Internet中的路由正确地发送到网络二的VPN网关。 3.网络二的VPN网关对接收到的数据包进行检查,如果发现该数据包是从网络一的VPN网关发出的,即可判定该数据包为VPN数据包,并对该数据包进行解包处理。解包的过程主要是先将VPN数据包的包头剥离,再将数据包反向处理还原成原始的数据包。 4.网络二的VPN网关将还原后的原始数据包发送至目标终端B,由于原始数据包的目标地址是终端B的IP,所以该数据包能够被正确地发送到终端B。在终端B看来,它收到的数据包就和从终端A直接发过来的一样。 5.从终端B返回终端A的数据包处理过程和上述过程一样,这样两个网络内的终端就可以相互通讯了。通过上述说明可以发现,在VPN网关对数据包进行处理时,有两个参数对于VPN通讯十分重要:原始数据包的目标地址(VPN目标地址)和远程VPN网关地址。根据VPN目标地址,VPN网关能够判断对哪些数据包进行VPN处理,对于不需要处理的数据包通常情况下可直接转发到上级路由;远程VPN网关地址则指定了处理后的VPN数据包发送的目标地址,即VPN隧道的另一端VPN网关地址。由于网络通讯是双向的,在进行VPN通讯时,隧道两端的VPN网关都必须知道VPN目标地址和与此对应的远端VPN网关地址。了解了VPN的作用及工作原理我们就进行一下Linux+pptpd+freeradius+mysql的配置系统环境:RHEL6 x86_64 selinux and iptables disabled网卡配置信息: vm2(双网卡):eth0:192.168.1.10 或者vm2我们可以给它配置虚拟网卡 服务器 eth1:192.168.2.3 VM3(单网卡):eth0:192.168.1.11 客户端 软件下载:http://poptop.sourceforge.net/yum/stable/rhel6/安装和配置pptpd(点对点隧道协议)[root@vm2 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 或者我们可以直接修改/etc/sysctl.conf这个配置文件[root@vm2 ~]# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 [root@vm2 ~]# sysctl -p 是配置立即生效 net.ipv4.ip_forward = 1 [root@vm2 ~]# yum install ppp -y [root@vm2 mnt]# ls pptpd-1.3.4-2.el6.x86_64.rpm [root@vm2 mnt]# rpm -ivh pptpd-1.3.4-2.el6.x86_64.rpm pptpd 的配置文件: /etc/pptpd.conf [root@vm2 ~]# vim /etc/pptpd.conflocalip 192.168.1.10remoteip 192.168.2.100-110localip: pptpd server 所在服务器IP地址,可以设置为服务器上绑定的任意一个IP地址 remoteip:设置客户端连接到pptpd server后可供分配的IP地址范围 添加测试用户: [root@vm2 ~]# vim /etc/ppp/chap-secrets# Secrets for authentication using CHAP# client server secret IP addresseshy pptpd westos *[root@vm2 ~]# /etc/init.d/pptpd start Starting pptpd: [ OK ] [root@vm2 ~]# netstat -antlp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN 1219/pptpd 接下来我们进行测试了安装配置 freeradius freeradius一般用来进行账户认证管理,记账管理,常见的电信运营商的宽带账户,上网账户管理,记账,都是使用的radius服务器进行鉴权记账的。[root@vm2 mnt]# yum install freeradius -y 另外还需要安装freeradius-mysql、freeradius-utils这两个包,可以去网上找 [root@vm2 mnt]# yum localinstall freeradius-mysql-2.1.12-3.el6.x86_64.rpm freeradius-utils-2.1.12-3.el6.x86_64.rpm -y [root@vm2 mnt]# tar zxf ppp-2.4.5.tar.gz [root@vm2 mnt]# cd ppp-2.4.5 [root@vm2 ppp-2.4.5]# mkdir mkdir /etc/radiusclient [root@vm2 ppp-2.4.5]# cp /mnt/ppp-2.4.5/pppd/plugins/radius/etc/* /etc/radiusclient/[root@vm2 ppp-2.4.5]# cd /etc/radiusclient/ 在 servers 文件中添加 radius 服务器的地址和密码 127.0.0.1 westos 修改 radiusclient.conf 文件中确保这个文件中所有与 radiusclient 相关的路径都是以/etc/radiusclient 开头的。 例如: servers /usr/local/etc/radiusclient/servers 修改为: servers /etc/radiusclient/servers[root@vm2 radiusclient]# vim /etc/ppp/options.pptpd, 添加如下行: plugin /usr/lib64/pppd/2.4.5/radius.so [root@vm2 radiusclient]# cd /etc/raddb [root@vm2 raddb]# vim clients.conf client localhost { ipaddr = 127.0.0.1 secret = westos (与/etc/radiusclient/servers 里设置的一致) .... }支持 mysql [root@vm2 raddb]# vim radiusd.conf $INCLUDE sql.conf #去掉注释[root@vm2 raddb]# vim sites-available/defaultauthorize {#filessql....}accounting {#radutmpsql....}session{#radutmpsql}post-auth {sql}[root@vm2 raddb]# vim sql.confsql {database = “mysql“driver = "rlm_sql_mysql"server = "localhost"login = "radius"password = "radpass"radius_db = "radius"....}[root@vm2 raddb]# vim sql/mysql/dialup.conf 去掉如下行的注释: simul_count_query = "SELECT COUNT(*) / FROM ${acct_table1} / WHERE username = '%{SQL-User-Name}' / AND acctstoptime IS NULL"安装和配置mysql [root@vm2 raddb]# yum install mysql mysql-server -y [root@vm2 raddb]# /etc/init.d/mysqld start [root@vm2 raddb]# cd /etc/raddb/sql/mysql/ [root@vm2 mysql]# mysqladmin create radius [root@vm2 mysql]# mysql radius [root@vm2 mysql]# mysql radius[root@vm2 mysql]# mysql mysql> use radius; mysql> insert into radgroupreply (groupname,attribute,op,value) values('user','Auth-Type',':=','Local'); mysql> insert into radgroupreply (groupname,attribute,op,value) values ('user','Service-Type',':=','Framed-User'); mysql> insert into radgroupreply (groupname,attribute,op,value) values('user','Framed-IP-Address',':=','255.255.255.254'); mysql> insert into radgroupreply (groupname,attribute,op,value) values ('user','Framed-IP-Netmask',':=','255.255.255.0');mysql>insert into radgroupcheck (groupname,attribute,op,value) values('user','Simultaneous-Use',':=','1'); (限制一个帐号只能拨一次,可选) 添加用户: mysql> insert into radcheck (username,attribute,op,value) values ('hy','User-Password',':=','westos'); mysql> insert into radusergroup (username,groupname) values ('test','user');以后添加帐户只需要进行以下两步操作即可: mysql> insert into radcheck (username,attribute,op,value) values ('test','User-Password',':=','test'); (添加帐户 test,密码 test) mysql> insert into radusergroup (username,groupname) values ('test','user'); [root@vm2 mysql]# /etc/init.d/radiusd start Starting radiusd: [ OK ] [root@vm2 mysql]# /etc/init.d/pptpd stop Shutting down pptpd: [ OK ] [root@vm2 mysql]# /etc/init.d/pptpd start Starting pptpd: [ OK ] 但是我在测试的时候出现了报错如下: 解决办法如下: [root@vm2 radiusclient]# vim /etc/hosts 添加一条将自己的IP解析出来 192.168.1.10 vm2.example.com 下面是我们的测试结果: 这时我们看到rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=242, length=20,意思是访问被拒绝, 这时查看日志文件发现如下错误: 解决办法:进入数据库删掉以前创建的test和hy用户信息,重新创建,问题解决。 重新测试结果如下: 看到 Access-Accept 字样即表示成功 下面我们通过VM3进行测试: [root@vm3 mnt]# yum localinstall pptp-setup-1.7.2-8.1.el6.x86_64.rpm -y 所有的依赖性默认全部安装好 创建一个VPN,创建完成后自动获取一个IP: 我们可以看到VM3虚拟机获得了一个ip(192.168.2.100) 此时表明连接已经建立,可以使用ifconfig查看连接情况。 如果想删除连接,可以使用下面的命令来删除: [root@vm3 ~]# cd /usr/share/doc/ppp-2.4.5/scripts/ [root@vm3 scripts]# chmod +x poff pon [root@vm3 scripts]# cp pon poff /usr/bin/ [root@vm3 ~]# poff -a (断掉链接)我们可以看到创建的ppp0已经停掉了。但是在/etc/ppp/peers/会有openvpn这个文件,记得上面那个--create参数吗,再次链接就可以使用 pppd call openvpn [root@vm3 peers]# pppd call openvpn 更多的操作信息我们可以查看/usr/share/doc/ppp-2.4.5/scripts/README。 为我们的ppp0添加一条路由 到这里我们的整个vpn配置完毕。