SDN 基本应用实践 —— 使用命令行实现简易防火墙功能实验报告
目录
一、实验概述
1.1 实验背景
1.2 实验目的
1.3 实验环境
二、实验原理
三、详细实验步骤
步骤 1:启动 OpenDaylight 控制器并安装所需插件
(1)安装 OVSDB 设备管理组件
(2)安装 RESTCONF 北向 API 组件
(3)安装二层转发与 OpenFlow 协议插件
(4)安装 DLUX 可视化 Web 管理组件
步骤 2:Mininet 创建拓扑并连接 OpenDaylight 控制器
任务一:下发流表,禁止 h1 ping 通 h2
步骤 4:删除流表规则,恢复 h1 与 h2 网络互通
步骤 5:在 h1 主机部署简易 Web 服务
步骤 6:在 h1、h2 开启 SSH 远程登录服务
步骤 7:下发四层端口流表,禁止 h2 访问 h1 的 Web 服务、放行 SSH
步骤 8:删除端口拦截流表,恢复 Web 服务访问权限
四、实验结果分析
4.1 控制器部署结果
4.2 三层 IP 防火墙实验结果
4.3 四层端口精细化防火墙实验结果
五、实验总结与问题排查
5.1 实验总结
5.2 常见故障及解决方案
5.3 实验拓展思考
附录:实验全部核心命令汇总
1. OpenDaylight 插件安装(Karaf 控制台)
2. Mininet 拓扑创建
3. IP 层防火墙相关流表命令
4. Web 服务部署命令
5. SSH 服务部署命令
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-all2. Mininet 拓扑创建
bash
运行
mn --controller=remote,ip=ODL_IP,port=6633 --switch=ovsk,protocols=OpenFlow13 ovs-vsctl show3. 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 14. Web 服务部署命令
bash
运行
xterm h1 python -m SimpleHTTPServer 80 xterm h2 su - osboxes firefox5. SSH 服务部署命令
bash
运行
netstat -tunlp | grep 22 which sshd /usr/sbin/sshd ssh osboxes@10.0.0.16. 端口防火墙相关流表命令
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