Open vSwitch (OVS) 配置与管理指南
Open vSwitch (OVS) 是一个功能强大的多层虚拟交换机,专为云环境和虚拟化架构设计。它提供了丰富的网络功能,如流量控制、网络隔离和灵活的网络配置,使其成为构建复杂网络拓扑的理想选择。本指南将详细介绍如何在 Ubuntu 系统上安装、配置和管理 OVS,以满足您的虚拟化需求。
目录
- 安装 Open vSwitch
- 创建虚拟交换机
- 添加端口到交换机
- 配置 Netplan 以保持配置持久化
- 验证 OVS 配置
- 使用 OVS 对虚拟机端口进行IP绑定
- 限制虚拟机的网速
- 基本思路与规则示例
- 总结
- 附录:常用命令汇总
1. 安装 Open vSwitch
在 Ubuntu 系统上安装 Open vSwitch 非常简便。请按照以下步骤进行安装:
更新软件包列表:
sudo apt-get update
安装 Open vSwitch:
sudo apt-get install -y openvswitch-switch
验证安装:
安装完成后,可以通过以下命令检查 OVS 服务状态:
sudo systemctl status openvswitch-switch
输出示例:
● openvswitch-switch.service - Open vSwitch switch daemon Loaded: loaded (/lib/systemd/system/openvswitch-switch.service; enabled; vendor preset: enabled) Active: active (running) since ...
2. 创建虚拟交换机
创建一个新的 OVS 虚拟交换机(例如 br0
):
sudo ovs-vsctl add-br br0
说明:
add-br br0
:创建名为br0
的虚拟交换机。
验证创建:
sudo ovs-vsctl show
输出示例:
Bridge br0
Port br0
Interface br0
type: internal
3. 添加端口到交换机
将物理网卡或虚拟网卡添加到交换机,以实现网络连接。
3.1 添加物理网卡
假设您的物理网卡为 eth0
,将其添加到 br0
:
sudo ovs-vsctl add-port br0 eth0
3.2 添加虚拟端口
创建并添加一个虚拟端口(例如 vnat001
)到 br0
:
sudo ovs-vsctl add-port br0 vnat001
说明:
vnat001
可以用于连接虚拟机或其他网络接口。
4. 配置 Netplan 以保持配置持久化
为了确保网络配置在系统重启后依然有效,需要通过 Netplan 配置文件进行持久化设置。以下提供两种配置方式:基于 MAC 地址绑定和非基于 MAC 地址绑定。
4.1 MAC地址绑定版本
编辑 Netplan 配置文件(例如 /etc/netplan/50-network.yaml
):
sudo vim /etc/netplan/50-network.yaml
配置内容:
network:
version: 2
renderer: networkd
ethernets:
lo:
addresses:
- 127.0.0.1/8
eth0:
dhcp4: no
match:
macaddress: <MAC_ADDRESS_OF_ETH0>
set-name: eth0
bridges:
br0:
interfaces: [eth0]
addresses:
- <HOST_RESERVED_IP>/24 # 例如:103.38.82.24/24
routes:
- to: 0.0.0.0/0
via: <GATEWAY_IP> # 例如:103.38.82.1
nameservers:
addresses:
- <DNS_SERVER_1> # 例如:8.8.8.8
- <DNS_SERVER_2> # 例如:114.114.114.114
parameters:
stp: false
dhcp4: no
openvswitch: {} # 指定使用 Open vSwitch
替换占位符:
<MAC_ADDRESS_OF_ETH0>
:替换为eth0
的实际 MAC 地址。可通过ip link show eth0
获取。<HOST_RESERVED_IP>
:替换为主机预留的 IP 地址(如103.38.82.24
)。<GATEWAY_IP>
:替换为默认网关的 IP 地址(如103.38.82.1
)。<DNS_SERVER_1>
和<DNS_SERVER_2>
:替换为您的 DNS 服务器地址(如8.8.8.8
和114.114.114.114
)。
4.2 非MAC地址绑定版本
如果不基于 MAC 地址绑定,可以使用以下配置:
network:
version: 2
renderer: networkd
ethernets:
lo:
addresses:
- 127.0.0.1/8
eth0:
dhcp4: no
set-name: eth0
bridges:
br0:
interfaces: [eth0]
addresses:
- <HOST_RESERVED_IP>/24 # 例如:103.38.82.24/24
routes:
- to: 0.0.0.0/0
via: <GATEWAY_IP> # 例如:103.38.82.1
nameservers:
addresses:
- <DNS_SERVER_1> # 例如:8.8.8.8
- <DNS_SERVER_2> # 例如:114.114.114.114
parameters:
stp: false
dhcp4: no
openvswitch: {} # 指定使用 Open vSwitch
替换占位符:
<HOST_RESERVED_IP>
、<GATEWAY_IP>
、<DNS_SERVER_1>
和<DNS_SERVER_2>
的替换方式同上。
应用配置
编辑并保存配置文件后,应用 Netplan 配置:
sudo netplan apply
验证配置:
sudo netplan try
此命令允许您测试新的网络配置,并在配置错误时自动回滚。
5. 验证 OVS 配置
确保 OVS 已正确接管网络接口,并且没有错误信息。
查看 OVS 配置:
sudo ovs-vsctl show
输出示例:
Bridge br0 Port br0 Interface br0 type: internal Port eth0 Interface eth0
检查端口状态:
sudo ovs-vsctl list-ports br0
输出示例:
br0 eth0 vnat001
6. 使用 OVS 对虚拟机端口进行IP绑定
为了防止虚拟机IP被盗用,可以通过 OVS 配置流表规则,绑定特定IP地址到虚拟机端口。
6.1 常规的端口IP绑定
使用 ovs-ofctl
命令添加流表规则,限制虚拟机端口只能使用特定IP地址:
sudo ovs-ofctl add-flow br0 "in_port=<虚拟机端口>,dl_type=0x0800,nw_src=<绑定的IP地址>,priority=100,actions=NORMAL"
示例:
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_type=0x0800,nw_src=192.168.1.100,priority=100,actions=NORMAL"
参数解释:
in_port=vnat001
:指定进入端口为vnat001
。dl_type=0x0800
:仅匹配IPv4流量。nw_src=192.168.1.100
:限制源IP地址为192.168.1.100
。priority=100
:设置规则优先级。actions=NORMAL
:允许正常转发流量。
6.2 配置流量丢弃
为未授权的流量添加丢弃规则,确保只有符合条件的流量被允许:
sudo ovs-ofctl add-flow br0 "in_port=<虚拟机端口>,priority=50,actions=drop"
示例:
sudo ovs-ofctl add-flow br0 "in_port=vnat001,priority=50,actions=drop"
说明:
priority=50
:较低优先级,确保此规则在高优先级规则之后匹配。actions=drop
:匹配流量将被直接丢弃。
6.3 使用 MAC 地址和 IP 地址进行绑定
进一步加强安全性,可以同时绑定 MAC 地址和 IP 地址:
sudo ovs-ofctl add-flow br0 "in_port=<接口名称>,dl_src=<绑定的MAC地址>,priority=100,actions=NORMAL"
示例:
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_src=52:54:00:7f:4a:63,priority=100,actions=NORMAL"
参数解释:
dl_src=52:54:00:7f:4a:63
:限制源MAC地址为52:54:00:7f:4a:63
。
6.4 验证绑定是否成功
查看当前流表规则,确保绑定规则已正确添加:
sudo ovs-ofctl dump-flows br0
示例输出:
NXST_FLOW reply (xid=0x2):
cookie=0x0, duration=10.312s, table=0, priority=100, in_port=vnat001, dl_type=0x0800, nw_src=192.168.1.100 actions=NORMAL
cookie=0x0, duration=10.312s, table=0, priority=50, in_port=vnat001 actions=drop
6.5 清除流表规则(如需)
如果需要清除所有流表规则,并恢复默认转发行为:
sudo ovs-ofctl del-flows br0
sudo ovs-ofctl add-flow br0 "priority=0,actions=NORMAL"
说明:
- 第一条命令删除所有现有的流表规则。
- 第二条命令添加一个默认规则,允许所有流量正常转发。
7. 限制虚拟机的网速
通过 Open vSwitch 的 QoS(Quality of Service)功能,可以限制虚拟机的网络带宽,确保资源合理分配。
7.1 对下行流量限速
使用 ovs-vsctl
命令为虚拟机端口配置 QoS:
sudo ovs-vsctl set port <虚拟机端口> qos=@newqos -- \
--id=@newqos create QoS type=linux-htb other-config:max-rate=10000000 other-config:burst=1000000 queues:0=@q0 -- \
--id=@q0 create Queue other-config:min-rate=10000000 other-config:max-rate=10000000 other-config:burst=1000000
示例:
sudo ovs-vsctl set port vnat001 qos=@newqos -- \
--id=@newqos create QoS type=linux-htb other-config:max-rate=10000000 other-config:burst=1000000 queues:0=@q0 -- \
--id=@q0 create Queue other-config:min-rate=10000000 other-config:max-rate=10000000 other-config:burst=1000000
参数解释:
set port vnat001 qos=@newqos
:将vnat001
端口的 QoS 设置为@newqos
。create QoS type=linux-htb
:创建一个类型为linux-htb
的 QoS 配置(HTB - Hierarchical Token Bucket)。other-config:max-rate=10000000
:最大带宽限制为 10 Mbps。other-config:burst=1000000
:突发带宽为 1 Mbps。queues:0=@q0
:创建队列@q0
并绑定到 QoS 配置。create Queue
:定义队列的详细配置。
7.2 验证 QoS 配置
查看当前的 QoS 配置和队列设置:
sudo ovs-vsctl list qos
sudo ovs-vsctl list queue
示例输出:
uuid type other_config
-----------------------------------------------
<uuid> linux-htb {max-rate=10000000, burst=1000000}
uuid other_config
-----------------------------------
<uuid> {min-rate=10000000, max-rate=10000000, burst=1000000}
7.3 限制下行带宽
由于 OVS 的 QoS 主要作用于出站流量,接收方向的流量无法直接通过 QoS 限制。可以使用 ingress_policing_rate
来限制下行带宽:
sudo ovs-vsctl set interface <虚拟机端口> ingress_policing_rate=<带宽限制> ingress_policing_burst=<突发带宽>
示例:
sudo ovs-vsctl set interface vnat001 ingress_policing_rate=5000 ingress_policing_burst=500
参数解释:
ingress_policing_rate=5000
:限制下行带宽为 5 Mbps(单位为 Kbps)。ingress_policing_burst=500
:突发带宽为 500 Kbps。
8. 基本思路与规则示例
OVS 的流表规则可以根据不同的条件限制端口的流量方向。以下介绍几种常见的流量控制方式及示例规则。
8.1 基于源/目标 IP 地址的限制
限制特定 IP 地址的访问权限。
示例:允许源 IP 为 192.168.1.100
的流量访问虚拟机的 vnat001
端口上的 TCP 22 端口(SSH)。
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_type=0x0800,nw_src=192.168.1.100,tp_dst=22,priority=100,actions=NORMAL"
解释:
in_port=vnat001
:指定流量进入的端口为vnat001
。dl_type=0x0800
:仅匹配 IPv4 流量。nw_src=192.168.1.100
:限制源 IP 地址为192.168.1.100
。tp_dst=22
:目标端口为 22(SSH)。priority=100
:设置规则优先级为 100。actions=NORMAL
:允许正常转发流量。
8.2 基于源/目标端口的限制
控制不同应用(如 HTTP、SSH)的访问权限。
示例:允许虚拟机的 vnat001
端口接收 TCP 80 和 443 端口的流量(HTTP 和 HTTPS),并允许其出站访问同样的端口。
# 允许进入端口 80 和 443 的流量
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_type=0x0800,tp_dst=80,priority=100,actions=NORMAL"
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_type=0x0800,tp_dst=443,priority=100,actions=NORMAL"
# 允许从端口 80 和 443 发出的流量
sudo ovs-ofctl add-flow br0 "out_port=vnat001,dl_type=0x0800,tp_src=80,priority=100,actions=NORMAL"
sudo ovs-ofctl add-flow br0 "out_port=vnat001,dl_type=0x0800,tp_src=443,priority=100,actions=NORMAL"
8.3 基于协议的限制
限制特定协议类型的流量。
示例:仅允许 ICMP(如 ping)流量进入虚拟机的 vnat001
端口。
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_type=0x0800,ip,icmp,priority=100,actions=NORMAL"
解释:
icmp
:仅匹配 ICMP 协议流量。
9. 总结
通过本文的详细步骤,您已经掌握了在 Ubuntu 系统上安装、配置和管理 Open vSwitch (OVS) 的基本方法。以下是关键要点总结:
安装与配置:
- 安装 OVS 并创建虚拟交换机。
- 添加物理和虚拟端口到交换机。
- 通过 Netplan 配置网络,确保配置持久化。
流量控制与安全:
- 使用流表规则绑定 IP 和 MAC 地址,防止 IP 偷用。
- 配置 QoS 限制虚拟机的网络带宽,确保资源合理分配。
- 基于 IP、端口和协议类型的流量控制,提升网络安全性。
验证与维护:
- 定期使用
ovs-vsctl
和ovs-ofctl
工具验证 OVS 配置。 - 清除或调整流表规则以适应新的网络需求。
- 定期使用
通过合理配置 OVS,您可以构建一个高效、安全且灵活的虚拟化网络环境,满足各种复杂的网络需求。
10. 附录:常用命令汇总
以下是本文中提及的常用命令,方便快速查阅和使用。
# 1. 安装 Open vSwitch
sudo apt-get update
sudo apt-get install -y openvswitch-switch
# 2. 创建虚拟交换机
sudo ovs-vsctl add-br br0
# 3. 添加端口到交换机
sudo ovs-vsctl add-port br0 eth0
sudo ovs-vsctl add-port br0 vnat001
# 4. 配置 Netplan
sudo vim /etc/netplan/50-network.yaml
sudo netplan apply
sudo netplan try
# 5. 验证 OVS 配置
sudo ovs-vsctl show
sudo ovs-vsctl list-ports br0
# 6. 使用 OVS 对虚拟机端口进行IP绑定
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_type=0x0800,nw_src=192.168.1.100,tp_dst=22,priority=100,actions=NORMAL"
sudo ovs-ofctl add-flow br0 "in_port=vnat001,priority=50,actions=drop"
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_src=52:54:00:7f:4a:63,priority=100,actions=NORMAL"
sudo ovs-ofctl dump-flows br0
sudo ovs-ofctl del-flows br0
sudo ovs-ofctl add-flow br0 "priority=0,actions=NORMAL"
# 7. 限制虚拟机的网速
# 7.1 对下行流量限速
sudo ovs-vsctl set port vnat001 qos=@newqos -- \
--id=@newqos create QoS type=linux-htb other-config:max-rate=10000000 other-config:burst=1000000 queues:0=@q0 -- \
--id=@q0 create Queue other-config:min-rate=10000000 other-config:max-rate=10000000 other-config:burst=1000000
# 7.2 验证 QoS 配置
sudo ovs-vsctl list qos
sudo ovs-vsctl list queue
# 7.3 限制下行带宽
sudo ovs-vsctl set interface vnat001 ingress_policing_rate=5000 ingress_policing_burst=500
# 8. 流量控制规则示例
# 8.1 基于源/目标 IP 地址
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_type=0x0800,nw_src=192.168.1.100,tp_dst=22,priority=100,actions=NORMAL"
# 8.2 基于源/目标端口
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_type=0x0800,tp_dst=80,priority=100,actions=NORMAL"
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_type=0x0800,tp_dst=443,priority=100,actions=NORMAL"
sudo ovs-ofctl add-flow br0 "out_port=vnat001,dl_type=0x0800,tp_src=80,priority=100,actions=NORMAL"
sudo ovs-ofctl add-flow br0 "out_port=vnat001,dl_type=0x0800,tp_src=443,priority=100,actions=NORMAL"
# 8.3 基于协议的限制
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_type=0x0800,ip,icmp,priority=100,actions=NORMAL"
通过以上步骤和命令,您已具备了在 Ubuntu 系统上安装、配置和管理 Open vSwitch 的基本能力。根据具体需求,您可以进一步探索 OVS 的高级功能,如 VLAN、隧道协议和动态流表规则,以构建更加复杂和高效的网络架构。
如果在配置过程中遇到任何问题,建议参考 Open vSwitch 官方文档 或参与相关社区讨论,以获取更多支持和资源。