OpenDaylight与Open vSwitch无法建立OpenFlow连接问题求助
排查OpenDaylight与Open vSwitch OpenFlow连接异常的问题
结合你描述的症状——控制器与交换机间有OpenFlow报文,但OVS控制器状态从ACTIVE跳转为IDLE,ODL拓扑无节点、会话统计异常,我整理了几个最可能的原因及对应的排查/解决步骤:
1. OpenFlow版本不匹配
这是最常见的坑之一。ODL默认通常启用OpenFlow 1.3,但如果OVS配置的是其他版本(比如1.0),双方初始握手能交换报文,但后续协商会失败,最终OVS会把控制器标记为IDLE。
- 排查动作:
- 在OVS上执行
ovs-vsctl show,查看网桥的protocols字段,确认配置的OpenFlow版本; - 在ODL的Karaf控制台输入
openflow:show,检查控制器启用的OpenFlow版本范围。
- 在OVS上执行
- 解决方法:统一双方的OpenFlow版本。比如在OVS上设置为1.3:
同时确保ODL的OpenFlow插件启用了对应版本(默认已支持1.3,若未开启可修改ovs-vsctl set bridge br0 protocols=OpenFlow13etc/org.opendaylight.openflowplugin.cfg配置文件)。
2. 心跳报文超时或丢失
OVS与ODL靠Echo Request/Reply心跳维持连接,如果心跳响应超时或报文丢失,OVS会将控制器状态切换为IDLE。你提到抓包能看到报文,但可能漏掉了心跳交互的部分。
- 排查动作:
- 用tcpdump过滤心跳报文:
检查是否有双向的Echo Request/Reply报文;tcpdump -i any port 6633 and 'tcp[13] & 0x18 == 0x18' - 查看OVS的
ovs-vswitchd.log日志,搜索是否有echo request timeout这类关键词。
- 用tcpdump过滤心跳报文:
- 解决方法:
- 先排查网络是否存在丢包(比如用
ping或mtr测试控制器与交换机的连通性); - 调整OVS的心跳超时参数,默认是5秒,可适当调大:
ovs-vsctl set controller br0 inactivity_probe=60000 - 检查ODL侧是否有线程阻塞,导致无法及时响应心跳(查看
karaf.log是否有相关报错)。
- 先排查网络是否存在丢包(比如用
3. ODL的OpenFlow插件状态异常
虽然抓包能看到报文,但ODL可能没正确处理OVS的连接请求——比如拓扑服务未启动、OpenFlow插件会话管理故障,都会导致拓扑中看不到节点。
- 排查动作:
- 在Karaf控制台执行
bundle:list | grep openflow,确认所有openflowplugin相关的bundle都处于Active状态; - 输入
openflow:node-list,查看是否有已注册的交换机节点; - 查看ODL的
data/log/karaf.log,搜索Failed to handle message、Session closed这类错误信息。
- 在Karaf控制台执行
- 解决方法:
- 如果有bundle未启动,用
bundle:start <bundle-ID>手动启动; - 若配置文件存在问题,检查
etc/org.opendaylight.openflowplugin.cfg,确保监听端口(默认6633)正确,且启用了对应OpenFlow版本; - 尝试重启OpenFlow插件bundle或整个ODL控制器。
- 如果有bundle未启动,用
4. OVS控制器连接配置错误
比如你配置的控制器地址/端口有误,或者连接模式设置不当(比如误用了in-band模式但数据流未走正确端口),都会导致连接不稳定。
- 排查动作:
- 执行
ovs-vsctl list controller,查看target字段是否为tcp:<控制器IP>:6633,connection-mode是否为out-of-band(带外管理场景下)。
- 执行
- 解决方法:重新配置控制器连接:
ovs-vsctl set-controller br0 tcp:<控制器IP>:6633 ovs-vsctl set controller br0 connection-mode=out-of-band
5. 防火墙/安全组拦截TCP会话
即使初始报文能通过,防火墙或安全组若拦截了后续的TCP交互(比如ACK报文、心跳报文),也会导致连接中断。
- 排查动作:
- 临时关闭控制器和交换机上的防火墙(比如
systemctl stop firewalld),测试连接是否恢复; - 用
netstat -anp | grep 6633检查控制器6633端口是否处于LISTEN状态,交换机是否有ESTABLISHED的TCP连接。
- 临时关闭控制器和交换机上的防火墙(比如
- 解决方法:添加防火墙规则允许6633端口双向TCP流量:
firewall-cmd --add-port=6633/tcp --permanent firewall-cmd --reload
内容的提问来源于stack exchange,提问作者greenpau




