SDN 基本应用实践 —— 使用命令行实现简易防火墙功能实验报告
目录一、实验概述1.1 实验背景1.2 实验目的1.3 实验环境二、实验原理三、详细实验步骤步骤 1启动 OpenDaylight 控制器并安装所需插件1安装 OVSDB 设备管理组件2安装 RESTCONF 北向 API 组件3安装二层转发与 OpenFlow 协议插件4安装 DLUX 可视化 Web 管理组件步骤 2Mininet 创建拓扑并连接 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转发。服务原理PythonSimpleHTTPServer快速搭建 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-all2安装 RESTCONF 北向 API 组件bash运行feature:install odl-restconf3安装二层转发与 OpenFlow 协议插件bash运行feature:install odl-l2switch-switch feature:install odl-openflowplugin-all4安装 DLUX 可视化 Web 管理组件bash运行feature:install odl-dlux-all feature:install odl-mdsal-all等待插件全部安装完成保持 Karaf 控制台后台运行。步骤 2Mininet 创建拓扑并连接 OpenDaylight 控制器在 Mininet 虚拟机终端执行命令创建远程控制器拓扑指定 OpenFlow1.3 协议bash运行sudo mn --controllerremote,ip127.0.0.1,port6653 --switchovsk,protocolsOpenFlow13查看 OVS 交换机与控制器连接状态bash运行ovs-vsctl show若输出控制器连接状态为connected代表拓扑对接成功。 3. 连通性预测试Mininet 中执行h1 ping h2默认二层转发下两台主机正常互通。任务一下发流表禁止 h1 ping 通 h2退出 Mininet 交互终端执行下发拦截流表命令bash运行ovs-ofctl add-flow s1 priority120,ip,in_port1,nw_src10.0.0.1,nw_dst10.0.0.2,actionsdrop -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_src10.0.0.1,nw_dst10.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 osboxes10.0.0.1输入用户密码后成功登录SSH 服务运行正常。步骤 7下发四层端口流表禁止 h2 访问 h1 的 Web 服务、放行 SSH下发 TCP 端口拦截流表阻断 h2 访问 h1 的 80 端口bash运行ovs-ofctl add-flow s1 priority110,tcp,in_port2,nw_src10.0.0.2,nw_dst10.0.0.1,tp_dst80,actionsdrop -O OpenFlow13查看流表确认规则生效bash运行ovs-ofctl dump-flows s1 -O OpenFlow13功能验证Web 访问h2 打开 Firefox 访问10.0.0.1页面连接超时Web 访问被防火墙拦截SSH 登录h2 执行ssh osboxes10.0.0.1可正常登录22 端口流量未被限制符合实验策略要求。步骤 8删除端口拦截流表恢复 Web 服务访问权限删除 80 端口拦截流规则bash运行ovs-ofctl del-flows s1 tcp,in_port2 -O OpenFlow13校验流表已删除bash运行ovs-ofctl dump-flows s1 -O OpenFlow13再次使用 h2 浏览器访问10.0.0.1Web 网页正常打开访问权限恢复。四、实验结果分析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 --controllerremote,ipODL_IP,port6633 --switchovsk,protocolsOpenFlow13 ovs-vsctl show3. IP 层防火墙相关流表命令bash运行# 添加拦截流表 ovs-ofctl add-flow s1 priority120,ip,in_port1,nw_src10.0.0.1,nw_dst10.0.0.2,actionsdrop -O OpenFlow13 # 查看流表 ovs-ofctl dump-flows s1 -O OpenFlow13 # 删除流表 ovs-ofctl del-flows s1 nw_src10.0.0.1,nw_dst10.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 osboxes10.0.0.16. 端口防火墙相关流表命令bash运行# 下发80端口拦截规则 ovs-ofctl add-flow s1 priority110,tcp,in_port2,nw_src10.0.0.2,nw_dst10.0.0.1,tp_dst80,actionsdrop -O OpenFlow13 # 查看流表 ovs-ofctl dump-flows s1 -O OpenFlow13 # 删除端口拦截流表 ovs-ofctl del-flows s1 tcp,in_port2 -O OpenFlow13