SDN 基本应用实践 —— 使用命令行实现简易防火墙功能实验报告

目录

一、实验概述

[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 实验目的

  1. 掌握 OpenDaylight(锂版本)控制器部署及核心功能插件安装方法,理解 SDN 南向、北向接口工作机制。
  2. 使用 Mininet 搭建单交换机双主机拓扑,完成 OVS 交换机与 OpenDaylight 远程控制器对接。
  3. 熟练使用ovs-ofctl工具完成 OpenFlow 流表的添加、查看、删除操作。
  4. 基于流表规则实现三层 IP 防火墙:阻断 h1 与 h2 之间 ICMP 报文,验证网络访问拦截与连通恢复。
  5. 基于四层 TCP 端口实现精细化访问控制:禁止 h2 访问 h1 的 80 端口 Web 服务,放行 22 端口 SSH 远程登录服务。
  6. 理解 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 服务

二、实验原理

  1. SDN 防火墙原理 SDN 将控制层与数据层解耦,OpenDaylight 集中管控全网,通过南向协议下发流表至 OVS 交换机。交换机根据流表匹配字段(源 IP、目的 IP、入端口、协议、目的端口等)对数据包执行转发、丢弃动作,在数据平面实现访问控制,即软件防火墙。
  2. OpenFlow 流表关键字段说明
  • priority:流表优先级,数值越大优先匹配;
  • 匹配域:入端口、源目的 IP、传输协议、源目的端口;
  • actions:数据包匹配后执行动作,drop丢弃、output转发。
  1. 服务原理
  • Python SimpleHTTPServer:快速搭建 80 端口 HTTP 静态 Web 服务;
  • SSH 服务:基于 TCP 22 端口实现远程终端登录。

三、详细实验步骤

步骤 1:启动 OpenDaylight 控制器并安装所需插件

  1. 进入 OpenDaylight 安装目录,执行./karaf启动 Karaf 控制台。
  2. 在 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
  1. 等待插件全部安装完成,保持 Karaf 控制台后台运行。

步骤 2:Mininet 创建拓扑并连接 OpenDaylight 控制器

  1. 在 Mininet 虚拟机终端执行命令,创建远程控制器拓扑,指定 OpenFlow1.3 协议:

bash

运行

复制代码
sudo mn --controller=remote,ip=127.0.0.1,port=6653 --switch=ovsk,protocols=OpenFlow13
  1. 查看 OVS 交换机与控制器连接状态:

bash

运行

复制代码
ovs-vsctl show

若输出控制器连接状态为connected,代表拓扑对接成功。 3. 连通性预测试:Mininet 中执行h1 ping h2,默认二层转发下两台主机正常互通。

任务一:下发流表,禁止 h1 ping 通 h2

  1. 退出 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
  1. 查看交换机流表,校验规则下发成功:

bash

运行

复制代码
ovs-ofctl dump-flows s1 -O OpenFlow13
  1. 连通性验证:Mininet 执行h1 ping h2 -c 1,数据包请求超时,主机间无法 ping 通,IP 防火墙拦截生效。

步骤 4:删除流表规则,恢复 h1 与 h2 网络互通

  1. 精准删除本次添加的拦截流表项:

bash

运行

复制代码
ovs-ofctl del-flows s1 nw_src=10.0.0.1,nw_dst=10.0.0.2 -O OpenFlow13
  1. 再次查看流表,确认该规则已被删除:

bash

运行

复制代码
ovs-ofctl dump-flows s1 -O OpenFlow13
  1. 连通性验证:执行h1 ping h2,两台主机恢复正常网络互通。

步骤 5:在 h1 主机部署简易 Web 服务

  1. Mininet CLI 中打开 h1 独立终端:

bash

运行

复制代码
xterm h1
  1. 在 h1 终端启动 Python2 内置 HTTP 服务,监听 80 端口:

bash

运行

复制代码
python -m SimpleHTTPServer 80
  1. 打开 h2 终端,切换普通用户后启动浏览器访问 Web 服务:

bash

运行

复制代码
xterm h2
su - osboxes
firefox

在浏览器地址栏输入10.0.0.1,可正常访问 h1 的 Web 页面,服务部署验证成功。

步骤 6:在 h1、h2 开启 SSH 远程登录服务

  1. 在 h1 终端查看 22 端口监听状态:

bash

运行

复制代码
netstat -tunlp | grep 22
  1. 若未监听,则手动启动 sshd 服务:

bash

运行

复制代码
which sshd
/usr/sbin/sshd
  1. 在 h2 主机执行相同操作开启 sshd 服务。
  2. 从 h2 远程 SSH 登录 h1,验证服务可用性:

bash

运行

复制代码
ssh osboxes@10.0.0.1

输入用户密码后成功登录,SSH 服务运行正常。

步骤 7:下发四层端口流表,禁止 h2 访问 h1 的 Web 服务、放行 SSH

  1. 下发 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
  1. 查看流表确认规则生效:

bash

运行

复制代码
ovs-ofctl dump-flows s1 -O OpenFlow13
  1. 功能验证:
    • Web 访问:h2 打开 Firefox 访问10.0.0.1,页面连接超时,Web 访问被防火墙拦截;
    • SSH 登录:h2 执行ssh osboxes@10.0.0.1可正常登录,22 端口流量未被限制,符合实验策略要求。

步骤 8:删除端口拦截流表,恢复 Web 服务访问权限

  1. 删除 80 端口拦截流规则:

bash

运行

复制代码
ovs-ofctl del-flows s1 tcp,in_port=2 -O OpenFlow13
  1. 校验流表已删除:

bash

运行

复制代码
ovs-ofctl dump-flows s1 -O OpenFlow13
  1. 再次使用 h2 浏览器访问10.0.0.1,Web 网页正常打开,访问权限恢复。

四、实验结果分析

4.1 控制器部署结果

OpenDaylight 所有插件安装无报错,可通过http://ODL_IP:8181访问 DLUX 可视化页面,能够正常发现 s1 交换机、h1/h2 主机拓扑,南向连接状态正常。

4.2 三层 IP 防火墙实验结果

  1. 下发h1→h2IP 拦截流表后,ICMP 数据包被丢弃,h1 ping h2请求超时,单向访问成功阻断;
  2. 删除流表规则后,数据包按照 L2 默认规则正常转发,两台主机双向可达;
  3. 结果说明:SDN 可基于源目 IP 精准拦截网段流量,实现传统边界防火墙的 IP 访问控制能力。

4.3 四层端口精细化防火墙实验结果

  1. 部署 Python Web 与 SSH 服务后,未下发流表时,h2 可正常访问 h1 的 HTTP 服务、SSH 远程登录;
  2. 下发 TCP 80 端口丢弃规则后,仅 Web 服务访问失败,SSH 22 端口流量不受限制,实现最小权限安全策略;
  3. 删除端口流表后,Web 访问恢复正常,验证 SDN 防火墙可灵活动态调整安全策略。

五、实验总结与问题排查

5.1 实验总结

  1. 本次实验完成了 OpenDaylight 控制器环境部署、Mininet 拓扑搭建与控制器对接,掌握了 SDN 典型组件功能与安装方式。
  2. 通过ovs-ofctl命令实现了 OpenFlow 流表的增、删、查操作,分别从网络层、传输层两个维度完成简易防火墙访问控制。
  3. 相比传统硬件防火墙,SDN 软件防火墙优势显著:安全策略集中化管理、动态一键下发、按需灵活修改访问规则,可针对异常流量实时拦截,极大提升网络安全运维的灵活性与响应速度。
  4. 实验同时验证了常用网络服务(HTTP、SSH)的部署与测试方法,结合 SDN 流规则可实现精细化的业务流量安全管控。

5.2 常见故障及解决方案

  1. 交换机无法连接 ODL 控制器 排查:确认 ODL 虚拟机防火墙放行 6633 端口、Mininet 命令中控制器 IP 填写正确、ODL 已安装odl-ovsdb-all插件。
  2. 流表规则不生效 排查:下发命令必须携带-O OpenFlow13指定协议版本,核对交换机端口、主机 IP 与拓扑信息一致。
  3. Python Web 服务无法被访问 排查:Python2 使用SimpleHTTPServer模块,Python3 需替换为http.server,确认 h1 防火墙未拦截 80 端口。
  4. SSH 登录失败 排查:手动执行/usr/sbin/sshd启动服务,使用netstat确认 22 端口处于监听状态,登录命令使用正确用户名。

5.3 实验拓展思考

  1. 本次仅实现单向流量拦截,如需双向禁止主机互访,需要添加两条源目 IP 互换的 drop 流规则。
  2. 除命令行方式外,可通过 OpenDaylight REST API、RYU 控制器 Python 应用编程方式自动化批量下发防火墙策略,实现安全防护可编程化。
  3. 可结合流量采集、入侵检测应用,在 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
相关推荐
闪电悠米2 小时前
黑马点评-Redis ZSet-实现关注 Feed 流
服务器·网络·数据库·redis·缓存·junit·lua
yyuuuzz2 小时前
2026游戏云服务器推荐的技术判断思路
运维·服务器·开发语言·网络·人工智能·游戏·php
江华森2 小时前
Linux 运维新手入门课
linux·运维·服务器
森G2 小时前
78、框架分析------服务器源码解析----云视频服务项目
服务器·c++·qt
云飞云共享云桌面11 小时前
传统工作站 vs 云飞云共享云桌面:制造业设计云桌面选型深度对比
运维·服务器·前端·网络·3d·架构·制造
JAVA面经实录91712 小时前
操作系统面试题
java·服务器·数据库·计算机网络·面试
小刘|12 小时前
Spring AI Alibaba 集成和风天气 API 实战
java·服务器·前端
Maynor99613 小时前
我用 Codex 给自己的网站上线了一个智能体客服:从 Dify 到服务器部署,全程实战复盘
运维·服务器
聚名网14 小时前
域名net,com,cn有区别吗?有哪些不同呢?
服务器·开发语言·php