RADIUS 报文解析

本文详细探讨了RADIUS(Remote Authentication Dial-In User Service)协议的报文结构,包括认证和授权过程中的各种报文类型。通过解析报文头部和属性,读者将能深入了解RADIUS的工作原理及其在网络身份验证中的关键角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RADIUS 报文解析

#include <pcap.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <netinet/in.h>
//#include <netinet/tcp.h>
//#include <netinet/udp.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <signal.h>
#include <sys/types.h>   
#include <sys/stat.h>
#include <sys/types.h>   
#include <unistd.h> 





#include <netinet/ether.h>
#include <netinet/if_ether.h>


#define FILE_PATH "/home/hadoop/dpi/"

typedef long datatype ;

typedef struct node
{
   
    long  key;
    long value;
    struct node *next;
}Renode;
char *NodeBuff;
#define BUFSIZE 1024
#define  MAXDOMAINNODE 255 
typedef struct domainnode
{
   
    uint32_t  key;
    char value[50];
    uint16_t durtime;
    struct domainnode *next;
}Domainnode;
char *DomainNodeBuff;
Domainnode *MyDomainNode;
Domainnode *DomainNode[MAXDOMAINNODE];
char  DOMAINBLACKBILL[100][50];
int DOMAINBLACKMAX;
enum
{
   
    SIP_NULL            = 0x00,
    SIP_SPACE           = 0x20,
    SIP_CR              = 0x0D,
    SIP_LF              = 0x0A,
    SIP_HTAB            = 0x09,
    SIP_SLASH           = 0x2F,
    SIP_COLON           = 0x3A
};

#define MAXNODE  99
Renode *ReNode[99];


struct pseudo_header{
   
    int sourceip;
    int destip;
    u_int8_t mbz;               /*zero */
    u_int8_t ptcl;              /*protocol */
    u_int16_t plen;             /*length include tcp/udp header */
} pheader;


typedef struct RADIUSHeader_t
{
   
	u_int8_t Code;
	u_int8_t Identifier;
	u_int16_t Length;
	u_int32_t Authenticator;
	u_int32_t Authenticator1;
	u_int32_t Authenticator2;
	u_int32_t Authenticator3;
	
}RADIUSHeader_t;

typedef struct Attributes_t
{
   
	u_int8_t Type;
	u_int8_t Length;
}Attributes_t;

void delay(int sec);
u_short checksum(u_short * buffer,u_short size )
{
   
    u_long cksum = 0;
    while (size > 1) {
   
        cksum += *buffer++;
        size -= sizeof(u_short);
    }
    if (size) {
   
        cksum += *(u_char *) buffer;
    }
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >> 16);

    return (u_short) (~cksum);
}



void  p900(int i )
{
   
	free(NodeBuff);
	free(DomainNodeBuff);
	printf("End Program\r\n");
	exit(0);
}


int main()
{
   
	pcap_t *handle; /* 会话句柄 */
	char *dev; /* 执行嗅探的设备 */
	char errbuf[PCAP_ERRBUF_SIZE]; /* 存储错误信息的字符串 */
	struct bpf_program filter; /* 已经编译好的过滤器 */
	//char filter_app[] = "port 80"; /* 过滤表达式 */
	char filter_app[] = ""; /* 过滤表达式 */
	bpf_u_int32 mask; /* 所在网络的掩码 */
	bpf_u_int32 net; /* 主机的IP地址 */
	struct pcap_pkthdr header; /* 由pcap.h定义 */
	const u_char *packet; /* 实际的包 */
	/* Define the device */
	signal(SIGPIPE,SIG_IGN);
	signal(SIGINT,p900);
        char buf_total[BUFSIZE];


	unsigned char user_name[BUFSIZE];
	unsigned char pass_word[BUFSIZE];
	unsigned char CHAP_Password[BUFSIZE];
	unsigned char NAS_IP_Address[BUFSIZE];
	unsigned char NAS_Port[BUFSIZE];
	unsigned char Service_Type[BUFSIZE];
	unsigned char Framed_Protocol[BUFSIZE];
	unsigned char Framed_IP_Address[BUFSIZE];
	unsigned char Framed_IP_Netmask[BUFSIZE];
	unsigned char Framed_Routing[BUFSIZE];
	unsigned char Filter_Id[BUFSIZE];
	unsigned char Framed_MTU[BUFSIZE];
	unsigned char Framed_Compression[BUFSIZE];
	unsigned char Login_IP_Host[BUFSIZE];
	unsigned char Login_Service[BUFSIZE];
	unsigned char Login_TCP_Port[BUFSIZE];
	unsigned char Reply_Message[BUFSIZE];
	unsigned char Callback_Number[BUFSIZE];
	unsigned char Callback_Id[BUFSIZE];
	unsigned char Framed_Route[BUFSIZE];
	unsigned char Framed_IPX_Network[BUFSIZE];
	unsigned char State[BUFSIZE];
	unsigned char Class[BUFSIZE];
	unsigned char Vendor_Specific[BUFSIZE];
	unsigned char Session_Timeout[BUFSIZE];
	unsigned char Idle_Timeout[BUFSIZE];
	unsigned char Termination_Action[BUFSIZE];
	unsigned char Called_Station_Id[BUFSIZE];
	unsigned char Calling_Station_Id[BU
<think>好的,用户想用Wireshark解析RADIUS协议的数据包,需要捕获和分析。首先,我得回忆一下RADIUS协议的基本信息,知道它通常使用UDP端口1812(认证)和1813(计费),或者旧版本可能用1645和1646。然后,用户需要正确设置捕获过滤器,只抓取相关端口的数据,减少干扰。 接下来,启动Wireshark后,可能需要选择正确的网络接口,特别是如果用户是在无线网络环境下,要确保选对Wi-Fi适配器。然后设置捕获过滤器为udp port 1812 or 1813,或者包括旧端口。 捕获到数据包后,如何快速找到RADIUS协议呢?可能需要提醒用户使用显示过滤器,比如radius,或者在协议栏查找RADIUS相关的条目。解析后的字段,如Code、Identifier、Attributes,这些都是关键信息,需要解释每个部分的作用。 另外,用户可能不知道如何查看属性值,比如User-Name或NAS-IP-Address,这里要指导他们展开Radius协议下的属性树。分析流程方面,可能需要说明如何跟踪一次完整的认证过程,比如从Access-Request到Access-Accept或Reject。 还有,用户可能会遇到问题,比如捕获不到数据包,这时候需要检查防火墙是否放行UDP端口,或者是否有加密问题。RADIUS的加密依赖于共享密钥,如果密钥不对,可能无法解析属性,这时候得提醒用户正确配置密钥。 最后,相关的应用场景,比如网络故障排查或安全审计,可以生成相关问题,帮助用户进一步学习。需要确保引用正确的资料,比如站内引用中的Wireshark使用说明和数据包分析技巧。</think>### 使用Wireshark解析RADIUS协议数据包的步骤 #### 1. **捕获前的准备** - **确认RADIUS协议端口**:RADIUS协议通常使用UDP端口: - `1812`(认证请求) - `1813`(计费请求) - 旧版本可能使用`1645`和`1646`,需根据实际环境调整[^1][^3]。 - **设置捕获过滤器**:在Wireshark的捕获过滤器中输入: ```plaintext udp port 1812 or udp port 1813 ``` 或覆盖旧端口: ```plaintext udp portrange 1645-1646 or udp portrange 1812-1813 ``` #### 2. **启动捕获** - 选择正确的网络接口(如Wi-Fi适配器或以太网卡)。 - 点击“开始捕获”按钮,触发RADIUS通信(如用户登录网络设备)以生成数据包。 #### 3. **解析RADIUS协议** - **筛选数据包**:在显示过滤器中输入`radius`,仅显示RADIUS协议流量。 - **关键字段解析**: - **Code**:标识请求类型(如`Access-Request`、`Access-Accept`)。 - **Identifier**:匹配请求与响应的唯一标识。 - **Attributes**:包含具体信息(如`User-Name`、`NAS-IP-Address`)。 - **查看属性值**:展开`Attribute Value`字段解析具体内容(如用户名、密码加密方式)。 #### 4. **分析典型流程** - **认证过程**: 1. 客户端发送`Access-Request`(携带用户凭证)。 2. 服务器返回`Access-Accept`(成功)或`Access-Reject`(失败)。 - **计费过程**: - `Accounting-Request`记录会话开始/结束时间、流量统计等。 #### 5. **实用技巧** - **跟踪完整会话**:右键数据包 → `Follow → UDP Stream`,查看同一会话的关联报文。 - **共享密钥配置**:若RADIUS属性加密,需在Wireshark中配置共享密钥(路径:`编辑 → 首选项 → Protocols → RADIUS`)。 #### 6. **常见问题** - **捕获不到数据包**:检查防火墙是否放行UDP端口,或尝试`any`接口捕获。 - **属性解密失败**:确认共享密钥与RADIUS服务器配置一致。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ghost丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值