使用 MySQL 进行 PPP 验证

mysql

继续折腾服务器的 VPN。之前已经配置好了 ipsec+L2TP 以及 OpenVPN,还做了 OpenVPN 的 MySQL 验证以实现用户跨服务器,但是 L2TP 的用户验证还是需要用 PPP 调用 /etc/ppp/chap-secrets 文件,跨服务器验证貌似也只能 crontab rsync,于是没用过 Radius 的我还是往 MySQL 方面想办法。搜索后发现了两个相关的开源项目:pppd-mysqlpppd-sql,前者简陋到只有一个 .c 文件,让人无从下手,而后者是基于前者的思路重新开发的,编译文件与文档齐全,而且支持 PostgreSQL,于是决定用之。

首先需要安装 ppp 和 openssl 的 header / lib

aptitude install ppp-dev libssl-dev

下载安装 pppd-sql

cd /usr/src
wget http://freshmeat.net/urls/5649d7ea329d121d094f12544e2b70a1
tar zxvf pppd-sql-0.8.0.tar.gz
cd pppd-sql-0.8.0
./configure  <- 注意结果提示,看看你的数据库服务是否被找到了
./make
./make install

另外关键的 mysql.so ppp 插件文件不知道为什么没有在 make install 时候安装到应有位置,手工 cp 吧,目标路径按照你系统里面的 pppd 版本号修改。

cp /usr/src/pppd-sql-0.8.0/src/.libs/mysql.so /usr/lib/pppd/2.4.5/

下面修改 ppp 的配置文件,如果你是按照我之前的 ipsec + L2TP 文档安装的话,那么就是修改 /etc/ppp/options.xl2tpd 这个文件,加入以下内容:

plugin mysql.so
mysql-host      MYSQL-HOST
mysql-port      MYSQL-PORT
mysql-user      MYSQL-USER
mysql-pass      MYSQL-PASS
mysql-pass-encryption   AES
mysql-pass-key  SALT
mysql-database  MYSQL-DB
mysql-table     MYSQL-TABLE
mysql-column-user       username
mysql-column-pass       ppppass
mysql-column-client-ip  client_ip
mysql-column-server-ip  server_ip
mysql-column-update     status
mysql-exclusive
mysql-authoritative

具体的配置请看 man pppd-mysql,数据库和表结构也很简单,我是直接在之前 OpenVPN 的表格基础上修改的。

连接试试看吧,应该没问题了,最终效果是用户名密码在所有服务器的 ipsec+L2TP 以及 OpenVPN 连接方式全部通用。如果你的 ppp 使用 CHAP2 验证密码的话,这个插件只支持 AES 加密,而 OpenVPN 用的是 mysql.PASSWORD(),所以这两个服务不能共享一个密码字段(当然明文除外)。我觉得问题不大,用 PHP 简单写个脚本即可,还可以顺便加上用户修改密码功能,如果再加上支付宝 API 调用的话。。。都可以做全自动化的 VPN 网络销售系统了。。。

This entry was posted in 我的慵懒生活, 电脑相关 and tagged , , , , , , , . Bookmark the permalink.

13 Responses to 使用 MySQL 进行 PPP 验证

  1. Pingback: Tweets that mention 使用 MySQL 进行 PPP 验证 | gkp's post -- Topsy.com

  2. Pingback: Linode CentOS / Debian 部署 ipsec+l2tpd 简要笔记 | gkp's post

  3. Pingback: NO777 » Blog Archive » CentOS 5 安装 IPSEC / L2TP VPN

  4. smt says:

    具体如何添加用户名和密码?

  5. leehom says:

    救命啊,用了ppp-sql 在账户认证阶段,本地和VPN的连接就断了,也就是说本地(局域网中的机子)突然ping不通VPN了(但非本局域网中别的机子能ping通VPN),但是不用ppp-sql认证一切okay。好奇怪啊!是路由的问题?还是局域网的问题?但是不用ppp-sql神马问题都没有啊。。
    下面是ppp和xl2tp的日志。

    Jan 28 03:59:59 vpn xl2tpd[1399]: Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.
    Jan 28 03:59:59 vpn xl2tpd[1399]: Forked by Scott Balmos and David Stipp, (C) 2001
    Jan 28 03:59:59 vpn xl2tpd[1399]: Inherited by Jeff McAdams, (C) 2002
    Jan 28 03:59:59 vpn xl2tpd[1399]: Forked again by Xelerance (www.xelerance.com) (C) 2006
    Jan 28 03:59:59 vpn xl2tpd[1399]: Listening on IP address 0.0.0.0, port 1701
    Jan 28 03:59:59 vpn ipsec__plutorun: 002 added connection description "L2TP-PSK-NAT"
    Jan 28 03:59:59 vpn ipsec__plutorun: 002 added connection description "L2TP-PSK-noNAT"
    Jan 28 03:59:59 vpn ipsec__plutorun: 003 NAT-Traversal: Trying new style NAT-T
    Jan 28 03:59:59 vpn ipsec__plutorun: 003 NAT-Traversal: ESPINUDP(1) setup failed for new style NAT-T family IPv4 (errno=19)
    Jan 28 03:59:59 vpn ipsec__plutorun: 003 NAT-Traversal: Trying old style NAT-T
    Jan 28 04:02:04 vpn kernel: alg: No test for stdrng (ansi_cprng)
    Jan 28 04:02:04 vpn kernel: alg: No test for stdrng (krng)
    Jan 28 04:02:04 vpn kernel: alg: No test for authenc(hmac(sha1),cbc(aes)) (authenc(hmac(sha1-generic),cbc(aes-i586)))
    Jan 28 04:02:07 vpn xl2tpd[1399]: Connection established to 125.114.135.116, 52683. Local: 9293, Remote: 30 (ref=0/0). LNS session is 'default'Jan 28 04:02:07 vpn xl2tpd[1399]: Call established with 125.114.135.116, Local: 25117, Remote: 289, Serial: 1
    Jan 28 04:02:08 vpn pppd[1564]: Plugin /usr/local/lib/mysql.so loaded.Jan 28 04:02:08 vpn pppd[1564]: Plugin mysql: pppd-sql-0.8.0 initialized, compiled pppd-2.4.4, linked mysql-5.0.77Jan 28 04:02:08 vpn kernel: CSLIP: code copyright 1989 Regents of the University of California
    Jan 28 04:02:08 vpn kernel: PPP generic driver version 2.4.2
    Jan 28 04:02:08 vpn pppd[1564]: pppd 2.4.4 started by root, uid 0Jan 28 04:02:08 vpn pppd[1564]: Using interface ppp0
    Jan 28 04:02:08 vpn pppd[1564]: Connect: ppp0 /dev/pts/1Jan 28 04:02:14 vpn kernel: PPP Deflate Compression module registeredJan 28 04:02:15 vpn pppd[1564]: Unsupported protocol 'IPv6 Control Protovol' (0x8057) receivedJan 28 04:02:15 vpn pppd[1564]: found interface eth0 for proxy arp
    Jan 28 04:02:15 vpn pppd[1564]: local IP address 125.114.135.116
    Jan 28 04:02:15 vpn pppd[1564]: remote IP address 216.24.198.101Jan 28 04:03:12 vpn xl2tpd[1399]: Maximum retries exceeded for tunnel 9293. Closing.Jan 28 04:03:40 vpn pppd[1564]: Terminating on signal 15
    Jan 28 04:03:40 vpn pppd[1564]: Modem hangupJan 28 04:03:41 vpn pppd[1564]: Connect time 1.5 minutes.
    Jan 28 04:03:41 vpn pppd[1564]: Sent 0 bytes, received 0 bytes.Jan 28 04:03:41 vpn pppd[1564]: Connection terminated.
    Jan 28 04:03:41 vpn pppd[1564]: Exit.Jan 28 04:03:41 vpn xl2tpd[1399]: Connection 30 closed to 125.114.135.116, port 52683 (Timeout)

  6. okhwyy says:

    centos5.4 安装时的提示

    configure: error: *** pppd.h is required, install ppp header files

    yum install ppp-dev libssl-dev
    No package ppp-dev available.
    No package libssl-dev available.

  7. chris says:

    配置文件應該怎麽修改?我無論怎麽修改都連不通?
    數據庫的結構是否按照scripts/ppp-login-mysql.sql導入就可以?

  8. Pingback: Linode CentOS/Debian 部署 ipsec+l2tpd | MGJ的地盘

  9. zhxq says:

    您所说的自动化售卖系统我已经实现了……pppd-sql的代码我也经过更改不用每个用户指定ip,可以自动化地去分配~

  10. Pingback: Linode CentOS / Debian 部署 ipsec+l2tpd 简要笔记 | gkp’s post | Share

Leave a Reply

Your email address will not be published.