SDN-OpenFlow1(1),作为一个网络安全开发者

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

 OFPAT_SET_DL_DST,  / *以太网目标地址。 * /
 OFPAT_SET_NW_SRC,  / * IP源地址。 * /
 OFPAT_SET_NW_DST,  / * IP目标地址。 * /
 OFPAT_SET_NW_TOS,  / * IP ToS(DSCP字段,6位)。 * /
 OFPAT_SET_TP_SRC,  / * TCP / UDP源端口。 * /
 OFPAT_SET_TP_DST,  / * TCP / UDP目标端口。 * /
 OFPAT_ENQUEUE,     / *输出到队列。 * /
 OFPAT_VENDOR = 0xffff

};


其中OFPAT\_OUTPUT和OFPAT\_ENQUEUE为转发操作,其他类型为修改包头操作


OUTPUT类型



/ * OFPAT_OUTPUT的操作结构,该结构将数据包从“端口”发送出去。
*当“端口”为OFPP_CONTROLLER时,“ max_len”表示最大
*要发送的字节数。 “ max_len”为零表示没有字节
数据包应该发送。 /
struct ofp_action_output {
uint16_t type; / * OFPAT_OUTPUT。 * /
uint16_t len; / 长度为8。 /
uint16_t port; / *输出端口。 * /
uint16_t max_len; / *要发送到控制器的最大长度。 * /
};


output类型Action的结构包含一个port参数和一个max\_len参数Port参数指定了数据包的输出端口,输出端口可以是交换机的一个实际物理端口,也可以是一下虚拟端口


* ALL:将数据包从除入端口以外其他所有端口发出
* CONTROLLER:将数据包发送给控制器
* LOCAL:将数据包发送给交换机本地端口>TABLE:将数据包按照流表匹配条目处理
* IN\_PORT:将数据包从入端口发出
* NORMAL:按照普通二层交换机流程处理数据包
* FLOOD:将数据包从最小生成树使能端口转发(不包括入端口)当port为CONTROLLER时,max\_len指定了发给CONTROLLER的数据包最大长度。当port为其他参数时,max\_len无意义。


 ENQUEUE类型



/ * OFPAT_ENQUEUE操作结构:将数据包发送到端口上的给定队列。 * /
struct ofp_action_enqueue {
uint16_t type; / * OFPAT_ENQUEUE。 * /
uint16_t len; / * Len是16。* /
uint16_t port; / *队列所属的端口。 应该
引用有效的物理端口
(即<OFPP_MAX)或OFPP_IN_PORT。 * /
uint8_t pad [6]; / * pad用于64位对齐。 * /
uint32_t queue_id; / *将数据包放入队列的位置。 * /
};


VLAN\_VID类型——修改VLAN的ID



/ * OFPAT_SET_VLAN_VID的操作结构。 * /
struct ofp_action_vlan_vid {
uint16_t type; / * OFPAT_SET_VLAN_VID。 * /
uint16_t len; / 长度为8。 /
uint16_t vlan_vid; / * VLAN ID。 * /
uint8_t pad [2];
};


VLAN\_PCP类型——修改VLAN优先级



/ * OFPAT_SET_VLAN_PCP的操作结构。 * /
struct ofp_action_vlan_pcp {
uint16_t类型; / * OFPAT_SET_VLAN_PCP。 * /
uint16_t len; / 长度为8。 /
uint8_t vlan_pcp; / * VLAN优先级。 * /
uint8_t pad [3];
};


 DL\_ADDR类型——修改MAC地址



/ * OFPAT_SET_DL_SRC / DST的操作结构。 * /
struct ofp_action_dl_addr {
uint16_t type; / * OFPAT_SET_DL_SRC / DST。 * /
uint16_t len; / 长度为16。 /
uint8_t dl_addr [OFP_ETH_ALEN]; / *以太网地址。 * /
uint8_t pad [6];
};


NW\_ADDR类型——修改IP地址



/ * OFPAT_SET_NW_SRC / DST的操作结构。 * /
struct ofp_action_nw_addr {
uint16_t类型; / * OFPAT_SET_TW_SRC / DST。 * /
uint16_t len; / 长度为8。 /
uint32_t nw_addr; /* IP地址。 * /
};


NW\_TOS类型——修改IP服务类型



/ * OFPAT_SET_NW_TOS的操作结构。 * /
struct ofp_action_nw_tos {
uint16_t类型; / * OFPAT_SET_TW_SRC / DST。 * /
uint16_t len; / 长度为8。 /
uint8_t nw_tos; / * IP ToS(DSCP字段,6位)。 * /
uint8_t pad [3];
};


TP\_PORT类型——修改传输层端口号



/ * OFPAT_SET_TP_SRC / DST的操作结构。 * /
struct ofp_action_tp_port {
uint16_t类型; / * OFPAT_SET_TP_SRC / DST。 * /
uint16_t len; / 长度为8。 /
uint16_t tp_port; / * TCP / UDP端口。 * /
uint8_t pad [2];
};


### 流表匹配




![](https://img-blog.csdnimg.cn/2020103114395885.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xhZHlfa2lsbGVyOQ==,size_16,color_FFFFFF,t_70)

 整体匹配流程 
 


 




![](https://img-blog.csdnimg.cn/20201031144046797.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xhZHlfa2lsbGVyOQ==,size_16,color_FFFFFF,t_70)

 包头解析匹配流程 
 


## OpenFlow消息


Openflow消息总共分为三大类:  
 1、Controller-to-Switch(控制器至交换机消息),此类消息由控制器主动发出


* Features 在建立传输层安全会话的时候,控制器发送feature请求(**OFPT\_FEATURES\_REQUEST**)消息给交换机,交换机需要应答(**OFPT\_FEATURES\_REPLY**)自身支持的功能。
* Configuration 控制器设置或查询交换机上的配置信息。交换机仅需要**应答查询消息**。
* Modify-State  控制器管理交换机**流表项**和端口状态等。
* Read-State 用来读取交换机流表、端口状态
* Send-Packet 用来通过指定端口发送数据包
* Barrier 控制器确保消息依赖满足,或接收完成操作的通知(**OFPT\_BARRIER\_REQUEST、OFPT\_BARRIER\_REPLY**)



> 
>      / \*交换机配置消息。 \* /
> 
> 
>      OFPT\_FEATURES\_REQUEST,
> 
> 
>      OFPT\_FEATURES\_REPLY,
> 
> 
>      OFPT\_GET\_CONFIG\_REQUEST,
> 
> 
>      OFPT\_GET\_CONFIG\_REPLY,
> 
> 
>      OFPT\_SET\_CONFIG,
> 
> 
>      / \*控制器命令消息。 \* /
> 
> 
>      OFPT\_PACKET\_OUT,
> 
> 
>      OFPT\_FLOW\_MOD,
> 
> 
>      OFPT\_PORT\_MOD,
> 
> 
>      / \*统计信息。 \* /
> 
> 
>      OFPT\_STATS\_REQUEST,
> 
> 
>      OFPT\_STATS\_REPLY,
> 
> 
>      / \*障碍消息。 \* /
> 
> 
>      OFPT\_BARRIER\_REQUEST,
> 
> 
>      OFPT\_BARRIER\_REPLY,
> 
> 
>      / \*队列配置消息。 \* /
> 
> 
>      OFPT\_QUEUE\_GET\_CONFIG\_REQUEST,
> 
> 
>      OFPT\_QUEUE\_GET\_CONFIG\_REPLY
> 
> 
> 


2、Asynchronous(异步消息),此类消息由交换机主动发出


* Packet-in 用来告知控制器交换机接收到数据包
* Flow-Removed用来告知控制器交换机流表被删除>Port-Status用来告知控制器交换机端口状态更新
* Error用来告知控制器交换机发生错误



> 
>     OFPT\_PACKET\_IN,          
> 
> 
>     OFPT\_FLOW\_REMOVED,     
> 
> 
>     OFPT\_PORT\_STATUS,
> 
> 
>     OFPT\_ERROR,
> 
> 
> 


3、Symmetric(对称消息),此类消息可以由控制器或交换机主动发起


* Hello用来建立Openflow连接
* Echo用来确认交换机与控制器之间的连接状态
* Vendor厂商自定义消息



> 
>     OFPT\_HELLO,
> 
> 
>     OFPT\_ECHO\_REQUEST,  
> 
> 
>     OFPT\_ECHO\_REPLY,   
> 
> 
>     OFPT\_VENDOR,        
> 
> 
> 


### OpenFlow消息格式


OpenFlow协议数据包由OpenFlow Header和OpenFlow Message两部分组成


OpenFlow的头



/ *所有OpenFlow数据包的头。 * /
struct ofp_header {
uint8_t version; / * OFP_VERSION。 * /
uint8_t type; / * OFPT_常量之一。 * /
uint16_t length; / *长度,包括此ofp_header。 * /
uint32_t xid; / *与该数据包关联的交易ID。
回复使用与请求中相同的ID
方便配对。 * /
};


OpenFlow消息



enum ofp_type{
/ *不可变的消息。 * /
OFPT_HELLO, / 对称消息 /
OFPT_ERROR, / 对称消息 /
OFPT_ECHO_REQUEST,/ 对称消息 /
OFPT_ECHO_REPLY, / 对称消息 /
OFPT_VENDOR, / 对称消息 /

/ *交换机配置消息。 * /
OFPT_FEATURES_REQUEST,  / *控制器/交换机消息* /
OFPT_FEATURES_REPLY,    / *控制器/交换机消息* /
OFPT_GET_CONFIG_REQUEST,/ *控制器/交换机消息* /
OFPT_GET_CONFIG_REPLY,  / *控制器/交换机消息* /
OFPT_SET_CONFIG,        / *控制器/交换机消息* /

/ *异步消息。 * /
OFPT_PACKET_IN,   / *异步消息* /
OFPT_FLOW_REMOVED,/ *异步消息* /
OFPT_PORT_STATUS, / *异步消息* /

/ *控制器命令消息。 * /
OFPT_PACKET_OUT,/ *控制器/交换机消息* /
OFPT_FLOW_MOD,  / *控制器/交换机消息* /
OFPT_PORT_MOD,  / *控制器/交换机消息* /

/ *统计消息。 * /
OFPT_STATS_REQUEST,/ *控制器/交换机消息* /
OFPT_STATS_REPLY,  / *控制器/交换机消息* /

/ *障碍消息。 * /
OFPT_BARRIER_REQUEST,/ *控制器/交换机消息* /
OFPT_BARRIER_REPLY,  / *控制器/交换机消息* /

/ *队列配置消息。 * /
OFPT_QUEUE_GET_CONFIG_REQUEST,/ *控制器/交换机消息* /
OFPT_QUEUE_GET_CONFIG_REPLY    / *控制器/交换机消息* /

};


### 对称消息


#### 建立OpenFlow连接(OFPT\_HELLO消息)


控制器与交换机互相发送Hello消息,Hello消息中只包含Openflow Header,Openflow Header中的version字段为发送方所支持的最高版本Openflow协议  
 双方选取Hello消息中最低版本的协议作为通信协议如果有一方不支持Openflow协议版本,应发送Error消息后断开连接  
 如果双方Openflow版本可以兼容,则Openflow连接建立成功。


#### 报告错误(OFPT\_ERROR消息)


共64+16+16+8=104位,后面有一句OFP\_ASSERT(sizeof(struct ofp\_error\_msg) == 12);12\*8=96,也就是没有data的话是会报错的。



/ * OFPT_ERROR:错误消息(数据路径->控制器)。 * /
struct ofp_error_msg {
struct ofp_header header;

 uint16_t type;
 uint16_t code;
 uint8_t data [0]; / *可变长度数据。 根据类型和代码进行编译。 * /

};


里面的code type也有很多的枚举类型,防止文章太长,读者看不进去,接下来只黏贴重要部分,想看代码的自行下载阅读,不到1000行,还可以。


#### 获取交换机特性信息(Features消息)


Openflow连接建立后,控制器最需要获得交换机的特性信息,交换机的特性信息包括交  
 换机的ID(DPID),交换机缓冲区数量,交换机端口及端口属性等等。  
 控制器向交换机发送Features Request消息查询交换机特性,Features Request消息只包含Openflow Header。  
 交换机在收到**Features Request**消息后返回**Features Reply**消息,Features Reply消息包括Openflow Header 和Features Reply Message


**Features Reply Message结构**



/ *交换机功能 * /
struct ofp_switch_features {
struct ofp_header header;
uint64_t datapath_id; / *数据路径唯一ID。 低48位用于
MAC地址,而高16位是
实施者定义的。 * /
uint32_t n_buffers; / *一次缓冲的最大数据包数。 * /
uint8_t n_tables; / *数据路径支持的表数。 * /
uint8_t pad[3]; / *对齐64位。 * /

 /* 特征。 * /
 uint32_t capabilities;      / *支持“ ofp_capabilities”的位图。 * /
 uint32_t actions;     / *支持的“ ofp_action_type”的位图。 * /

 / *端口信息* /
 struct ofp_phy_port ports[0]; / *端口定义。 端口数
                                   从中的长度字段推断
                                   标头。 * /

};


**物理端口描述**



/ 物理端口的说明 /
struct ofp_phy_port {
uint16_t port_no;
uint8_t hw_addr [OFP_ETH_ALEN];
char name[OFP_MAX_PORT_NAME_LEN]; / 空终止 /

 uint32_t config; / * OFPPC_ *标志的位图。 * /
 uint32_t state; / * OFPPS_ *标志的位图。 * /

 / * OFPPF_ *位图,用于描述功能。 如果所有位清零
  *不支持或不可用。 * /
 uint32_t curr; / *当前功能。 * /
 uint32_t advertised; / *端口正在通告的功能。 * /
 uint32_t supported; / *端口支持的功能。 * /
 uint32_t peer; / *由对等方通告的功能。 * /

};



/ *指示物理端口行为的标志。 这些标志是
*在ofp_phy_port中用于描述当前配置。 他们是
*在ofp_port_mod消息中使用,用于配置端口的行为。

  • /
    enum of_p_port_config{
    OFPPC_PORT_DOWN = 1 << 0, / *端口在管理上已关闭。 * /

    OFPPC_NO_STP = 1 << 1, / *禁用端口上的802.1D生成树。 * /
    OFPPC_NO_RECV = 1 << 2, / *丢弃除802.1D跨越之外的所有数据包
    树包。 * /
    OFPPC_NO_RECV_STP = 1 << 3,/ *丢弃收到的802.1D STP数据包。 * /
    OFPPC_NO_FLOOD = 1 << 4, / *泛洪时不包括此端口。 * /
    OFPPC_NO_FWD = 1 << 5, / *丢弃转发到端口的数据包。 * /
    OFPPC_NO_PACKET_IN = 1 << 6 / *不要为端口发送入站消息。 * /
    };


**配置交换机Openflow属性**



/ *交换机配置。 * /
struct ofp_switch_config {
struct ofp_header header;
uint16_t flags; / * OFPC_ *标志。 * /
uint16_t miss_send_len; / *数据路径应包含的新流的最大字节数
发送给控制器。 * /
};


Openflow交换机只有两个属性需要控制器配置第一个属性为flags,用来指示交换机如何处理IP分片数据包;第二个属性为miss \_send\_len,用来指示当一个交换机无法处理的数据包到达时,将数据包发给控制器的最大字节数。 



enum of_p_config_flags{
/ *处理IP片段。 * /
OFPC_FRAG_NORMAL = 0,/ *对片段没有特殊处理。 * /
OFPC_FRAG_DROP = 1, / *丢弃片段。 * /
OFPC_FRAG_REASM = 2, / *重新组装(仅在设置了OFPC_IP_REASM的情况下)。 * /
OFPC_FRAG_MASK = 3
};


### 异步消息


#### 交换机接收数据包(Packet-in消息)


Packet-in消息触发情况1:  
 当交换机收到一个数据包后,会查找流表,找出与数据包包头相匹配的条目。  
 如果流表中有匹配条目,则交换机按照流表所指示的action列表处理数据包。  
 如果流表中没有匹配条目,则交换机会将数据包封装在Packet-in消息中发送给控制器处理。此时数据包会被缓存在交换机中等待处理。


Packet-in消息触发情况2:


交换机流表所指示的action列表中包含转发给控制器的动作(Output=CONTROLLER)。  
 此时数据包不会被缓存在交换机中。


**Packet-in消息格式**



/ *在端口(数据路径->控制器)上接收到的数据包。 * /
struct ofp_packet_in {
struct ofp_header header;
uint32_t buffer_id; / *由数据路径分配的ID。 * /
uint16_t total_len; / *整个帧的长度。 * /
uint16_t in_port; / *接收帧的端口。 * /
uint8_t reason; / *原因包被发送(OFPR_ 之一) /
uint8_t pad;
uint8_t data[0]; / *以太网帧,位于32位字的中间,
因此IP标头是32位对齐的 的
从长度推断数据量
标头中的字段。 由于填充,
offsetof(struct ofp_packet_in,data)==
sizeof(struct ofp_packet_in)-2. * /
};


64+32+16+16+8+8+8=152。我抓到过长度为86、90、108等长度的数据包。后面有一句OFP\_ASSERT(sizeof(struct ofp\_packet\_in) == 20); 20\*8=160,应该是不能超过160,就是不能多一个字节,少的还不清楚最少是多少,应该是和header一样,64位。


reason字段,由这个字段可以看出前面所写Packet\_in事件触发的两种情况。



/ *为什么将此数据包发送到控制器? * /
enum of_p_packet_in_reason{
OFPR_NO_MATCH,/ *没有匹配的流程。 * /
OFPR_ACTION / *操作明确输出到控制器。 * /
};

学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

/
enum of_p_packet_in_reason{
OFPR_NO_MATCH,/ *没有匹配的流程。 * /
OFPR_ACTION / *操作明确输出到控制器。 * /
};

学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-F1gOfvfM-1713364756729)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值