本文目录导读:

- 第一部分:环境准备
- 第二部分:部署 SDN 控制器(以 OpenDaylight 为例)
- 第三部分:配置 SDN 数据平面(使用 Mininet 模拟交换机)
- 第四部分:配置流表(实现网络策略)
- 第五部分:常见配置问题与排错
- 总结配置流程
这是一个很好的问题,SDN(软件定义网络)的核心思想是将网络的控制平面(决定流量去哪)与数据平面(实际转发流量)分离,配置SDN网络的关键在于安装和配置一个SDN控制器,并通过它来管理网络设备。
目前最主流的开源SDN控制器是 OpenDaylight (ODL) 和 ONOS,下面的步骤将以 OpenDaylight(Carbon或更高版本) 以及 Mininet(网络模拟器)为例,展示一个完整的配置流程。
第一部分:环境准备
你需要一台安装了 Linux(推荐 Ubuntu 20.04/22.04)的主机,可以是物理机或虚拟机。
-
安装 Java(ODL依赖) OpenDaylight 需要 Java 11。
sudo apt update sudo apt install openjdk-11-jdk
-
下载 Mininet(模拟交换机) Mininet 可以在一台机器上模拟出多个交换机、主机和链路。
sudo apt install mininet
第二部分:部署 SDN 控制器(以 OpenDaylight 为例)
-
下载并解压 ODL 前往 OpenDaylight 官网 或直接使用命令行下载。
wget https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/integration/karaf/0.10.0/karaf-0.10.0.tar.gz tar -xzf karaf-0.10.0.tar.gz cd karaf-0.10.0
-
启动 OpenDaylight
./bin/karaf
启动后你会进入 ODL 的
karaf命令行界面(以opendaylight-user@root>提示)。 -
安装必要的 ODL 功能(Features) 在 karaf 命令行中输入以下命令安装支持 OpenFlow 和 REST API 的核心模块:
# 安装核心OpenFlow插件和L2交换功能 feature:install odl-restconf odl-l2switch-switch odl-openflowplugin-flow-services odl-mdsal-apidocs
- odl-restconf: 提供北向REST API接口(供外部应用调用)。
- odl-l2switch-switch: 实现二层MAC地址学习,让交换机像传统交换机一样工作。
- odl-openflowplugin-flow-services: 核心OpenFlow协议插件,让控制器能与Mininet模拟的交换机通信。
- odl-mdsal-apidocs: 提供API文档页面,方便调试。
-
验证控制器状态 安装完成后,耐心等待几分钟,确保所有服务启动完成,你可以通过浏览器访问 OpenDaylight 的 Web 界面(默认端口 8181):
http://<你的IP>:8181/index.html默认用户名/密码:
admin/admin。 如果能打开登录页面,说明控制器运行成功。
第三部分:配置 SDN 数据平面(使用 Mininet 模拟交换机)
你的控制器正在运行,我们需要创建一个由 OpenFlow 交换机组成的网络,并让它们连接到控制器。
-
启动 Mininet 并连接到控制器 在另一个终端窗口(非 karaf 控制台)中,运行以下命令创建一个简单的拓扑(一个交换机,三台主机):
sudo mn --controller remote,ip=127.0.0.1,port=6653 --switch ovsk,protocols=OpenFlow13 --topo single,3
--controller remote: 告诉 Mininet 使用远程控制器(你的 ODL)。ip=127.0.0.1: 控制器在本机。port=6653: OpenFlow 默认端口(旧版常为6633,ODL默认监听6653)。--switch ovsk: 使用 Open vSwitch 内核态交换机。--topo single,3: 创建一个星形拓扑,1个交换机下连3个主机。
-
验证连接 命令执行后,你会看到
mininet>提示符,Open vSwitch 已经主动向 ODL 控制器发起了连接。 在 ODL 的 karaf 控制台中,你应该能看到类似OpenFlowPluginSwitchConnectionHandler的消息,表示交换机已经上线。
第四部分:配置流表(实现网络策略)
这是SDN配置的核心,在传统网络中,你需要在交换机上配VLAN、ACL,在SDN中,你通过控制器下发流表(Flow Table) 来实现。
场景: 默认情况下,ODL 的 odl-l2switch-switch 功能会让交换机像一个傻瓜交换机一样工作(所有主机互通),但如果你希望禁止主机 A 访问主机 C,你需要手动下发流表。
方法1:通过 Mininet (简单测试)
在 mininet> 提示符下,你可以直接查看流表:
mininet> sh ovs-ofctl dump-flows s1
这会显示当前所有流表项。
方法2:通过 REST API (生产环境常用)
SDN 的真正价值在于通过程序控制,你可以通过 HTTP 请求向控制器下发流表。
示例(使用 curl): 假设你想让所有从 h1(IP 10.0.0.1)发往 h2(IP 10.0.0.2)的流量都丢弃。
-
准备 JSON 数据(创建一个文件,
drop-flow.json):{ "flow": [ { "id": "1", "match": { "ipv4-source": "10.0.0.1/32", "ipv4-destination": "10.0.0.2/32", "ethernet-type": "2048" }, "instructions": { "instruction": [ { "order": "0", "apply-actions": { "action": [ { "drop-action": {} } ] } } ] }, "priority": "100", "table-id": "0", "flow-name": "Drop H1 to H2" } ] } -
发送配置请求到控制器 控制器会将这个流表推送到交换机
s1上。# 注意替换请求路径中的 OF_00... 为你的交换机节点ID # 你可以在浏览器查看API文档,或者登录ODL的Web UI找到交换机ID curl -u admin:admin -X PUT -H "Content-Type: application/json" -d @drop-flow.json http://localhost:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/table/0/flow/1
-
测试结果 回到 Mininet 中:
mininet> h1 ping h2
应该会 Ping不通(因为被丢弃了)。
mininet> h1 ping h3
应该能 Ping通(因为有默认的L2交换规则)。
第五部分:常见配置问题与排错
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
Mininet启动报错 could not connect to controller |
控制器未启动,或端口不匹配 | 检查ODL是否在运行 (./bin/status),确认Mininet使用的端口是6653(或根据ODL配置调整)。 |
| Ping不通任何主机 | ODL的feature装错或未装全 防火墙阻挡了OpenFlow流量 |
重新安装 odl-l2switch-switch,确保Linux防火墙允许端口6633, 6653。 |
| 手动下发的流表不生效 | 流表优先级不够高 | 默认的二层交换规则优先级低(通常为10-50),手动下发流表时将 priority 设为 100 或更高。 |
| Web界面无法访问 | Java版本不对或ODL启动花了长时间 | 确保使用Java 11,等待5分钟再重试。 |
总结配置流程
- 选控制器:安装 OpenDaylight 或 ONOS,配置好北方接口(REST API)。
- 连设备:通过 Mininet 或真实 OpenFlow 交换机(如 Open vSwitch)连接到控制器的 OpenFlow 端口。
- 定策略:通过控制器北向接口(如 REST API、Python脚本)下发流表,而不是在交换机上逐个配置。
- 自动化:利用控制器提供的 RPC(远程过程调用)和通知机制,实现网络行为的动态调整。
SDN 配置的核心不是配“机器”,而是编程网络的行为,希望你从这次配置中感受到了这种思维转变。