最近两天花精力把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 在 http:///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下做这个坏事比较方便:


  1. # apt-get remove ppp pppconfig pppoe pppoeconf


复制代码


1、重编译内核,加入PPP和PPPOE的支持;


首先解压内核源码,然后把MPPC+MPPE的补丁打上。之后就make menuconfig , 加入以下支持:

1.  code maturity level options——<;
2.      [*]prompt for development and/or incomplete code/drivers
3.  networking options——<;
4.      [*]packet socket
5.      [*]packet socket:mmapped io
6.  network device support——<;
7.      ;PPP (point-to-point protocol) support
8.          [*]PPP multilink support (EXPERIMENTAL)
9.          ;PPP support for async serial ports
10.          ;PPP support for sync tty ports
11.          ;PPP Deflate compression
12.          ;PPP BSD-Compress compression
13.          ;Microsoft PPP compression/encryption (MPPC/MPPE)
14.          ;PPP over Ethernet (EXPERIMENTAL)
15.  character devices——<;
16.      [*]non-standard serial port support
17.          [M]hdlc line discipline support
18.  Cryptographic options---<; 
19.      [M]SHA1 digest algorithm
20.      [M]ARC4 cipher algorithm

复制代码



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



2、创建一个/dev/ppp 设备文件,这是ppp拨号所必需的。


  1. # mknod --mode=664 /dev/ppp c 108 0


复制代码



3、确保 /etc/modules.conf 里面有如下几行:


  1. alias char-major-108 ppp_generic
  2. alias tty-ldisc-3 ppp_async
  3. alias tty-ldisc-13 n_hdlc
  4. alias tty-ldisc-14 ppp_synctty
  5. alias net-pf-24 pppoe


复制代码



4、安装 ppp-2.4.3.tar.gz


解压缩之后,打上ppp-2.4.3-mppe-mppc-1.1.patch.gz 补丁,然后编译安装:

1.  # tar zxvf php-2.4.3.tar.gz
2.  # gunzip ppp-2.4.3-mppe-mppc-1.1.patch.gz
3.  # patch -p0 < ppp-2 -mppe-mppc-patchbr style='font-size:12px;font-style:normal;font-weight:normal;font-family:Monaco, Consolas, ' Lucida Console Courier New serifcolorrgb />
4.  # cd ppp-2.4.3
5.  # ./configure
6.  # make 
7.  # make install install-etcppp
8.  # chmod u+s /usr/local/sbin/pppd
9.  # cd ..


复制代码



5、安装rp-pppoe


  1. # tar zxvf rp-pppoe-3.5.tar.gz
  2. # cd rp-pppoe-3.5/src
  3. # ./configure --prefix=/usr/local --enable-plugin=../../ppp-2.4.3
  4. # make 
  5. # make install


复制代码



6、把生成的/radius.so等模块复制到ppp的配置目录里


  1. # cp /usr/local/lib/pppd/2.4.3/* /etc/ppp/plugins


复制代码



7、配置 /etc/ppp/options


  1. # cat /etc/ppp/options
  2. lock
  3. crtscts
  4. nobsdcomp
  5. nodeflate
  6. nopcomp


复制代码



8、配置 /etc/ppp/pppoe-server-options


  1. # cat /etc/ppp/pppoe-server-options
  2. auth
  3. require-chap
  4. default-mru
  5. default-asyncmap
  6. lcp-echo-interval 60
  7. lcp-echo-failure 5
  8. ms-dns 192.168.0.2
  9. ms-dns 61.132.90.92
  10. noipdefault
  11. noipx
  12. nodefaultroute
  13. noproxyarp
  14. noktune
  15. 10.0.0.1:10.0.0.200
  16. netmask 255.255.255.255
  17. logfile /var/log/pppd.log


复制代码




* 这里 192.168.0.2 和 61.132.90.92是我使用的dns


* 10.0.0.1:10.0.0.200 是客户端分配的IP区间



9、设置密码文件 (先实现文本文件密码认证)


  1. # cat /etc/ppp/chap-secrets
  2. hefish  * 123456 *


复制代码



10、启动pppoe拨入服务:


  1. /usr/local/sbin/pppoe-server -k -I eth0 -L 192.168.1.123 -R 10.0.0.1 -N 128


复制代码



* -k 使用PPP的kernel mode


* -I eth0 启动pppoe拨号接入的网卡设备


* -L 本地地址IP


* -R 客户端起始IP


* -N 最大并发连接数



11、启动IP转发,使客户端可以通过pppoe服务器访问外网。


  1. # echo 1 <; /proc/sys/net/ipv4/ip_forward
  2. # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE -s 0/0


复制代码





启动之后就可以使用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更是不在话下。没说的,就安装:


  1. # tar zxvf freeradius-1.0.4.tar.gz
  2. # cd freeradius-1.0.4
  3. # ./configure --prefix=/usr/local/freeradius
  4. # make 
  5. # make install


复制代码



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



3、配置freeradius;


1) 修改 clients.conf


  1. # vi /usr/local/freeradius/etc/raddb/clients.conf
  2. client 127.0.0.1 {
  3. secret = 123456
  4. shortname = localhost
  5. nastype = other
  6. }


复制代码



这里secret = 123456 表示从127.0.0.1这个客户端连接radius服务所需要用的密码。


2) 修改 naslist ,加入:


  1. # vi /usr/local/freeradius/etc/raddb/naslist
  2. localhost local portslave


复制代码



3) 编辑 users ,加入用户: (这个用户是保存在文本文件里的,做测试用)

1.  # vi /usr/local/freeradius/etc/raddb/users
2.  hefish Auth-Type:=local, 
3.            User-Password==123456,
4.            Service-Type = Framed-User,
5.            Framed-Protocol = PPP,
6.            Framed-IP-Address = 10.0.0.2,
7.            Framed-IP-Netmask = 255.255.255.0


复制代码



4) 启动radiusd,测试radiusd服务:


  1. # /usr/local/freeradius/sbin/radiusd -X
  2. # /usr/local/freeradius/bin/radtest hefish 123456 localhost 0 123456


复制代码




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



5) 先在mysql里面创建数据库;


  1. # /usr/local/mysql/bin/mysqladmin -u root -p create radius
  2. # cd freeradius-1.0.4/src/modules/rlm_sql/drivers/rlm_sql_mysql
  3. # /usr/local/mysql/bin/mysql -u root -p radius < db mysqlsqlli>


复制代码




6) 编辑 radius.conf 使其支持mysql认证;

1.  # vi /usr/local/freeradius/etc/raddb/radius.conf 
2.  authorize {
3.  preprocess
4.  chap
5.  mschap
6.  suffix
7.  sql
8.  ...
9.  }
10.  
11.  accounting {
12.  ...
13.  sql
14.  ...
15.  }


复制代码



7) 编辑 sql.conf ,使radius可以访问mysql


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


复制代码



8) 向数据库里增加一些数据;


  1. # /usr/local/mysql/bin/mysql -u root -p radius
  2. 先加入一些组信息:
  3. insert into radgroupreply (groupname,attribute,op,value) values ('user','Auth-Type',':=','Local');
  4. insert into radgroupreply (groupname,attribute,op,value) values ('user','Service-Type','=','Framed-User');
  5. insert into radgroupreply (groupname,attribute,op,value) values ('user','Framed-IP-Netmask','=','255.255.255.255');
  6. insert into radgroupcheck (groupname, attribute, op, value) values ("user", "Auth-Type", ":=", "Local");
  7. 然后加入用户信息:
  8. insert into radcheck (username,attribute,op,value) values ('heyu','User-Password','==','123456');
  9. 然后把用户加到组里:
  10. insert into usergroup(username,groupname) values('heyu','user');


复制代码




9) 为了让radius能正确地调用mysql,还要指定一下库的位置:


  1. # echo /usr/local/freeradius/lib <;<; /etc/ld.so.conf
  2. # ldconfig


复制代码



10) 启动radiusd , 做一下测试:


  1. # /usr/local/freeradius/sbin/radiusd -X 
  2. # /usr/local/freeradius/bin/radtest heyu 123456 localhost 0 123456


复制代码



看到 Access-Accept 之类的字样就表示OK了。 这时可以正式启动radiusd


  1. # /usr/local/freeradius/sbin/radiusd


复制代码



4、配置pppd,使其和radius一起工作;


1) 建立一个 /etc/ppp/radius 目录,用来存放radius的配置,然后把ppp-2.4.3里面的radius相关配置复制过来:


  1. # mkdir /etc/ppp/radiuds
  2. # cd ppp-2.4.3/pppd/plugins/radius/etc
  3. # cp * /etc/ppp/radius


复制代码



2) 编辑 /etc/ppp/options , 加上radius 支持


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


复制代码



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

1.  # cat /etc/ppp/radius/radiusclient.conf
2.  auth_order radius
3.  login_tries 4
4.  login_timeout 60
5.  nologin /etc/nologin
6.  issue /etc/ppp/radius/issue
7.  authserver localhost:1812
8.  acctserver localhost:1813
9.  servers /etc/ppp/radius/servers
10.  dictionary /etc/ppp/radius/dictionary
11.  login_radius /usr/local/sbin/login.radius
12.  seqfile /var/run/radius.seq
13.  mapfile /etc/ppp/radius/port-id-map
14.  default_realm
15.  radius_timeout 10
16.  radius_retries 3
17.  login_local /bin/login


复制代码




4) 编辑 servers ,设定radius 服务器的位置


  1. # cat /etc/ppp/radius/servers 
  2. localhost 123456 // 这里的123456是我前面设置的访问radius服务器的密码


复制代码



5) 编辑 dictionary ,修改一些路径设置,主要是最后一个dictionary.microsoft 的路径设置


  1. # vi /etc/ppp/radius/dictionary
  2. ..
  3. ...
  4. INCLUDE /etc/ppp/radius/dictionary.microsoft


复制代码



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




good luck....