You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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版本范围。
  • 解决方法:统一双方的OpenFlow版本。比如在OVS上设置为1.3:
    ovs-vsctl set bridge br0 protocols=OpenFlow13
    
    同时确保ODL的OpenFlow插件启用了对应版本(默认已支持1.3,若未开启可修改etc/org.opendaylight.openflowplugin.cfg配置文件)。

2. 心跳报文超时或丢失

OVS与ODL靠Echo Request/Reply心跳维持连接,如果心跳响应超时或报文丢失,OVS会将控制器状态切换为IDLE。你提到抓包能看到报文,但可能漏掉了心跳交互的部分。

  • 排查动作
    • 用tcpdump过滤心跳报文:
      tcpdump -i any port 6633 and 'tcp[13] & 0x18 == 0x18'
      
      检查是否有双向的Echo Request/Reply报文;
    • 查看OVS的ovs-vswitchd.log日志,搜索是否有echo request timeout这类关键词。
  • 解决方法
    • 先排查网络是否存在丢包(比如用pingmtr测试控制器与交换机的连通性);
    • 调整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 messageSession closed这类错误信息。
  • 解决方法
    • 如果有bundle未启动,用 bundle:start <bundle-ID> 手动启动;
    • 若配置文件存在问题,检查etc/org.opendaylight.openflowplugin.cfg,确保监听端口(默认6633)正确,且启用了对应OpenFlow版本;
    • 尝试重启OpenFlow插件bundle或整个ODL控制器。

4. OVS控制器连接配置错误

比如你配置的控制器地址/端口有误,或者连接模式设置不当(比如误用了in-band模式但数据流未走正确端口),都会导致连接不稳定。

  • 排查动作
    • 执行 ovs-vsctl list controller,查看target字段是否为tcp:<控制器IP>:6633connection-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

火山引擎 最新活动