硬件环境: LH3000 CPU 2*PIII1000MHZ/MEM 2*1G/2*SCSI HDD 34G(raid1)/2*Intel(R) PRO/1000
软件环境: RHEL 3
网络环境:
eth0: 192.168.1.2/255.255.255.0 gw 192.168.1.1
路由1--eth0
路由1配置 ip route 192.168.0.0 255.255.0.0 192.168.1.2 (192.168.0.0/16的网段由pppoe分配)
eth1: (用户接入口,配vlan口)
eth1---(switch1)--用户pc1
switch1定义vlan
用到的包:
ppp-2.4.4.tar.gz 在
linux-2.4.33.3.tar.bz2 在
ppp-2.4.3-mppe-mppc-1.1.patch.gz 和 linux-2.4.31-mppe-mppc-1.3.patch.gz 在
(ppp-2.4.4-mppe-mppc-1.1.patch 由下文所述生成)
rp-pppoe-3.8.tar.gz 在
mysql-5.0.24a.tar.gz 在
http://dev.mysql.comfreeradius-1.1.3.tar.bz2 在
所有文件放在同一个目录下如:/root/package
1、重编译内核,加入PPP和PPPOE的支持;
首先解压内核源码,
tar xjvf linux-2.4.33.3.tar.bz2 -C /usr/src
ln -s /usr/src/linux-2.4.33.3 /usr/src/linux
cd /usr/src/linux
然后把MPPC+MPPE的补丁打上。
gzip -d linux-2.4.31-mppe-mppc-1.3.patch.gz
patch -p1 < linux-2.4.31-mppe-mppc-1.3.patch
之后就
cp /boot/config-2.4.21-4.ELsmp .config
make menuconfig
加入以下支持:
code maturity level options——>;
[*]prompt for development and/or incomplete code/drivers
networking options——>;
[*]packet socket
[*]packet socket:mmapped io
802.1Q VLAN Support
network device support——>;
Bonding driver support (为以后着想,bonding可以增加网络带宽)
;PPP (point-to-point protocol) support
[*]PPP multilink support (EXPERIMENTAL)
;PPP support for async serial ports
;PPP support for sync tty ports
;PPP Deflate compression
;PPP BSD-Compress compression
;Microsoft PPP compression/encryption (MPPC/MPPE)
;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
按照上面的配置重新编译内核,
make dep && make bzImage && make modules && make modules_install
然后安装内核,
cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.33.3
cp vmlinux /boot/vmlinux-2.4.33.3
cp System.map /boot/System.map-2.4.33.3
cd /boot
rm System.map
ln -s System.map-2.4.33.3 System.map
mkinitrd initrd-2.4.33.3.img 2.4.33.3
vi grub/grub.conf
加入
title Red Hat Enterprise Linux AS (2.4.33.3)
root (hd0,0)
kernel /vmlinuz-2.4.33.3 ro root=LABEL=/
initrd /initrd-2.4.33.3.img
并用它启动完毕后,备用。
2、确信/dev/ppp设备文件存在
ls /dev/ppp
若没有创建一个/dev/ppp 设备文件,这是ppp拨号所必需的。
mknod --mode=664 /dev/ppp c 108 0
3、确保 /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 vlan 8021q
#alias bond0 bonding
4、安装 ppp-2.4.3.tar.gz
解压缩之后,打上ppp-2.4.3-mppe-mppc-1.1.patch.gz 补丁,然后编译安装:
tar zxvf ppp-2.4.4.tar.gz
gunzip ppp-2.4.3-mppe-mppc-1.1.patch.gz
cd ppp-2.4.4
patch -p1 < ppp-2.4.3-mppe-mppc-1.1.patch (在打补丁ccp.c时有一处错误,手动修改即可,具体位置923-1300行)
cd ..
tar zxvf ppp-2.4.4.tar.gz -C ppp-2.4.4.orig
diff -ruN ppp-2.4.4.orig ppp-2.4.4 > ppp-2.4.4-mppe-mppc-1.1.patch (以后使用)
cd ppp-2.4.4
./configure
make
make install install-etcppp
5、安装rp-pppoe
tar zxvf rp-pppoe-3.8.tar.gz
cd rp-pppoe-3.8/src
./configure --prefix=/usr/local --enable-plugin=../../ppp-2.4.4
make
make install
6、把生成的rp-pppoe.so/radius.so等模块复制到ppp的配置目录里
cp /usr/local/lib/pppd/2.4.4/* /etc/ppp/plugins
7、配置 /etc/ppp/options
lock
crtscts
nobsdcomp
nodeflate
nopcomp
8、配置 /etc/ppp/pppoe-server-options
auth
require-pap (由于我的用户密码在mysql中是加密的,所有只能用pap方式认证)
#require-chap (用户密码是明文的话,可以使用eap,chap等方式)
default-mru
default-asyncmap
lcp-echo-interval 60
lcp-echo-failure 5
ms-dns 192.168.0.* (用户首选dns)
ms-dns 192.168.1.* (用户备用dns)
noipdefault
noipx
nodefaultroute
proxyarp
noktune
logfile /var/log/pppd.log
9、设置密码文件/etc/ppp/pap-secrets (先实现文本文件密码认证)
wys * 123456 *
10、启动pppoe拨入服务:
vi /root/1.txt
加入
192.168.1.250-254
/usr/local/sbin/pppoe-server -k -I eth1 -p /root/1.txt
* -k 使用PPP的kernel mode
* -I eth1 启动pppoe拨号接入的网卡设备
* -p 1.txt 只允许分配192.168.1.250-254的ip地址
11、启动IP转发,使客户端可以通过pppoe服务器访问外网。
echo 1 > /proc/sys/net/ipv4/ip_forward
启动之后就可以使用PPPOE拨号接入了。
客户端可以采用win2000+raspppoe或者WinXP自带的pppoe.
如果拨号之后无法访问拨号服务器,那就把客户端的PPP设置里面的启用软件压缩去掉,即可。
12、安装mysql
groupadd mysql
useradd -g mysql mysql
gunzip < mysql-5.0.24a.tar.gz | tar -xvf -
cd mysql-5.0.24a
CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors \
-fno-exceptions -fno-rtti" ./configure \
--prefix=/usr/local/mysql --enable-assembler \
--with-mysqld-ldflags=-all-static \
--enable-thread-safe-client (freeradius要使用libmysqlclient_r.so的库)
make
make install
cp support-files/my-medium.cnf /etc/my.cnf
cd /usr/local/mysql
bin/mysql_install_db --user=mysql
chown -R root .
chown -R mysql var
chgrp -R mysql .
bin/mysqld_safe --user=mysql &
bin/mysqladmin -u root password 'yourpassword'
mysql/bin/mysql -u root -p
mysql>GRANT ALL PRIVILEGES ON *.* TO IDENTIFIED by 'yourpassword' WITH GRANT OPTION;
(在windows下用mysql-cc管理mysql,删除多余用户和库)
mysql>quit;
13、把freeradius安装一下;
freeradius是个很周到的东西,考虑到了n多种后台,什么oracle,mssql, ldap,mysql都支持.
tar xvjf freeradius-1.1.3.tar.gz
cd freeradius-1.1.3
./configure --prefix=/usr/local/freeradius
make
make install
有一点要说明,freeradius需要openssl 库,所以如果系统里没安装的话,还是要事先安装一下的。
14、配置freeradius;
1) 修改 /usr/local/freeradius/etc/raddb/clients.conf
client 127.0.0.1 {
secret = 123456
shortname = localhost
nastype = other
}
这里secret = 123456 表示从127.0.0.1这个nas连接radius服务所需要用的密码。
2) 修改 /usr/local/freeradius/etc/raddb/naslist ,加入:
localhost local portslave
3) 编辑 /usr/local/freeradius/etc/raddb/users ,加入用户: (这个用户是保存在文本文件里的,做测试用)
wys Auth-Type:=local,User-Password==123456,
Service-Type = Framed-User,
Framed-Protocol = PPP
4) 启动radiusd,测试radiusd服务:
/usr/local/freeradius/sbin/radiusd -X
/usr/local/freeradius/bin/radtest wys 123456 localhost 0 123456
如果有类似 Access-Accept的字样出现,则表示radius开始工作了。下一步就是要培植radiusd用mysql
5) 先在mysql里面创建数据库;
/usr/local/mysql/bin/mysqladmin -u root -p create radius
/usr/local/mysql/bin/mysql -u root -p radius < freeradius-1.1.3/doc/examples/mysql.sql
6) 编辑 /usr/local/freeradius/etc/raddb/radiusd.conf 使其支持mysql认证;
authorize {
preprocess
chap
mschap
suffix
sql
...
}
accounting {
...
#radutmp (因为我要使用Simultaneous-Use:=1(同一用户一次只能登陆一台机器),用它在radiusd意外结束会有问题,所以禁用)
sql
...
}
session {
#radutmp (同上)
sql
}
7) 编辑 /usr/local/freeradius/etc/raddb/sql.conf,使radius可以访问mysql
sql {
driver = "rlm_sql_mysql"
server = "localhost"
login = "root"
password = "mysql的密码"
radius_db = "radius"
//剩下的配置就默认吧 (如果您要做用户帐号/网卡MAC/电话号码绑定之类的东西,那就例外,可以改下面的配置)
}
8) 向数据库里增加一些数据;
/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-Protocol','=','ppp');
insert into radgroupcheck (groupname, attribute, op, value) values ('user', 'Auth-Type', ':=', 'Crypt-Local');
insert into radgroupcheck (groupname, attribute, op, value) values ('user', 'Simultaneous-Use', ':=', '1');
因为用户密码是加密的,所以有Crypt-Local.
然后加入用户信息:
insert into radcheck (username,attribute,op,value) values ('wys','Crypt-Password','==','用户加密密码');
然后把用户加到组里:
insert into usergroup(username,groupname) values('wys','user');
9) 为了让radius能正确地调用mysql,还要指定一下库的位置:
echo /usr/local/freeradius/lib > /etc/ld.so.conf
ldconfig
10) 启动radiusd , 做一下测试:
/usr/local/freeradius/sbin/radiusd -X
/usr/local/freeradius/bin/radtest wys 用户密码 localhost 0 123456
看到 Access-Accept 之类的字样就表示OK了。 这时可以正式启动radiusd
/usr/local/freeradius/sbin/radiusd -X &
15、配置pppd,使其和radius一起工作;
1) 建立一个 /etc/ppp/radius 目录,用来存放radius的配置,然后把ppp-2.4.3里面的radius相关配置复制过来:
mkdir /etc/ppp/radiuds
cd ppp-2.4.4/pppd/plugins/radius/etc
cp * /etc/ppp/radius
2) 编辑 /etc/ppp/options, 加上radius 支持
plugin /etc/ppp/plugins/radius.so // 注意pppd安装时候radius.so的位置
radius-config-file /etc/ppp/radius/radiusclient.conf
3) 编辑 /etc/ppp/radius/radiusclient.conf 文件,如下:(主要是修改一些默认的文件路径,其他没什么要改的)
auth_order radius
login_tries 4
login_timeout 60
nologin /sbin/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
4) 编辑 /etc/ppp/radius/servers ,设定radius 服务器的位置
localhost 123456 // 这里的123456是我前面设置的nas(localhost)访问radius服务器的密码
5) 编辑/etc/ppp/radius/dictionary ,修改一些路径设置,主要是最后一个dictionary.microsoft 的路径设置
..
...
INCLUDE /etc/ppp/radius/dictionary.microsoft
6) 可以拨号看看了,用数据库里面的帐号登录看看,应该是能登录了。所有的登录记录,都会保存在mysql的radacct表里面.
15、vlan及网络接口配置
1) /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.2
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
2) /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
3)/etc/sysconfig/network-scripts/ifcfg-eth1.2 (定义vlan 2,vlan定义从2开始,详见man vconfig)
DEVICE=eth1.2
ONBOOT=yes
VLAN=yes
其它vlan定义类似.
4)定义eth1连接的switch1的接口
switchport trunk encapsulation dot1q
5)定义switch上的vlan,并将端口分配给各个vlan.
如:
int f0/48
switchport access vlan 2
分配f0/48口给vlan 2.
15、未描述的工作:
PPPOE测试完成后,清除/etc/ppp/pap-secrets中的内容
Radius测试完成后,清除/usr/local/freeradius/etc/raddb/users中的内容
尝试在一块网卡上实现所有功能,但连接后最大ping包为1446,网络访问有问题.
正常使用时,修改/etc/sysctl.conf
net.ipv4.ip_forward =1
修改/etc/rc.local,加入
/usr/local/mysql/bin/mysqld_safe --user=mysql &
sleep 10
/usr/local/freeradius/sbin/radiusd -X &
sleep 10
/usr/local/sbin/pppoe-server -k -I eth1.2 -p /etc/ppp/radius/vlan2.txt
...
/usr/local/sbin/pppoe-server -k -I eth1.38 -p /etc/ppp/radius/vlan38.txt
...
生成/etc/ppp/radius/vlan2.txt等vlan ip分配文件.内容如下
192.168.2.1-254
修改switch1的普通端口,使端口之间不能互访。
如:
int f0/48
switchport mode protect
从 下载e1000驱动,编译安装.
16、其它
尚需加入802.1x支持,主要在设备端配置.尚需完成以radius为中心的统一认证平台(对内).还可以构建vpn,路由上或本机.
17.补充事项:
1)pppd-2.4.4本身支持eap,但不支持eap-tls相关补丁为,插件radius只支持pap,chap,mschap几种认证方式,没有eap相关补丁.所以对于pppoe+eap-ttls+radius的认证方式(用户密码为md5或des加密的情况)只能自己写相关代码或等待了.
3)freeradius有一些内部attribute,有兴趣可以研究一下.