在 Ubuntu 12.04 上配置 Radius 和 LDAP 服务

上次提到了我们实验室的 Wi-Fi 更改了认证方式,不再使用 WPA2/PSK 通用密码,而是通过 LDAP 把 Wi-Fi 上网密码和个人帐号联系起来,大家只需要用自己平时的 Unix/Linux/Mail/GroupWise 帐号就可以登陆 Wi-Fi,那么如何配置这样一个系统呢?涉及到的东西有点多,首先需要一个支持 Radius 的无线路由器,然后需要一台装有 Radius 的服务器,这台服务器还需要作为 LDAP 客户端和 LDAP 服务器连起来。

准备工作

  • Linksys WRT 54GS 无线路由器,可以替换开源固件的 hacker-friendly 路由器;
  • DD-WRT 固件,刷固件的过程可以参考:把 Linksys WRT54GL 路由器当作交换机用
  • FreeRadius 服务,安装在一台 Ubuntu 服务器上;
  • LDAP 客户端,安装在同一台 Ubuntu 服务器上;
  • LDAP 服务器,一般安装在另一台服务器上,也可以和上面的 FreeRadius/LDAP client 装在一起,LDAP 服务器的配置和安装过程超出本文范围,这里不介绍。

配置 Wi-Fi

刷固件以后按照下图配置 Linksys WRT 54GS,指定 Radius 服务器的 IP 和端口、安全模式、WPA 算法、WPA Shared Key 等,这个 WPA Shared Key 由下面的 FreeRadius 配置指定:

dd-wrt and radius

安装和配置 LDAP

这里只是安装 LDAP 客户端,不包括 LDAP 服务器的安装,所以需要事先知道 LDAP 服务器的 IP 或域名等相关信息。

$ sudo apt-get install ldap-auth-client ldap-auth-config libpam-ldap

填入 LDAP 服务器地址 host, base 等:

$ sudo vi /etc/ldap.conf
host ldap.vpsee.com
base dc=vpsee,dc=com
pam_password exop
pam_lookup_policy yes

nss_initgroups_ignoreusers Debian-exim,backup,bin,daemon,dhcp,games,gnats,irc,klog,libuuid
,list,lp,mail,man,news,ntpd,proxy,root,snmp,sshd,statd,sync,sys,syslog,uucp,www-data

确认 nsswitch.conf 先搜索本地文件,用户登陆的时候先检索本地 /etc/passwd 找不到相关用户名再检索 ldap 服务器上的用户数据库:

$ sudo vi /etc/nsswitch.conf
passwd:         files ldap
group:          files ldap
shadow:         files ldap
automount:      files

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

安装和配置 FreeRadius

安装 FreeRadius:

$ sudo apt-get install freeradius freeradius-utils freeradius-ldap openssl 

编辑 clients.conf,确定哪个 IP 范围可以访问 Radius 服务,这里 secret 一行的 testing123 就是上面 DD-WRT 要用到的 WPA Shared Key:

$ sudo vi /etc/freeradius/clients.conf
...
client 192.168.2.0/24 {
        require_message_authenticator = no
        secret          = testing123
        shortname       = vpsee-network
}
...

配置 default,确定 pam 一行没有被注释掉:

$ sudo vi /etc/freeradius/sites-available/default
...
authorize {
        preprocess
        chap
        mschap
        suffix
        eap {
                ok = return
        }
        unix
        files
        expiration
        logintime
        pap
}
...
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        pam
        unix
        eap
}
...

同样的确定 inner-tunnel 配置文件里面的 pam 一行没有被注释掉:

$ sudo vi /etc/freeradius/sites-available/inner-tunnel
...
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        pam
        unix
        eap
}
...

在 users 加入下面认证类型:

$ sudo vi /etc/freeradius/users
...
DEFAULT Auth-Type = PAM
      Fall-Through = 1
...

测试

配置完毕后重启 freeradius:

$ sudo /etc/init.d/freeradius restart

如果要 debug 的话这样启动 freeradius:

$ sudo /etc/init.d/freeradius stop
$ sudo freeradius -X

先测试使用 LDAP 方式登陆系统是否正确,使用 LDAP 用户名和密码从另一台电脑 ssh 登陆到这台 Radius 服务器,如果不用本地帐号而用 LDAP 帐号顺利登陆的话就说明这台服务器已经能顺利使用 LDAP 登陆了:

$ ssh [email protected]

测试 Radius 服务是否能正确从 LDAP 那里得到验证信息,使用 ldap 用户名和密码测试 Radius 服务是否反馈正确消息 Access-Accept:

$ radtest vpsee "password" 192.168.2.65 1 testing123
Sending Access-Request of id 233 to 192.168.2.65 port 1812
	User-Name = "vpsee"
	User-Password = "password"
	NAS-IP-Address = 192.168.2.65
	NAS-Port = 1
rad_recv: Access-Accept packet from host 192.168.2.65 port 1812, id=233, length=20

另一种办法

另外有个办法是不用 pam 的方式,直接用 freeradius-ldap 模块和 LDAP 服务器连接,这种办法不适合我们实验室的应用场景,不过配置要简单一些。简单说一下就是利用 freeadius 的 ldap 模块直接连接 LDAP 服务器验证用户。先安装 freeradius-ldap 模块:

$ sudo apt-get install freeradius-ldap

然后配置 clients.conf

$ sudo vi /etc/freeradius/module/ldap
...
ldap {
        server = "ldap.vpsee.com"
        identity = "cn=admin,o=My Org,c=UA"
        password = mypass
        basedn = "o=My Org,c=UA"
        filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
...

然后取消下面2个文件里面关于 ldap 的相关注释:

$ sudo vi /etc/freeradius/sites-available/default
$ sudo vi /etc/freeradius/sites-available/inner-tunnel

重启 freeradius 让配置生效:

$ sudo /etc/init.d/freeradius restart

解决 Linksys WRT54GL 刷固件问题

周末忙着为大家开通 VPS,谢谢大家的信任,虽然 VPSee 在购买须知里面推荐大家月付的方式付款,但是大家都是选择的两月付或半年付,对一个刚出炉的 VPS provider 来说是一个极大的鼓舞啊~~大家 “抱怨” 流量小主要是因为我们保留了大量流量来做备份,经过仔细考虑后我们决定把所有 VPS 流量增加一倍,已经购买的朋友不用担心、我们已经邮件通知了并且你们的 VPS 已经免费升级到了最新的流量,相信你们不会拒绝:)

上周收到一个被损坏的 Linksys WRT54GL,说是硬件都是好的,就是不能刷固件,用电脑连上路由器后不能 ping 通,所以也没办法进入路由器操作界面刷固件。还好,网上关于 Linksys WRT54GL 的资料很多,很容易就找到一篇 The Wrt54g Revival Guide,根据教程把 Linksys WRT54GL 拆开以后找到 flash 芯片,然后找到它的15和16脚线,用一个螺丝刀插在15和16脚线中间(接触一下就可以了),然后接上电源连接网络后就应该可以 ping 通,最后用 tftp 上传固件就可以了:

$ cd Tomato_1_27
$ tftp 192.168.1.1
tftp> bin
tftp> put WRT54G_WRT54GL.bin

Linksys WRT54GL 的内部是这个样子的:

inside linksys wrt54gl

在操作的时候双手腾不出来,没办法自拍,下面的图片直接取自 The Wrt54g Revival Guide

short linksys wrt54gl

把 Linksys WRT54GL 路由器当作交换机用

不知道各种无线信号会不会对人体产生危害,反正我每天都沉浸在大量的无线网络中:(,手机、无线路由器、无线网卡、笔记本、蓝牙、GPS、⋯⋯,都在发送或者接收信号,想逃都逃不了。我们在工作区部署了6个 Linksys WRT54GL 路由器,用来扩展我们的网络,特别是那些网线不能到达的地方,比如有的人有在厕所上网的习惯:),除了普通上网,无线网络还负责接入手机以便使用 VoIP 功能

Linksys WRT54GL 是一款是非常 hacker-friendly 的路由器,Cisco 开放了它的固件源代码,本来 Cisco 是不愿意公开源代码的,被人发现固件使用的是 Linux,Linux 是基于 GPL2 协议,迫于公众的压力 Cisco 才开放全部源代码,这也就带动了开源社区,开发者纷纷开发出针对这款路由器的固件(firmware),比如 OpenWRT, DD-WRT, Tomato 等,这些都是基于 Linux 的 Open Source 固件,可以通过在上面安装软件、修改配置等办法以挖掘出路由器的最大潜能,有的人甚至拿 Linksys WRT54GL 做 Wifi 机器人。Linksys WRT54GL 上的原厂固件功能太少,比如只能过滤20个 MAC 地址、可修改的配置选项太少、不能安装软件等。只需要换固件、简单修改一下配置就可以把 Linksys WRT54GL 路由器变成一个纯无线交换机,如果不用 WAN 的话还可以把 WAN 口改成 LAN 的口,这样就有5个 Swtich LAN 口可以使用,这就是 open source 的好处,可以拿来 “玩”。相对 OpenWRT 和 Tomato 来说,DD-WRT 可供修改的配置更多一些,界面也显得更专业一些,而且后面有一个商业化的公司(DD-WRT Shop)在运营,技术支持、文档更丰富一些,OpenWRT,Tomato 则比较简单,容易上手,更适合家庭用户。

linksys wrt54gl

刷固件

首先到 dd-wrt.com 官方网站下载最新的固件,然户按照说明刷最新的固件,过程非常简单,可 google 相关资料。Linksys WRT54GL 上面有3个 MAC 地址,分别对应:WAN、LAN 和 Wireless LAN.

修改配置

刷完系统后,登陆进 dd-wrt 的 web 管理界面:http://192.168.1.1,默认用户名/密码:root/admin,接下来按下面的设置修改:

打开 Setup -> Basic Setup 页面:

WAN Connection Type : Disabled(禁止WAN)
Local IP Address : 192.168.1.2(设成这台路由器在 LAN 上的 IP 地址)
Subnet Mask : 255.255.255.0(子网掩码)
Gateway: 192.168.0.1(这台路由器所在网络的主 router)
Local DNS : 10.0.0.2(这台路由器所在网络的主 gateway)
DHCP Type : Disable(路由器自己不提供 DHCP 服务)
Assign WAN Port to Switch : (打开这个选项如果你想把 WAN 那个口用作 Switch 口的话)
Use DNSMasq for DHCP: Enable
DHCP-Authoritative: Enable
Save

打开 Setup -> Advanced Routing 页面:

Operating Mode: Router
Save

打开 Wireless -> Basic Settings 页面:

Wireless Network Name (SSID) : CoE(填写自己的无线网络名)
Save

打开 Wireless -> Wireless Security 页面:

Security Mode : WPA2 Personal
WPA Algorithm : AES
WPA Shared Key: YourSharedKey
Save

打开 Services -> Services 页面:

DNSMasq : Disable(禁止这个选项,可选)
ttraff Daemon : Disable(禁止这个选项,可选)
Save

打开 Security -> Firewall 页面:

SPI firewall: Disable(禁止防火墙,如果你想以后通过 IP 地址访问这个路由器的话)
Save

打开 Administration -> Management 页面:

Info Site Password Protection : Enable(查看路由器信息页面需要密码保护,建议打开这个选项)
Routing: Disable
Save

设置完毕后点击 “Apply Settings”,路由器就会重启,重启后路由器就成了一个无线交换机了。

Troubleshooting

如果上面操作导致错误配置,需要恢复到原配置的话需要做 Hard Reset (30/30/30 reset):

  1. 在通电的情况下按住路由器背面的 reset 按钮30秒;
  2. 继续按住 reset 按钮,把电源线拔掉,再坚持30秒;
  3. 继续按住 reset 按钮,插上电源、最后坚持30秒。