搭建企业级无线认证系统前,我们需要先理解三个核心组件的角色分工。OSSH华为Portal相当于门禁系统的前台接待,负责拦截未认证用户并推送登录页面;FreeRADIUS是严格的身份核验员,负责验证用户账号密码的合法性;而**NAC(网络接入控制)**则像交通指挥中心,协调Portal和RADIUS的联动工作。
这套架构最典型的应用场景是酒店、校园网和企业办公区。比如当员工连接公司Wi-Fi时,浏览器会自动弹出认证页面,输入HR分配的统一账号后才能上网。这种设计不仅能防止外部人员蹭网,还能实现分部门限速、上网行为审计等高级功能。
我在实际部署中发现,这三个组件的版本兼容性特别重要。建议采用以下组合:
硬件配置方面,2核4G的虚拟机就能流畅运行整套系统。但生产环境建议将Portal和RADIUS部署在不同服务器,避免认证高峰期的资源争抢。曾经有个客户将三者装在同一台机器上,结果每天上午打卡时段总出现认证卡顿,后来拆分部署才解决问题。
推荐使用VirtualBox或VMware创建两台CentOS 6.5虚拟机:
安装OSSH时有个坑要注意:必须选择英文安装界面!中文环境会导致后续服务启动异常。我帮客户排查问题时发现,有个报错"invalid locale setting"就是因此产生的。
网络配置建议采用如下方案:
bash复制# OSSH主机
eth0: 192.168.100.100/24(NAT模式,用于管理)
eth1: 192.168.200.100/24(Host-Only,用于业务通信)
# NAC主机
eth0: 192.168.100.101/24(与OSSH同网段)
OSSH安装完成后,用这个命令检查服务状态:
bash复制netstat -tunlp | grep -E '8088|1812'
应该能看到8088(Portal)和1812(RADIUS)端口处于监听状态。
NAC组件安装后需要特别注意SELinux配置:
bash复制setenforce 0 # 临时关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久关闭
修改/usr/local/portalServer/webapps/portalServer/WEB-INF/classes/configs.prod.properties时,这几个参数直接影响用户体验:
properties复制# 认证超时时间(秒),太短会导致移动设备频繁重登
timeoutSec=15
# 心跳间隔(秒),影响移动网络下的会话保持
sleepSec=300
# CHAP认证更安全但部分老旧设备不支持
authType=0
记得每次修改后执行:
bash复制/usr/local/portalServer/bin/shutdown.sh
/usr/local/portalServer/bin/startup.sh
在/usr/local/etc/raddb/clients.conf中,需要为每个网络设备定义共享密钥:
bash复制client 办公区AP {
ipaddr = 192.168.10.0/24
secret = 9w8e7r6t
nastype = cisco
}
用户账号管理推荐用MySQL替代文本文件:
sql复制CREATE TABLE `device_policy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`mac` varchar(17) NOT NULL,
`max_speed` int(11) DEFAULT '10',
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
以汉明6100为例,必须确保这些配置正确:
常见故障现象是终端能连Wi-Fi但获取不到IP,多半是VLAN tagging没配好。有个快速排查技巧:在AC上抓包看DHCP请求是否到达正确接口。
Portal服务器地址配置有个隐藏细节:必须带/portal路径后缀,完整格式应该是:
code复制http://192.168.100.100:8088/portal
RADIUS共享密钥建议定期更换,在AC和RADIUS服务器上要保持绝对一致。曾经有客户因为密钥含特殊字符导致间歇性认证失败,后来改用纯数字才稳定。
三大关键日志路径:
/usr/local/portalServer/logs/localhost_access_log.*tail -f /usr/local/var/log/radius/radius.logjournalctl -u nac -f遇到认证问题时,可以临时开启RADIUS调试模式:
bash复制/etc/init.d/rc.radiusd stop
radiusd -X
这时控制台会实时打印认证流程,能看到具体在哪一步失败。
高并发场景下需要调整这些参数:
bash复制# 在radiusd.conf中
max_requests = 4096
thread pool {
max_servers = 64
max_requests_per_server = 0
}
对于访客密集区域,建议启用Portal页面缓存:
properties复制# 在configs.prod.properties中
staticResourceCache=true
cacheSize=50MB
在/usr/local/etc/raddb/sites-enabled/default中添加:
bash复制post-auth {
# 记录失败尝试
if (reply-code == Access-Reject) {
update {
&control:Auth-Tries += 1
}
if (control:Auth-Tries > 5) {
reject
}
}
}
建议采用三层网络架构:
在防火墙上只开放必要端口:
修改Portal页面支持微信认证:
/usr/local/portalServer/webapps/portalServer/portal目录添加微信回调页面通过MySQL存储临时账号:
sql复制CREATE PROCEDURE `create_guest`(IN phone CHAR(11))
BEGIN
SET @pwd = SUBSTRING(MD5(RAND()),1,8);
INSERT INTO radcheck VALUES (NULL, phone, 'Cleartext-Password', ':=', @pwd);
SELECT @pwd AS password;
END
按这个顺序排查:
通常是会话保持失败导致,检查:
有个医院项目就遇到过这问题,最后发现是防火墙的UDP会话超时设置比RADIUS的会话超时短,调整后就好了。