Scapy中PPPoED_Tags的使用方法及参数传递问题咨询
所有PPPoED标签都遵循TLV三元组结构,不管你用哪种框架构造数据包,参数传递都要符合以下规则:
- 类型字段:按RFC 2516定义的标签类型赋值,常用类型包括:
- 0x0000:End-Of-List,标记标签列表结束
- 0x0101:Service-Name,指定请求的服务名
- 0x0102:AC-Name,接入集中器名称
- 0x0103:Host-Uniq,主机唯一标识
- 0x0104:AC-Cookie,接入集中器下发的验证cookie
- 长度字段:直接填后续值字段的字节长度,不需要包含类型和长度字段自身的4字节
- 值字段:按对应标签的要求填入二进制或字符串内容,字符串类型不需要额外补终止符
如果用scapy构造PPPoE发现阶段数据包,可参考以下示例:
from scapy.layers.ppp import PPPoED, PPPoETag # 构造标签列表 tags = [ PPPoETag(type=0x0101, len=len("internet"), value=b"internet"), # Service-Name标签 PPPoETag(type=0x0103, len=4, value=b"\x12\x34\x56\x78"), # Host-Uniq标签 PPPoETag(type=0x0000) # End-Of-List标签,不需要填长度和值 ] # 封装到PPPoED数据包 pkt = PPPoED(code=0x09, sessionid=0, tags=tags) # code=0x09对应PADI请求
如果是用C语言调用libpcap/raw socket构造,直接按TLV结构逐字节拼接即可,不需要做额外的字节序转换,PPPoE协议规定所有字段都按网络字节序(大端)传输。
你提到的官方提示里的参数要求,实际就是要求你按[类型1][长度1][值1][类型2][长度2][值2]...的顺序拼接所有标签,最后以End-Of-List标签收尾即可。
内容的提问来源于stack exchange,提问作者BeQuite
相关产品推荐
相关产品推荐

