PPPOE + FreeRADIUS + MySQL 配置记录

发表于:2007-07-04来源:作者:点击数: 标签:
最近两天花精力把PPPOE拨号 服务器 做了一下,因为网上这方面的资料少得可怜, 所以觉得有必要记录一下,用以方便今后需要做这些东西的同志们。 硬件环境:C42.6/256M/80GIDEHD/intel82801集成网卡。 软件环境:Debiansarge3.1r0netinst 用到的包: ppp-2.4.

最近两天花精力把PPPOE拨号服务器做了一下,因为网上这方面的资料少得可怜,
所以觉得有必要记录一下,用以方便今后需要做这些东西的同志们。

硬件环境:C4 2.6/ 256M/ 80G IDEHD/ intel 82801集成网卡。
软件环境:Debian sarge 3.1r0 netinst 
用到的包:
ppp-2.4.3.tar.gz
ppp-2.4.3-mppe-mppc-1.1.patch.gz
linux-2.4.30.tar.bz2
linux-2.4.30-mppe-mppc-1.3.patch.gz
rp-pppoe-3.5.tar.gz
mysql-4.1.12.tar.gz
freeradius-1.0.4.tar.gz

其中的 ppp-2.4.3.tar.gz 在http://ppp.samba.org/ ;可以下载到
linux-2.4.30.tar.bz2 在 http://www.kernel.org/ ;可以下载到
ppp-2.4.3-mppe-mppc-1.1.patch.gz 和 linux-2.4.30-mppe-mppc-1.3.patch.gz 
可以在 http://www.polbox.com/h/hs001/ ;下载到
rp-pppoe-3.5.tar.gz 在 php >http://www.roaringpenguin.com/penguin/open_source_rp-pppoe.php ;
可以下载到
mysql-4.1.12.tar.gz 可以在 http://dev.mysql.com/ ;下载到
freeradius-1.0.4.tar.gz 可以在 http://www.freeradius.org/ ;下载到。


网络情况:
IP: 192.168.1.123
mask : 255.255.254.0
gateway: 192.168.0.1
dns: 192.168.0.2


下面开始:

我的系统一开始就给我装了ppp和pppoe,为了自立更生,我还是把他们删掉了,debian下做这个坏事比较方便:
[code:1:fcc7e996cf]
# apt-get remove ppp pppconfig pppoe pppoeconf
[/code:1:fcc7e996cf]

1、重编译内核,加入PPP和PPPOE的支持;
首先解压内核源码,然后把MPPC+MPPE的补丁打上。之后就make menuconfig , 加入以下支持:
[code:1:fcc7e996cf]
code maturity level options——>
    [*]prompt for development and/or incomplete code/drivers
networking options——>
    [*]packet socket
    [*]packet socket:mmapped io
network device support——>
    <M>PPP (point-to-point protocol) support
        [*]PPP multilink support (EXPERIMENTAL)
        <M>PPP support for async serial ports
        <M>PPP support for sync tty ports
        <M>PPP Deflate compression
        <M>PPP BSD-Compress compression
        <M>Microsoft PPP compression/encryption (MPPC/MPPE)
        <M>PPP over Ethernet (EXPERIMENTAL)
character devices——>
    [*]non-standard serial port support
        [M]hdlc line discipline support
Cryptographic options---> 
    [M]SHA1 digest algorithm
    [M]ARC4 cipher algorithm
[/code:1:fcc7e996cf]

按照上面的配置重新编译内核,然后安装内核,并用它启动完毕后,备用。

2、创建一个/dev/ppp 设备文件,这是ppp拨号所必需的。
[code:1:fcc7e996cf]
# mknod --mode=664 /dev/ppp c 108 0
[/code:1:fcc7e996cf]

3、确保 /etc/modules.conf 里面有如下几行:
[code:1:fcc7e996cf]
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
[/code:1:fcc7e996cf]

4、安装 ppp-2.4.3.tar.gz
解压缩之后,打上ppp-2.4.3-mppe-mppc-1.1.patch.gz 补丁,然后编译安装:
[code:1:fcc7e996cf]
# tar zxvf php-2.4.3.tar.gz
# gunzip ppp-2.4.3-mppe-mppc-1.1.patch.gz
# patch -p0 < ppp-2.4.3-mppe-mppc-1.1.patch
# cd ppp-2.4.3
# ./configure
# make 
# make install install-etcppp
# chmod u+s /usr/local/sbin/pppd
# cd ..
[/code:1:fcc7e996cf]

5、安装rp-pppoe
[code:1:fcc7e996cf]
# tar zxvf rp-pppoe-3.5.tar.gz
# cd rp-pppoe-3.5/src
# ./configure --prefix=/usr/local --enable-plugin=../../ppp-2.4.3
# make 
# make install
[/code:1:fcc7e996cf]

6、把生成的rp-pppoe.so/radius.so等模块复制到ppp的配置目录里
[code:1:fcc7e996cf]
# cp /usr/local/lib/pppd/2.4.3/* /etc/ppp/plugins
[/code:1:fcc7e996cf]

7、配置 /etc/ppp/options 
[code:1:fcc7e996cf]
# cat /etc/ppp/options
lock
crtscts
nobsdcomp
nodeflate
nopcomp
[/code:1:fcc7e996cf]

8、配置 /etc/ppp/pppoe-server-options
[code:1:fcc7e996cf]
# cat /etc/ppp/pppoe-server-options
auth
require-chap
default-mru
default-asyncmap
lcp-echo-interval 60
lcp-echo-failure 5
ms-dns 192.168.0.2
ms-dns 61.132.90.92
noipdefault
noipx
nodefaultroute
noproxyarp
noktune
10.0.0.1:10.0.0.200
netmask 255.255.255.255
logfile /var/log/pppd.log
[/code:1:fcc7e996cf]


* 这里 192.168.0.2 和 61.132.90.92是我使用的dns
* 10.0.0.1:10.0.0.200 是客户端分配的IP区间

9、设置密码文件 (先实现文本文件密码认证)
[code:1:fcc7e996cf]
# cat /etc/ppp/chap-secrets
hefish  * 123456 *
[/code:1:fcc7e996cf]

10、启动pppoe拨入服务:
[code:1:fcc7e996cf]
/usr/local/sbin/pppoe-server -k -I eth0 -L 192.168.1.123 -R 10.0.0.1 -N 128
[/code:1:fcc7e996cf]

* -k 使用PPP的kernel mode
* -I eth0 启动pppoe拨号接入的网卡设备
* -L 本地地址IP
* -R 客户端起始IP
* -N 最大并发连接数

11、启动IP转发,使客户端可以通过pppoe服务器访问外网。
[code:1:fcc7e996cf]
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE -s 0/0
[/code:1:fcc7e996cf]



启动之后就可以使用PPPOE拨号接入了。
客户端可以采用win2000+raspppoe或者WinXP自带的pppoe,我用的win2003+raspppoe就不行,改用win2003自带的PPPOE就好了,想必也是软件压缩的问题,按理说我打了MPPC补丁,应该是支持软件压缩了,这个问题以后再说吧。

如果拨号之后无法访问拨号服务器,那就把客户端的PPP设置里面的启用软件压缩去掉,即可。

先休息一下。稍候继续。
---------------------------------------------------------


上回书说到,我们用ppp+rp-pppoe架设了 pppoe的拨号服务器,采用了文本文件的认证方式,这回我们要说ppp如何使用radius来认证,radius认证的好处我就不多说了,一方面支持数据库,另一方面支持计费。

1、先装mysql,这就不多说了;

2、把freeradius安装一下;
freeradius是个很周到的东西,考虑到了n多种后台,什么oracle,mssql, ldap都支持,mysql更是不在话下。没说的,就安装:
[code:1:fcc7e996cf]
# tar zxvf freeradius-1.0.4.tar.gz
# cd freeradius-1.0.4
# ./configure --prefix=/usr/local/freeradius
# make 
# make install 
[/code:1:fcc7e996cf]

有一点要说明,freeradius需要openssl 库,所以如果系统里没安装的话,还是要事先安装一下的。

3、配置freeradius;
1) 修改 clients.conf
[code:1:fcc7e996cf]
# vi /usr/local/freeradius/etc/raddb/clients.conf
client 127.0.0.1 {
secret = 123456
shortname = localhost
nastype = other

[/code:1:fcc7e996cf]

这里secret = 123456 表示从127.0.0.1这个客户端连接radius服务所需要用的密码。
2) 修改 naslist ,加入:
[code:1:fcc7e996cf]
# vi /usr/local/freeradius/etc/raddb/naslist
localhost local portslave
[/code:1:fcc7e996cf]

3) 编辑 users ,加入用户: (这个用户是保存在文本文件里的,做测试用)
[code:1:fcc7e996cf]
# vi /usr/local/freeradius/etc/raddb/users
hefish Auth-Type:=local, 
          User-Password==123456,
          Service-Type = Framed-User,
          Framed-Protocol = PPP,
          Framed-IP-Address = 10.0.0.2,
          Framed-IP-Netmask = 255.255.255.0 
[/code:1:fcc7e996cf]

4) 启动radiusd,测试radiusd服务:
[code:1:fcc7e996cf]
# /usr/local/freeradius/sbin/radiusd -X
# /usr/local/freeradius/bin/radtest hefish 123456 localhost 0 123456 

[/code:1:fcc7e996cf]


如果有类似 Access-Accept的字样出现,则表示radius开始工作了。下一步就是要培植radiusd用mysql来认证。

5) 先在mysql里面创建数据库;
[code:1:fcc7e996cf]
# /usr/local/mysql/bin/mysqladmin -u root -p create radius
# cd freeradius-1.0.4/src/modules/rlm_sql/drivers/rlm_sql_mysql
# /usr/local/mysql/bin/mysql -u root -p radius < db_mysql.sql
[/code:1:fcc7e996cf]


6) 编辑 radius.conf 使其支持mysql认证;
[code:1:fcc7e996cf]
# vi /usr/local/freeradius/etc/raddb/radius.conf 
authorize {
preprocess
chap
mschap
suffix
sql
...
}

accounting {
...
sql
...
}
[/code:1:fcc7e996cf]

7) 编辑 sql.conf ,使radius可以访问mysql
[code:1:fcc7e996cf]
# vi /usr/local/freeradius/etc/raddb/sql.conf
sql {
driver = "rlm_sql_mysql"
server = "localhost"
login = "root"
password = "mysql的密码"
radius_db = "radius"
// 剩下的配置就默认吧 (如果您要做用户帐号/网卡MAC/电话号码绑定之类的东西,那就例外,可以改下面的配置)
}
[/code:1:fcc7e996cf]

8) 向数据库里增加一些数据;
[code:1:fcc7e996cf]
# /usr/local/mysql/bin/mysql -u root -p radius
先加入一些组信息:
insert into radgroupreply (groupname,attribute,op,value) values ('user','Auth-Type',':=','Local');
insert into radgroupreply (groupname,attribute,op,value) values ('user','Service-Type','=','Framed-User');
insert into radgroupreply (groupname,attribute,op,value) values ('user','Framed-IP-Netmask','=','255.255.255.255');
insert into radgroupcheck (groupname, attribute, op, value) values ("user", "Auth-Type", ":=", "Local");

然后加入用户信息:
insert into radcheck (username,attribute,op,value) values ('heyu','User-Password','==','123456');

然后把用户加到组里:
insert into usergroup(username,groupname) values('heyu','user');
[/code:1:fcc7e996cf]


9) 为了让radius能正确地调用mysql,还要指定一下库的位置:
[code:1:fcc7e996cf]
# echo /usr/local/freeradius/lib >> /etc/ld.so.conf
# ldconfig
[/code:1:fcc7e996cf]

10) 启动radiusd , 做一下测试:
[code:1:fcc7e996cf]
# /usr/local/freeradius/sbin/radiusd -X 
# /usr/local/freeradius/bin/radtest heyu 123456 localhost 0 123456 
[/code:1:fcc7e996cf]

看到 Access-Accept 之类的字样就表示OK了。 这时可以正式启动radiusd 
[code:1:fcc7e996cf]
# /usr/local/freeradius/sbin/radiusd
[/code:1:fcc7e996cf]

4、配置pppd,使其和radius一起工作;
1) 建立一个 /etc/ppp/radius 目录,用来存放radius的配置,然后把ppp-2.4.3里面的radius相关配置复制过来:
[code:1:fcc7e996cf]
# mkdir /etc/ppp/radiuds
# cd ppp-2.4.3/pppd/plugins/radius/etc
# cp * /etc/ppp/radius
[/code:1:fcc7e996cf]

2) 编辑 /etc/ppp/options , 加上radius 支持
[code:1:fcc7e996cf]
# vi /etc/ppp/options 加上下面两句
plugin /etc/ppp/plugins/radius.so // 注意pppd安装时候radius.so的位置
radius-config-file /etc/ppp/radius/radiusclient.conf
[/code:1:fcc7e996cf]

3) 编辑 radiusclient.conf 文件,如下:(主要是修改一些默认的文件路径,其他没什么要改的)
[code:1:fcc7e996cf]
# cat /etc/ppp/radius/radiusclient.conf
auth_order radius
login_tries 4
login_timeout 60
nologin /etc/nologin
issue /etc/ppp/radius/issue
authserver localhost:1812
acctserver localhost:1813
servers /etc/ppp/radius/servers
dictionary /etc/ppp/radius/dictionary
login_radius /usr/local/sbin/login.radius
seqfile /var/run/radius.seq
mapfile /etc/ppp/radius/port-id-map
default_realm
radius_timeout 10
radius_retries 3
login_local /bin/login
[/code:1:fcc7e996cf]


4) 编辑 servers ,设定radius 服务器的位置
[code:1:fcc7e996cf]
# cat /etc/ppp/radius/servers 
localhost 123456 // 这里的123456是我前面设置的访问radius服务器的密码
[/code:1:fcc7e996cf]

5) 编辑 dictionary ,修改一些路径设置,主要是最后一个dictionary.microsoft 的路径设置
[code:1:fcc7e996cf]
# vi /etc/ppp/radius/dictionary
..
...
INCLUDE /etc/ppp/radius/dictionary.microsoft
[/code:1:fcc7e996cf]

6) 可以拨号看看了,用数据库里面的帐号登录看看,应该是能登录了。所有的登录记录,都会保存在mysql的radacct表里面,统计十分方便。


good luck....

 platinum 回复于:2005-07-09 02:06:25
2) 编辑 /etc/ppp/options , 加上radius 支持 
代码: 

# vi /etc/ppp/options 加上下面两句 
plugin /etc/ppp/plugins/radius.so // 注意pppd安装时候radius.so的位置 
radius-config-file /etc/ppp/radius/radiusclient.conf 
 


3) 编辑 radiusclient.conf 文件,如下:(主要是修改一些默认的文件路径,其他没什么要改的) 
代码: 

# cat /etc/ppp/radius/radiusclient.conf 
auth_order radius 
login_tries 4 
login_timeout 60 
nologin /etc/nologin 
issue /etc/ppp/radius/issue 
authserver localhost:1812 
acctserver localhost:1813 
servers /etc/ppp/radius/servers 
dictionary /etc/ppp/radius/dictionary 
login_radius /usr/local/sbin/login.radius 
seqfile /var/run/radius.seq 
mapfile /etc/ppp/radius/port-id-map 
default_realm 
radius_timeout 10 
radius_retries 3 
login_local /bin/login 
 
这是关键!
恭喜 hefish,也谢谢你^_^

 jinscan 回复于:2005-07-09 05:58:49
支持

 ys87918578 回复于:2005-07-09 09:09:23
顶!!!

 水若寒 回复于:2005-07-09 09:55:27
很好,支持!

 Linux@初学者 回复于:2005-07-09 10:09:55
好贴,支持

 5cool 回复于:2005-07-09 10:11:21
狂顶

 5cool 回复于:2005-07-09 10:36:37
为什么要用2.4的内核?用2.6内核可以吗?

 hefish 回复于:2005-07-09 15:25:45
2.4纯属个人爱好,
2.6也可。

 qwent 回复于:2005-07-09 16:40:17
正想找这东西.谢谢了

 abombman 回复于:2005-08-25 10:38:55
谢谢hefish,按文章的指导,大部分程序已调通了,但就是最后一步pppoe和radius不能连接起来。我无法找到radiusclient.conf文件中所指明的login.radius和radius.seq两文件,连接失败不知是否与之有关?烦请hefish帮助一下,十分感谢!

原文转自:http://www.ltesting.net