目录
[1.1 实验背景](#1.1 实验背景)
[1.2 实验目的](#1.2 实验目的)
[1.3 实验环境](#1.3 实验环境)
[步骤 1:启动 OpenDaylight 控制器并安装所需插件](#步骤 1:启动 OpenDaylight 控制器并安装所需插件)
[(1)安装 OVSDB 设备管理组件](#(1)安装 OVSDB 设备管理组件)
[(2)安装 RESTCONF 北向 API 组件](#(2)安装 RESTCONF 北向 API 组件)
[(3)安装二层转发与 OpenFlow 协议插件](#(3)安装二层转发与 OpenFlow 协议插件)
[(4)安装 DLUX 可视化 Web 管理组件](#(4)安装 DLUX 可视化 Web 管理组件)
[步骤 2:Mininet 创建拓扑并连接 OpenDaylight 控制器](#步骤 2:Mininet 创建拓扑并连接 OpenDaylight 控制器)
[任务一:下发流表,禁止 h1 ping 通 h2](#任务一:下发流表,禁止 h1 ping 通 h2)
[步骤 4:删除流表规则,恢复 h1 与 h2 网络互通](#步骤 4:删除流表规则,恢复 h1 与 h2 网络互通)
[步骤 5:在 h1 主机部署简易 Web 服务](#步骤 5:在 h1 主机部署简易 Web 服务)
[步骤 6:在 h1、h2 开启 SSH 远程登录服务](#步骤 6:在 h1、h2 开启 SSH 远程登录服务)
[步骤 7:下发四层端口流表,禁止 h2 访问 h1 的 Web 服务、放行 SSH](#步骤 7:下发四层端口流表,禁止 h2 访问 h1 的 Web 服务、放行 SSH)
[步骤 8:删除端口拦截流表,恢复 Web 服务访问权限](#步骤 8:删除端口拦截流表,恢复 Web 服务访问权限)
[4.1 控制器部署结果](#4.1 控制器部署结果)
[4.2 三层 IP 防火墙实验结果](#4.2 三层 IP 防火墙实验结果)
[4.3 四层端口精细化防火墙实验结果](#4.3 四层端口精细化防火墙实验结果)
[5.1 实验总结](#5.1 实验总结)
[5.2 常见故障及解决方案](#5.2 常见故障及解决方案)
[5.3 实验拓展思考](#5.3 实验拓展思考)
[1. OpenDaylight 插件安装(Karaf 控制台)](#1. OpenDaylight 插件安装(Karaf 控制台))
[2. Mininet 拓扑创建](#2. Mininet 拓扑创建)
[3. IP 层防火墙相关流表命令](#3. IP 层防火墙相关流表命令)
[4. Web 服务部署命令](#4. Web 服务部署命令)
[5. SSH 服务部署命令](#5. SSH 服务部署命令)
[6. 端口防火墙相关流表命令](#6. 端口防火墙相关流表命令)
一、实验概述
1.1 实验背景
传统网络中,硬件防火墙部署在网络边界作为内网安全屏障,但策略部署繁琐、安全响应滞后。SDN 架构依托中心化控制平面,可全局采集全网流量,通过向 Open vSwitch 交换机下发 OpenFlow 流表规则,基于 IP、传输端口对流量精准管控,实现软件化、可灵活编排的防火墙功能。借助 SDN 北向接口,安全访问策略可批量快速下发,大幅提升网络安全运维效率。
1.2 实验目的
- 掌握 OpenDaylight(锂版本)控制器部署及核心功能插件安装方法,理解 SDN 南向、北向接口工作机制。
- 使用 Mininet 搭建单交换机双主机拓扑,完成 OVS 交换机与 OpenDaylight 远程控制器对接。
- 熟练使用
ovs-ofctl工具完成 OpenFlow 流表的添加、查看、删除操作。 - 基于流表规则实现三层 IP 防火墙:阻断 h1 与 h2 之间 ICMP 报文,验证网络访问拦截与连通恢复。
- 基于四层 TCP 端口实现精细化访问控制:禁止 h2 访问 h1 的 80 端口 Web 服务,放行 22 端口 SSH 远程登录服务。
- 理解 SDN 软件防火墙相较于传统硬件防火墙在策略灵活下发、动态安全防护上的技术优势。
1.3 实验环境
- 虚拟机系统:Ubuntu(两台)
- 控制器:OpenDaylight Lithium(锂版本)
- 仿真工具:Mininet、Open vSwitch(支持 OpenFlow1.3 协议)
- 网络拓扑:交换机
s1,主机h1(10.0.0.1)、h2(10.0.0.2) - 实验工具:Xterm 终端、Firefox 浏览器、Python 简易 Web 服务、SSH 服务
二、实验原理
- SDN 防火墙原理 SDN 将控制层与数据层解耦,OpenDaylight 集中管控全网,通过南向协议下发流表至 OVS 交换机。交换机根据流表匹配字段(源 IP、目的 IP、入端口、协议、目的端口等)对数据包执行转发、丢弃动作,在数据平面实现访问控制,即软件防火墙。
- OpenFlow 流表关键字段说明
priority:流表优先级,数值越大优先匹配;- 匹配域:入端口、源目的 IP、传输协议、源目的端口;
actions:数据包匹配后执行动作,drop丢弃、output转发。
- 服务原理
- Python
SimpleHTTPServer:快速搭建 80 端口 HTTP 静态 Web 服务; - SSH 服务:基于 TCP 22 端口实现远程终端登录。
三、详细实验步骤
步骤 1:启动 OpenDaylight 控制器并安装所需插件
- 进入 OpenDaylight 安装目录,执行
./karaf启动 Karaf 控制台。 - 在 Karaf 控制台依次执行以下命令安装全部依赖插件:

(1)安装 OVSDB 设备管理组件
bash
运行
feature:install odl-ovsdb-all
feature:install odl-ovsdb-southbound-api odl-ovsdb-southbound-impl odl-ovsdb-southbound-impl-rest odl-ovsdb-southbound-impl-ui odl-openflowplugin-adsal-compatibility-all
(2)安装 RESTCONF 北向 API 组件
bash
运行
feature:install odl-restconf
(3)安装二层转发与 OpenFlow 协议插件
bash
运行
feature:install odl-l2switch-switch
feature:install odl-openflowplugin-all
(4)安装 DLUX 可视化 Web 管理组件
bash
运行
feature:install odl-dlux-all
feature:install odl-mdsal-all
- 等待插件全部安装完成,保持 Karaf 控制台后台运行。
步骤 2:Mininet 创建拓扑并连接 OpenDaylight 控制器
- 在 Mininet 虚拟机终端执行命令,创建远程控制器拓扑,指定 OpenFlow1.3 协议:
bash
运行
sudo mn --controller=remote,ip=127.0.0.1,port=6653 --switch=ovsk,protocols=OpenFlow13
- 查看 OVS 交换机与控制器连接状态:
bash
运行
ovs-vsctl show
若输出控制器连接状态为connected,代表拓扑对接成功。 3. 连通性预测试:Mininet 中执行h1 ping h2,默认二层转发下两台主机正常互通。
任务一:下发流表,禁止 h1 ping 通 h2
- 退出 Mininet 交互终端,执行下发拦截流表命令:
bash
运行
ovs-ofctl add-flow s1 priority=120,ip,in_port=1,nw_src=10.0.0.1,nw_dst=10.0.0.2,actions=drop -O OpenFlow13
- 查看交换机流表,校验规则下发成功:
bash
运行
ovs-ofctl dump-flows s1 -O OpenFlow13
- 连通性验证:Mininet 执行
h1 ping h2 -c 1,数据包请求超时,主机间无法 ping 通,IP 防火墙拦截生效。
步骤 4:删除流表规则,恢复 h1 与 h2 网络互通
- 精准删除本次添加的拦截流表项:
bash
运行
ovs-ofctl del-flows s1 nw_src=10.0.0.1,nw_dst=10.0.0.2 -O OpenFlow13
- 再次查看流表,确认该规则已被删除:
bash
运行
ovs-ofctl dump-flows s1 -O OpenFlow13
- 连通性验证:执行
h1 ping h2,两台主机恢复正常网络互通。
步骤 5:在 h1 主机部署简易 Web 服务
- Mininet CLI 中打开 h1 独立终端:
bash
运行
xterm h1
- 在 h1 终端启动 Python2 内置 HTTP 服务,监听 80 端口:
bash
运行
python -m SimpleHTTPServer 80
- 打开 h2 终端,切换普通用户后启动浏览器访问 Web 服务:
bash
运行

xterm h2
su - osboxes
firefox
在浏览器地址栏输入10.0.0.1,可正常访问 h1 的 Web 页面,服务部署验证成功。
步骤 6:在 h1、h2 开启 SSH 远程登录服务
- 在 h1 终端查看 22 端口监听状态:
bash
运行
netstat -tunlp | grep 22
- 若未监听,则手动启动 sshd 服务:
bash
运行
which sshd
/usr/sbin/sshd
- 在 h2 主机执行相同操作开启 sshd 服务。
- 从 h2 远程 SSH 登录 h1,验证服务可用性:
bash
运行
ssh osboxes@10.0.0.1
输入用户密码后成功登录,SSH 服务运行正常。
步骤 7:下发四层端口流表,禁止 h2 访问 h1 的 Web 服务、放行 SSH
- 下发 TCP 端口拦截流表,阻断 h2 访问 h1 的 80 端口:
bash
运行
ovs-ofctl add-flow s1 priority=110,tcp,in_port=2,nw_src=10.0.0.2,nw_dst=10.0.0.1,tp_dst=80,actions=drop -O OpenFlow13
- 查看流表确认规则生效:
bash
运行
ovs-ofctl dump-flows s1 -O OpenFlow13
- 功能验证:
- Web 访问:h2 打开 Firefox 访问
10.0.0.1,页面连接超时,Web 访问被防火墙拦截; - SSH 登录:h2 执行
ssh osboxes@10.0.0.1可正常登录,22 端口流量未被限制,符合实验策略要求。
- Web 访问:h2 打开 Firefox 访问
步骤 8:删除端口拦截流表,恢复 Web 服务访问权限
- 删除 80 端口拦截流规则:
bash
运行
ovs-ofctl del-flows s1 tcp,in_port=2 -O OpenFlow13
- 校验流表已删除:
bash
运行
ovs-ofctl dump-flows s1 -O OpenFlow13
- 再次使用 h2 浏览器访问
10.0.0.1,Web 网页正常打开,访问权限恢复。
四、实验结果分析
4.1 控制器部署结果
OpenDaylight 所有插件安装无报错,可通过http://ODL_IP:8181访问 DLUX 可视化页面,能够正常发现 s1 交换机、h1/h2 主机拓扑,南向连接状态正常。
4.2 三层 IP 防火墙实验结果
- 下发
h1→h2IP 拦截流表后,ICMP 数据包被丢弃,h1 ping h2请求超时,单向访问成功阻断; - 删除流表规则后,数据包按照 L2 默认规则正常转发,两台主机双向可达;
- 结果说明:SDN 可基于源目 IP 精准拦截网段流量,实现传统边界防火墙的 IP 访问控制能力。
4.3 四层端口精细化防火墙实验结果
- 部署 Python Web 与 SSH 服务后,未下发流表时,h2 可正常访问 h1 的 HTTP 服务、SSH 远程登录;
- 下发 TCP 80 端口丢弃规则后,仅 Web 服务访问失败,SSH 22 端口流量不受限制,实现最小权限安全策略;
- 删除端口流表后,Web 访问恢复正常,验证 SDN 防火墙可灵活动态调整安全策略。
五、实验总结与问题排查
5.1 实验总结
- 本次实验完成了 OpenDaylight 控制器环境部署、Mininet 拓扑搭建与控制器对接,掌握了 SDN 典型组件功能与安装方式。
- 通过
ovs-ofctl命令实现了 OpenFlow 流表的增、删、查操作,分别从网络层、传输层两个维度完成简易防火墙访问控制。 - 相比传统硬件防火墙,SDN 软件防火墙优势显著:安全策略集中化管理、动态一键下发、按需灵活修改访问规则,可针对异常流量实时拦截,极大提升网络安全运维的灵活性与响应速度。
- 实验同时验证了常用网络服务(HTTP、SSH)的部署与测试方法,结合 SDN 流规则可实现精细化的业务流量安全管控。
5.2 常见故障及解决方案
- 交换机无法连接 ODL 控制器 排查:确认 ODL 虚拟机防火墙放行 6633 端口、Mininet 命令中控制器 IP 填写正确、ODL 已安装
odl-ovsdb-all插件。 - 流表规则不生效 排查:下发命令必须携带
-O OpenFlow13指定协议版本,核对交换机端口、主机 IP 与拓扑信息一致。 - Python Web 服务无法被访问 排查:Python2 使用
SimpleHTTPServer模块,Python3 需替换为http.server,确认 h1 防火墙未拦截 80 端口。 - SSH 登录失败 排查:手动执行
/usr/sbin/sshd启动服务,使用netstat确认 22 端口处于监听状态,登录命令使用正确用户名。
5.3 实验拓展思考
- 本次仅实现单向流量拦截,如需双向禁止主机互访,需要添加两条源目 IP 互换的 drop 流规则。
- 除命令行方式外,可通过 OpenDaylight REST API、RYU 控制器 Python 应用编程方式自动化批量下发防火墙策略,实现安全防护可编程化。
- 可结合流量采集、入侵检测应用,在 SDN 架构中实现主动式安全防御,自动识别攻击流量并实时下发拦截流表。
附录:实验全部核心命令汇总
1. OpenDaylight 插件安装(Karaf 控制台)
bash
运行
feature:install odl-ovsdb-all
feature:install odl-ovsdb-southbound-api odl-ovsdb-southbound-impl odl-ovsdb-southbound-impl-rest odl-ovsdb-southbound-impl-ui odl-openflowplugin-adsal-compatibility-all
feature:install odl-restconf
feature:install odl-l2switch-switch
feature:install odl-openflowplugin-all
feature:install odl-dlux-all
feature:install odl-mdsal-all
2. Mininet 拓扑创建
bash
运行
mn --controller=remote,ip=ODL_IP,port=6633 --switch=ovsk,protocols=OpenFlow13
ovs-vsctl show
3. IP 层防火墙相关流表命令
bash
运行
# 添加拦截流表
ovs-ofctl add-flow s1 priority=120,ip,in_port=1,nw_src=10.0.0.1,nw_dst=10.0.0.2,actions=drop -O OpenFlow13
# 查看流表
ovs-ofctl dump-flows s1 -O OpenFlow13
# 删除流表
ovs-ofctl del-flows s1 nw_src=10.0.0.1,nw_dst=10.0.0.2 -O OpenFlow13
# 连通性测试
h1 ping h2 -c 1
4. Web 服务部署命令
bash
运行
xterm h1
python -m SimpleHTTPServer 80
xterm h2
su - osboxes
firefox
5. SSH 服务部署命令
bash
运行
netstat -tunlp | grep 22
which sshd
/usr/sbin/sshd
ssh osboxes@10.0.0.1
6. 端口防火墙相关流表命令
bash
运行
# 下发80端口拦截规则
ovs-ofctl add-flow s1 priority=110,tcp,in_port=2,nw_src=10.0.0.2,nw_dst=10.0.0.1,tp_dst=80,actions=drop -O OpenFlow13
# 查看流表
ovs-ofctl dump-flows s1 -O OpenFlow13
# 删除端口拦截流表
ovs-ofctl del-flows s1 tcp,in_port=2 -O OpenFlow13