2024年SDN-OpenFlow1(2),零基础网络安全入门

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网络安全面试题

绿盟护网行动

还有大家最喜欢的黑客技术

网络安全源码合集+工具包

所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~

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

需要这份系统化资料的朋友,可以点击这里获取

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

/ *所有动作共有的头。 长度包括
  *头和用于使操作64位对齐的任何填充。
  *注意:动作的长度*必须*始终是8的倍数。 * /
struct ofp_action_header {
     uint16_t type; / * OFPAT_ *之一。 * /
     uint16_t len; / *动作时长,包括此
                      头。 这是行动的时长,
                      包括任何填充物
                      64位对齐。 * /
     uint8_t pad [4];
};

其中,type字段为以下之一

enum of_p_action_type{
     OFPAT_OUTPUT,      / *输出到交换机端口。 * /
     OFPAT_SET_VLAN_VID,/ *设置802.1q VLAN ID。 * /
     OFPAT_SET_VLAN_PCP,/ *设置802.1q优先级。 * /
     OFPAT_STRIP_VLAN,  / *剥离802.1q标头。 * /
     OFPAT_SET_DL_SRC,  / *以太网源地址。 * /
     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];
};

流表匹配

整体匹配流程

包头解析匹配流程

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。 * /


### 给大家的福利


**零基础入门**


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)


因篇幅有限,仅展示部分资料

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

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值