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 ...
如果服务未启动,可以使用以下命令启动:
sudo systemctl start openvswitch-switch
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
注意:在将物理网卡添加到 OVS 交换机之前,请确保该网卡没有被其他网络管理工具(如 NetworkManager)管理,以避免网络冲突。
3.2 添加虚拟端口
创建并添加一个虚拟端口(例如 vnat001
)到 br0
:
sudo ovs-vsctl add-port br0 vnat001
说明:
vnat001
可以用于连接虚拟机或其他网络接口。
验证添加:
sudo ovs-vsctl list-ports br0
输出示例:
br0
eth0
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
)。
示例配置:
network:
version: 2
renderer: networkd
ethernets:
lo:
addresses:
- 127.0.0.1/8
eth0:
dhcp4: no
match:
macaddress: 52:54:00:12:34:56
set-name: eth0
bridges:
br0:
interfaces: [eth0]
addresses:
- 103.38.82.24/24
routes:
- to: 0.0.0.0/0
via: 103.38.82.1
nameservers:
addresses:
- 8.8.8.8
- 114.114.114.114
parameters:
stp: false
dhcp4: no
openvswitch: {}
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 Port vnat001 Interface vnat001
检查端口状态:
sudo ovs-vsctl list-ports br0
输出示例:
br0 eth0 vnat001
检查接口详情:
查看每个接口的详细信息,确保配置正确:
sudo ovs-vsctl list Interface
输出示例:
Interface "br0" type: internal ofport: 1 Interface "eth0" type: system ofport: 2 Interface "vnat001" type: internal ofport: 3
测试网络连接:
确保通过
br0
交换机的网络连接正常。可以尝试通过虚拟机访问外部网络或从外部访问虚拟机。
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地址>,nw_src=<绑定的IP地址>,priority=100,actions=NORMAL"
示例:
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_src=52:54:00:7f:4a:63,nw_src=192.168.1.100,priority=100,actions=NORMAL"
参数解释:
dl_src=52:54:00:7f:4a:63
:限制源 MAC 地址为52:54:00:7f:4a:63
。nw_src=192.168.1.100
:限制源 IP 地址为192.168.1.100
。
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
解释:
- 第一条规则允许特定 IP 地址的流量。
- 第二条规则丢弃其他所有流量。
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=<最大带宽> other-config:burst=<突发带宽> queues:0=@q0 -- \
--id=@q0 create Queue other-config:min-rate=<最小带宽> other-config:max-rate=<最大带宽> other-config:burst=<突发带宽>
示例:
限制端口 vnat001
的下行带宽为 10 Mbps,突发带宽为 1 Mbps:
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(单位为 bps)。other-config:burst=1000000
:突发带宽为 1 Mbps(单位为 bps)。queues:0=@q0
:创建队列@q0
并绑定到 QoS 配置。create Queue
:定义队列的详细配置。
注意:max-rate
和 min-rate
的单位为位每秒(bps)。根据需求调整带宽限制。
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}
解释:
- 第一部分显示 QoS 配置的详细信息。
- 第二部分显示队列的详细信息。
7.3 限制下行带宽
由于 OVS 的 QoS 主要作用于出站流量,接收方向的流量无法直接通过 QoS 限制。可以使用 ingress_policing_rate
来限制下行带宽:
sudo ovs-vsctl set interface <虚拟机端口> ingress_policing_rate=<带宽限制> ingress_policing_burst=<突发带宽>
示例:
限制端口 vnat001
的下行带宽为 5 Mbps,突发带宽为 500 Kbps:
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。
注意:ingress_policing_rate
和 ingress_policing_burst
的单位分别为 Kbps 和 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"
解释:
- 第一和第二条规则允许进入
vnat001
端口的 HTTP 和 HTTPS 流量。 - 第三和第四条规则允许从
vnat001
端口发出的 HTTP 和 HTTPS 流量。 tp_dst
和tp_src
分别用于目标端口和源端口的匹配。
注意:确保规则的优先级足够高,以覆盖默认规则。
8.3 基于协议的限制
限制特定协议类型的流量。
示例:仅允许 ICMP(如 ping)流量进入虚拟机的 vnat001
端口。
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_type=0x0800,icmp,priority=100,actions=NORMAL"
解释:
icmp
:仅匹配 ICMP 协议流量。- 其他参数与前述规则相同。
注意:可以根据需要添加更多协议类型的限制,如 UDP、TCP 等。
9. 总结
通过本文的详细步骤,您已经掌握了在 Ubuntu 系统上安装、配置和管理 Open vSwitch (OVS) 的基本方法。以下是关键要点总结:
- 安装与配置:
- 安装 OVS 并创建虚拟交换机。
- 添加物理和虚拟端口到交换机。
- 通过 Netplan 配置网络,确保配置持久化。
- 流量控制与安全:
- 使用流表规则绑定 IP 和 MAC 地址,防止 IP 偷用。
- 配置 QoS 限制虚拟机的网络带宽,确保资源合理分配。
- 基于 IP、端口和协议类型的流量控制,提升网络安全性。
- 验证与维护:
- 定期使用
ovs-vsctl
和ovs-ofctl
工具验证 OVS 配置。 - 清除或调整流表规则以适应新的网络需求。
- 定期使用
通过合理配置 OVS,您可以构建一个高效、安全且灵活的虚拟化网络环境,满足各种复杂的网络需求。
建议:
- 备份配置:在进行重大更改前,备份当前的 OVS 和 Netplan 配置文件。
- 监控性能:使用网络监控工具(如
iftop
、nload
)监控网络流量,确保 QoS 设置生效。 - 安全性:定期审查流表规则,确保没有未授权的流量被允许通过。
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
sudo ovs-vsctl list Interface
# 6. 使用 OVS 对虚拟机端口进行 IP 绑定
# 6.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"
# 6.2 添加流量丢弃规则
sudo ovs-ofctl add-flow br0 "in_port=vnat001,priority=50,actions=drop"
# 6.3 添加 MAC 和 IP 绑定规则
sudo ovs-ofctl add-flow br0 "in_port=vnat001,dl_src=52:54:00:7f:4a:63,nw_src=192.168.1.100,priority=100,actions=NORMAL"
# 6.4 查看流表规则
sudo ovs-ofctl dump-flows br0
# 6.5 清除流表规则
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,icmp,priority=100,actions=NORMAL"
通过以上步骤和命令,您已具备了在 Ubuntu 系统上安装、配置和管理 Open vSwitch 的基本能力。根据具体需求,您可以进一步探索 OVS 的高级功能,如 VLAN、隧道协议和动态流表规则,以构建更加复杂和高效的网络架构。
如果在配置过程中遇到任何问题,建议参考 Open vSwitch 官方文档 或参与相关社区讨论,以获取更多支持和资源。