Administrator
Administrator
发布于 2024-11-06 / 31 阅读
0
0

基于Ubuntu22.04进行OVS网络

Open vSwitch (OVS) 配置与管理指南

Open vSwitch (OVS) 是一个功能强大的多层虚拟交换机,专为云环境和虚拟化架构设计。它提供了丰富的网络功能,如流量控制、网络隔离和灵活的网络配置,使其成为构建复杂网络拓扑的理想选择。本指南将详细介绍如何在 Ubuntu 系统上安装、配置和管理 OVS,以满足您的虚拟化需求。


目录

  1. 安装 Open vSwitch
  2. 创建虚拟交换机
  3. 添加端口到交换机
  4. 配置 Netplan 以保持配置持久化
  5. 验证 OVS 配置
  6. 使用 OVS 对虚拟机端口进行IP绑定
  7. 限制虚拟机的网速
  8. 基本思路与规则示例
  9. 总结
  10. 附录:常用命令汇总

1. 安装 Open vSwitch

在 Ubuntu 系统上安装 Open vSwitch 非常简便。请按照以下步骤进行安装:

  1. 更新软件包列表

    sudo apt-get update
    
  2. 安装 Open vSwitch

    sudo apt-get install -y openvswitch-switch
    
  3. 验证安装

    安装完成后,可以通过以下命令检查 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.8114.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 已正确接管网络接口,并且没有错误信息。

  1. 查看 OVS 配置

    sudo ovs-vsctl show
    

    输出示例

    Bridge br0
        Port br0
            Interface br0
                type: internal
        Port eth0
            Interface eth0
    
  2. 检查端口状态

    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-vsctlovs-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 官方文档 或参与相关社区讨论,以获取更多支持和资源。


评论