简介
目的: Radius服务器能接收到从AC设备发送来的报文信息。
备注:本文中的Radius服务器使用的是windows版本。
文章结构
AC配置
Radius服务器配置
测试
AC配置
// 配置一个radius服务器
aaa authentication-server radius radius_test
// radius服务器地址
host 192.168.1.138
// 密钥
key 123456789
// AC标识符
nas-identifier natshell
// AC的ip地址
nas-ip 192.168.1.199
// 使用的vlan
source-interface vlan 20
// 配置服务器组
aaa server-group server_group_test
// 将这个radius服务器配置到服务器组中
auth-server radius_test
// 将服务器组配置到captive-portal中
aaa authentication captive-portal inter_captive_portal
server-group server_group_test
192.168.1.138为radius服务器地址
192.168.1.199为AC的ip地址 key 为与radius服务器对接时的密钥
Radius服务器配置
修改根目录下的client文件
\etc\raddb\clients.conf
// 配置AC为radius的服务器
client 192.168.1.199/24 {
#与AC中配置key相同
secret = 123456789
#别名(随意起)
shortname= test
}
测试
步骤
启动本地FreeRadius服务器
向AC发送认证请求
在FreeRadius服务器的命令行查看数据接收状态
启动本地FreeRadius服务器
向AC发送认证请求
具体发送方式请参考文末参考博客,这里只提供调用的方法
调用报文发送方法
/**
* 上线请求测试
*/
public static void ChapAuthTest() {
new SkspruceChapAuth("192.168.1.199", 2000, "192.168.1.200", "zyt", "123456", Utils.getRandom(65025, 0))
.start();
}
方法源码
package tlv.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import tlv.bean.Attr;
import tlv.bean.TlvHwBean;
import tlv.enums.TlvType;
import tlv.tools.TlvSkspruce;
/**
* 西加云杉700E设备认证
* @author yet
*
*/
public class SkspruceChapAuth extends Thread {
private DatagramSocket s;
private InetAddress hostAddress;
private byte[] buf = new byte[1000];
private DatagramPacket dp = new DatagramPacket(buf, buf.length);
private byte[] bufRe = new byte[1000];
private DatagramPacket dpRe = new DatagramPacket(bufRe, bufRe.length);
private int port;
private String userIp;
private int serialNo;
private String username;
private String password;
public void run() {
try {
s.send(Dgram.toDatagram(ReqChallenge(), hostAddress, port));
s.receive(dp);
TlvHwBean b = parse(dp.getData());
if(b.getErrCode()==0){
System.out.println("获取Challenge成功");
System.out.println("开始发送认证");
s.send(Dgram.toDatagram(ReqAuth(b.getReqId()), hostAddress, port));
s.receive(dpRe);
TlvHwBean bre = parse(dpRe.getData());
if(bre.getErrCode()==0){
System.out.println("用户认证成功");
}else{
System.out.println("用户认证失败");
}
}else{
System.out.println("获取Challenge失败");
}
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
}
/**
* 生成Challenge的请求
* @return
*/
public byte[] ReqChallenge() {
List attr = new ArrayList();
Attr a = new Attr(1, username.getBytes());
Attr b = new Attr(2, password.getBytes());
attr.add(a);
attr.add(b);
return TlvSkspruce.buildSkspruce(TlvType.ReqChallenge,serialNo,0, userIp, attr);
}
/**
* 生成认证请求
* @param reqId
* @return
*/
private byte[] ReqAuth(int reqId){
List attr = new ArrayList();
Attr a = new Attr(1, username.getBytes());
Attr b = new Attr(2, password.getBytes());
attr.add(a);
attr.add(b);
return TlvSkspruce.buildSkspruce(TlvType.ReqAuth,serialNo, reqId, userIp, attr);
}
/**
* 将byte[]转为TlvHwBean
* @param a
* @return
*/
private TlvHwBean parse(byte[] a){
return TlvSkspruce.parseHw(a);
}
/**
* @param ip AC的ip地址
* @param port AC监听的端口
* @param userIp 用户内网ip
* @param username 用户名
* @param password 密码
* @param serialNo 一段时间内唯一的序列号
*/
public SkspruceChapAuth(String ip, int port,String userIp,String username,String password,int serialNo) {
this.port = port;
this.userIp = userIp;
this.serialNo = serialNo;
this.username = username;
this.password = password;
try {
s = new DatagramSocket();
hostAddress = InetAddress.getByName(ip);
} catch (UnknownHostException e) {
System.err.println("Cannot find host");
System.exit(1);
} catch (SocketException e) {
System.err.println("Can't open socket");
e.printStackTrace();
System.exit(1);
}
System.out.println("请求开始");
}
}
在FreeRadius服务器的命令行查看数据接收状态
命令行打印出新的内容表示接收到了从AC传来的数据,图中报错是因为mysql数据库未启动
下载链接
参考博客