OVS常见问题
官网:http://docs.openvswitch.org/en/latest/faq/
因内容较多,不详细展开,该博客仅作为在官网查阅相关内容的指南。读者可以通过对应的标题找到官方的回答,我也会在文中注明一些我暂时用到的且认为比较重要的答案。另外,可能有翻译不准确的地方,请谅解。
一、 基本配置(Basic Configuration)
- 如何将端口配置为访问端口(access port)
答:将tag = VLAN添加到ovs-vsctl add-port命令。例如,以下命令将br0和eth0配置为Trunk端口(默认),而tap0作为VLAN 9的访问端口:
$ ovs-vsctl add-br br0
$ ovs-vsctl add-port br0 eth0
$ ovs-vsctl add-port br0 tap0 tag=9
如果您要将已添加的端口配置为访问端口,请使用ovs-vsctl set,例如:
$ ovs-vsctl set port tap0 tag=9
- 如何将一个端口配置为SPAN端口,也就是说,允许将所有流量镜像到该端口
- Open vSwitch支持在混杂模式(in promiscuous mode)下配置端口吗 ——支持
- 如何将DPDK端口配置为访问端口
- 如何将VLAN配置为RSPAN VLAN,也就是说,允许将所有流量镜像到该VLAN
- 我可以镜像一个以上的输入VLAN到一个RSPAN VLAN吗 ——可以
- 我如何配置所有流量镜像到GRE隧道
- Open vSwitch支持ERSPAN吗 ——支持
- Open vSwitch支持IPv6 GRE吗 ——支持
- 如何连接两个网桥
答:首先,为什么要这样做?两个连接的网桥与单个网桥并没有太大的区别,所以你可能只需要一个带有所有端口的网桥。
如果仍要连接两个网桥,则可以使用一对patch ports。以下示例创建网桥br0和br1,将eth0和tap0添加到br0,将tap1添加到br1,然后将br0和br1用一对patch ports连接。
$ ovs-vsctl add-br br0
$ ovs-vsctl add-port br0 eth0
$ ovs-vsctl add-port br0 tap0
$ ovs-vsctl add-br br1
$ ovs-vsctl add-port br1 tap1
$ ovs-vsctl \
-- add-port br0 patch0 \
-- set interface patch0 type=patch options:peer=patch1 \
-- add-port br1 patch1 \
-- set interface patch1 type=patch options:peer=patch0
- 如何配置没有OpenFlow本地端口的网桥(OFPP_LOCAL意义上的本地端口) ——不支持
二、 新进展(Development)
- 如何实现新的OpenFlow报文
- 如何添加对新字段或报头的支持(new field or header)
- 如何添加对新的OpenFlow操作的支持(actions)
- 如何添加对新的OpenFlow错误消息的支持
- 什么是Signed-off-by,应如何提供
- 如何从电子邮件中应用补丁(patch)
三、 实现细节(Implementation Details)
- OVS的两种类型的流是指什么
- 为什么有这么多不同的方法来显示所有流(dump flows)
- 多播监听(multicast snoopin)如何与vlan一起工作
- OVS可以提前填充内核流表而不是响应数据包吗
- OVS缓存多少个包
四、 概述(General)
- 什么是Open vSwitch
- 什么虚拟化平台可以使用Open vSwitch
- 应如何尝试Open vSwitch
- Open vSwitch只适用于Linux吗
- 将Open vSwitch移植到一个新的平台或交换ASIC需要做些什么
- 为什么我要使用Open vSwitch而不是Linux bridge
- Open vSwitch与分布式虚拟交换机(如VMware vNetwork分布式交换机或Cisco Nexus 1000V)有什么关联
- 为什么Open vSwitch不支持分布式
- 我如何为Open vSwitch社区做贡献
- 为什么我不能再连接到我的OpenFlow控制器或OVSDB管理器
五、 常见配置问题(Common Configuration Issues)
- 我使用以下命令创建了网桥并向其添加了我的以太网端口:
$ ovs-vsctl add-br br0 && ovs-vsctl add-port br0 eth0
当我运行“add-port”命令时,我失去了通过eth0的所有连接
2. 我创建了一个网桥,并向它添加了几个以太网端口,使用的命令如下:
$ ovs-vsctl add-br br0 && ovs-vsctl add-port br0 eth0 && ovs-vsctl add-port br0 eth1
现在我的网络似乎已经崩坏:连接是不可靠的(即使连接不经过Open vSwitch),我的物理交换机上的所有led都在闪烁,wireshark显示重复的数据包,CPU使用率非常高。
3. 我似乎不能在无线网络中使用Open vSwitch
4. 我似乎不能添加我的PPP接口到一个Open vSwitch网桥
5. 是否有关于数据库表和字段的文档(database tables and fields)
6. 当我运行ovs-dpctl时,我不再看到我创建的桥。相反,我只看到一个名为“ovs-system”的数据路径。如何查看特定桥的数据路径信息
7. 我使用ovs-vsctl创建了一个GRE端口,所以为什么我不能发送流量或在数据路径中查看端口
8. Open vSwitch似乎不遵守我的包过滤规则
9. 当我移除端口然后立即放回端口时,Open vSwitch似乎什么也不做。例如,考虑p1是type = internal的端口:
$ ovs-vsctl del-port br0 p1 -- \
add-port br0 p1 -- \
set interface p1 type=internal
任何其他类型的端口都具有相同的效果。
10. 我想要为一个Open vSwitch网桥添加数千个端口,但是使用ovs-vsctl需要花费太长时间(几分钟或几小时)。我怎样才能做得更快呢?
答:如果使用ovs-vsctl一次添加一个,则可能需要很长时间才能将数千个端口添加到Open vSwitch网桥。这是因为ovs-vsctl的每次调用都会首先从OVSDB中读取当前配置。随着端口数量的增加,这开始需要花费大量时间,并且当重复数千次时,总时间变得很长。
解决方案是在一次ovs-vsctl(或少数几个)调用中添加端口。例如,使用bash:
$ ovs-vsctl add-br br0
$ cmds=; for i in {1..5000}; do cmds+=" -- add-port br0 p$i"; done
$ ovs-vsctl $cmds
- 我创建了一个名为br0的网桥。使用命令“ovs-vsctl show”会显示网桥,但“ovs-ofctl show br0”只是打印“br0不是网桥或套接字”
- 我有一个网桥br0。我添加了一个新端口vif1.0,它显示在“ovs-vsctl show”中,但是“ovs-vsctl list port”表示它具有OpenFlow端口(“ ofport”)-1,而“ ovs-ofctl show br0”根本不显示vif1.0。
- 我创建了一个tap设备tap0,在其上配置了一个IP地址,并将其添加到一个网桥上,如下所示:
$ tunctl -t tap0
$ ip addr add 192.168.0.123/24 dev tap0
$ ip link set tap0 up
$ ovs-vsctl add-br br0
$ ovs-vsctl add-port br0 tap0
我本以为我可以使用这个IP地址联系网络上的其他主机,但它不工作。为什么呢?
14. 在运行数百个容器应用程序并通过硬件流量生成器生成的流量连接到OVS的服务器上的RFC2544测试开始时,我观察到数据包丢失。我怎样才能解决这个问题?
15. 如何配置网桥内部接口MTU?为什么Open vSwitch会不断改变内部端口MTU?
16. 我刚刚升级,我看到性能下降。为什么
17. 我无法卸载openvswitch内核模块。为什么
六、 使用OpenFlow(Using OpenFlow)
- Open vSwitch支持哪些版本的OpenFlow
- Open vSwitch支持MPLS吗
- 出现了“error type 45250 code 0”。那是什么
- 我期望OpenFlow控制器看到的一些流量实际上并没有通过OpenFlow连接出现
- 我的控制器设置的一些OpenFlow流似乎不适用于某些流量,特别是OVS和控制器本身之间的流量。
- 我将所有控制器配置为out-of-band模式,但是“ovs-appctl bridge/dump-flows”仍然显示一些隐藏流。
- 我的OpenFlow控制器没有看到我所期望的vlan
- 我运行了ovs-ofctl add-flow br0 nw_dst=192.168.0.1,actions=drop,但是我得到了一个有趣的消息:
ofp_util|INFO|normalization changed ofp_match, details:
ofp_util|INFO|pre: nw_dst=192.168.0.1
ofp_util|INFO|post:
当我运行ovs-ofctl dump-flows br0时,我看到我的nw_dst匹配消失了,所以该流最终匹配了每个数据包。 - 如何得到给定端口的OpenFlow端口号
- 我用控制器或ovs-ofctl添加了一些流,但是当我运行“ovs-dpctl dump-flows”时,我没有看到它们。
- 看来绑定端口中的每个接口都显示为单独的OpenFlow端口。是这样吗?——是的
- 我有一个复杂的网络设置,包括Open vSwitch、VMs或多个主机,以及其他组件。但行为不是我所期望的。该怎么办(询问debug方式)
- 我如何使一个流丢弃包(drop不是一个动作,在OpenFlow或Open vSwitch中都不是。相反,它只是一种说法,即采取任何行动(actions))
- 我添加了一个流将数据包从入口端口发送出去,就像这样:
$ ovs-ofctl add-flow br0 in_port=2,actions=2
但是OVS却丢弃了数据包。
答:为防止环路默认不发往进入端口,应用in_port代替。(此外,回答中还介绍了一些转发的actions。)
15. 我的网桥br0在端口1上具有主机192.168.0.1,在端口2上具有主机192.168.0.2。我设置了流以仅转发发往另一主机的流量,并丢弃其他流量,如下所示:
priority=5,in_port=1,ip,nw_dst=192.168.0.2,actions=2
priority=5,in_port=2,ip,nw_dst=192.168.0.1,actions=1
priority=0,actions=drop
但这不起作用-执行此操作后我没有得到任何连接。为什么?
答: 因为这些流丢弃IP主机用于在以太网上建立IP连接的ARP包。为了解决这个问题,添加了允许ARP在主机之间传递的流,即:
priority=5,in_port=1,arp,actions=2
priority=5,in_port=2,arp,actions=1
这个问题也可以通过其他方式表现出来。以下在以太网地址而不是IP地址上匹配的流也会丢弃ARP包,因为ARP请求是广播的,而不是定向到特定的主机:
priority=5,in_port=1,dl_dst=54:00:00:00:00:02,actions=2
priority=5,in_port=2,dl_dst=54:00:00:00:00:01,actions=1
priority=0,actions=drop
在这种情况下,上面已经描述的解决方案也将起作用。最好添加流以允许所有多播和广播流量:
priority=5,in_port=1,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00,actions=2
priority=5,in_port=2,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00,actions=1
- 我的网桥在add-port/del-port上断开了与我的控制器的连接
- 我的控制器抱怨OVS没有缓冲数据包。这是怎么回事
- OVS如何在OpenFlow“select”组的桶之间划分流
- OpenFlow“select”组并没有将包均匀地分配到各个bucket中。
- 我添加了一个流来接受VLAN 123上的数据包并在VLAN 456上输出它们,如下所示:
$ ovs-ofctl add-flow br0 dl_vlan=123,actions=output:1,mod_vlan_vid:456
但是这些包实际上是在VLAN 123中输出的。为什么?
答:OpenFlow操作按照指定的顺序执行。因此,上述操作首先输出数据包,然后更改其VLAN。由于输出发生在更改VLAN之前,所以VLAN中的更改将没有可见的效果。
要解决此问题和类似问题,请对操作进行排序,以便在输出之前对标头进行更改,例如:
ovs-ofctl add-flow br0 dl_vlan=123,actions=mod_vlan_vid:456,output:1
- 我增加一个将TCP端口为80到端口443的重定向数据包的流,如下:
$ ovs-ofctl add-flow br0 tcp,tcp_dst=123,actions=mod_tp_dst:443
但是数据包却被丢弃了。为什么?
答:这组操作确实会将TCP目标端口更改为443,但是除此之外它什么也不做。例如,它不会说继续到另一个流表或输出包。因此,数据包被丢弃。要解决这个问题,可以添加一个操作来处理修改后的包。例如:
$ ovs-ofctl add-flow br0 tcp,tcp_dst=123,actions=mod_tp_dst:443,normal
- 在使用FTP连接的“ct”操作时,是否在操作中设置“alg= FTP”参数似乎并不重要。这是必需的吗? ——建议使用