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

基于Ubuntu22.04进行OVS网络

Open vSwitch (OVS) 是一个多层虚拟交换机,专为云环境和虚拟化架构设计。

1. 安装 Open vSwitch

在 Ubuntu 上安装 OVS:

apt update
apt install openvswitch-switch

2. 创建虚拟交换机

创建一个新的 OVS 虚拟交换机(例如 br0):

 ovs-vsctl add-br br0

3. 添加端口到交换机

你可以将物理网卡或虚拟网卡添加到交换机。例如,假设你有一个物理网卡 eth0

ovs-vsctl add-port br0 eth0

如果你想添加虚拟接口,可以这样做:

使用 ovs-vsctl 命令将虚拟端口 vnat001 添加到 br0

ovs-vsctl add-port br0 vnat001

检查端口状态

ovs-vsctl show

保持持久化,编辑/etc/netplan中50-network.yaml文件:

MAC地址绑定版本:

# network-config
network:
  version: 2
  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地址绑定版本

# network-config
network:
  version: 2
  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

使用说明

  1. 替换占位符

    • <MAC_ADDRESS_OF_ETH0> 替换为 eth0 的实际 MAC 地址。

    • <HOST_RESERVED_IP> 替换为主机预留的 IP 地址(如 103.38.82.24)。

    • <GATEWAY_IP> 替换为默认网关的 IP 地址(如 103.38.82.1)。

    • <DNS_SERVER_1><DNS_SERVER_2> 替换为您的 DNS 服务器地址。

  2. 应用配置

    编辑并保存文件后,应用 Netplan 配置:

netplan apply
  1. 检查ovs是否正确的接管

未出现任何error信息即可

ovs-vsctl show

4. 使用OVS对虚拟机的端口进行IP绑定,防止偷IP行为发生

  1. 常规的端口IP绑定

sudo ovs-ofctl add-flow <OVS桥接> "in_port=<虚拟机端口>,dl_type=0x0800,nw_src=<绑定的IP地址>,priority=100,actions=NORMAL"

ovs-ofctl add-flow
ovs-ofctl 是 OVS 的命令行工具,允许管理员添加、查看或删除流表规则。add-flow 子命令表示向指定的 OVS 网桥添加一个流表规则。

dl_type=0x0800
dl_type 表示数据链路层(Layer 2)的协议类型。0x0800 是 IPv4 的协议类型编号。

  • 此字段确保只有 IPv4 流量会匹配此规则,其他类型的流量(如 ARP 或 IPv6)将不会匹配。

priority=100
priority 表示该流表规则的优先级,值越大优先级越高。在 OVS 中,优先级较高的规则会优先匹配到流量。

  • priority=100 表示此规则的优先级较高,确保在低优先级的规则前应用。

actions=NORMAL
actions 表示在匹配到流量后执行的操作。NORMAL 表示标准的转发操作,即按照 OVS 的默认行为转发流量。

  • 一旦流量匹配了该规则,OVS 会将流量转发至目标接口或其他符合标准的接口。

  1. 配置流量丢弃

ovs-ofctl add-flow <OVS桥接> "in_port=<虚拟机端口>,priority=50,actions=drop"

ovs-ofctl add-flow
ovs-ofctl 是 Open vSwitch 的命令行工具,用于管理流表规则。add-flow 子命令用于添加一个新的流表规则。

priority=50
priority 设置流表规则的优先级。在 OVS 中,优先级的数值越大,规则的优先级越高。优先级高的规则会优先匹配到流量。

  • priority=50 为此规则设定了一个中等优先级,确保它在更高优先级的规则之后匹配。

  • 在这种配置中,可能会有其他优先级更高的规则允许某些流量通过,但不符合高优先级规则的流量将匹配到此规则并被丢弃。

actions=drop
actions 指定了匹配到该规则的流量的处理方式。drop 表示丢弃流量,即不转发或处理匹配该规则的流量。

  • 一旦流量与此规则匹配,OVS 会直接丢弃数据包,而不会将其转发到其他接口或进行其他处理。

  1. 使用mac地址+IP地址进行绑定

ovs-ofctl add-flow <网桥名称> "in_port=<接口名称>,dl_src=<绑定的MAC地址>,priority=100,actions=NORMAL"

priority=100
priority 表示该流表规则的优先级。在 OVS 中,优先级数值越大,规则的优先级越高。优先级高的规则会优先匹配流量。

  • priority=100 表示此规则的优先级较高,确保它优先匹配到符合条件的流量。

  • 如果有其他优先级较低的规则(如丢弃规则),此规则会优先匹配,而不会被丢弃规则影响。

  1. 检查验证绑定是否成功

ovs-ofctl dump-flows br0

如果需要尝试清除规则,可以使用:

ovs-ofctl del-flows br0&&ovs-ofctl add-flow br0 "priority=0,actions=NORMAL"

避免br0口没了

5. 网速的限制

对下行流量限速

sudo ovs-vsctl set port kvm001.0 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

命令分解及含义

  1. ovs-vsctl set port kvm001.0 qos=@newqos

    • ovs-vsctl:Open vSwitch 的命令行工具,用于配置 OVS 的设置。

    • set port kvm001.0 qos=@newqos:将 kvm001.0 端口的 QoS 配置设置为 @newqos,后续会定义 @newqos 这个 QoS 配置对象。

  2. --id=@newqos create QoS type=linux-htb other-config:max-rate=10000000 other-config:burst=1000000

    • --id=@newqos:创建一个名为 @newqos 的 QoS 配置对象,以便在 kvm001.0 端口上引用。

    • create QoS type=linux-htb:创建一个 QoS 配置,并指定类型为 linux-htb,这是 Linux 的 HTB(Hierarchical Token Bucket)限速机制,适合带宽控制。

    • other-config:max-rate=10000000:将 QoS 的最大带宽限制设置为 10 Mbps(单位为 bps)。

    • other-config:burst=1000000:设置突发带宽为 1 Mbps(单位为 bps),允许在短时间内超出 max-rate 的速率,以应对流量高峰。

  3. queues:0=@q0

    • queues:0=@q0:将队列 0 分配给 @newqos,并将其标识为 @q0,后续会定义 @q0 这个队列的详细配置。

  4. --id=@q0 create Queue other-config:min-rate=10000000 other-config:max-rate=10000000 other-config:burst=1000000

    • --id=@q0:创建一个队列配置对象,并将其命名为 @q0

    • create Queue:创建一个新的队列。

    • other-config:min-rate=10000000:设置队列的最小带宽为 10 Mbps(单位为 bps)。

    • other-config:max-rate=10000000:设置队列的最大带宽为 10 Mbps(单位为 bps)。

    • other-config:burst=1000000:为队列配置 1 Mbps 的突发带宽(单位为 bps)。

规则整体效果

  • 上行带宽限制:该规则将 kvm001.0 端口的上行(发送)带宽限制为 10 Mbps。

  • 突发带宽:在短时间内允许流量峰值超出 10 Mbps,但最高不超过 11 Mbps(10 Mbps + 1 Mbps 的突发)。

  • 队列配置:将带宽限制应用于队列 0,并绑定到 QoS 上,确保带宽控制精确生效。

使用突发带宽的作用

  • 突发带宽允许端口在短时间内超过最大带宽限制,满足短期流量高峰需求。

  • 例如,如果应用需要瞬间处理大量请求,突发带宽可以允许带宽在短时间内超出 max-rate,而不会立即触发限速。

验证 QoS 配置

可以使用以下命令来确认 QoS 配置是否正确应用:

ovs-vsctl list qos
ovs-vsctl list queue

注意:如果需要改动,直接执行覆盖即可

对下行网速的限制:

OVS 中的 QoS 主要作用在出站流量上,所以接收方向的流量不能直接用 QoS 限制。我们可以使用 ingress_policing_rate 来限制下行带宽(接收方向流量)。假设希望将下行带宽限制为 5 Mbps

ovs-vsctl set interface kvm001.0 ingress_policing_rate=5000
ovs-vsctl set interface kvm001.0 ingress_policing_burst=500

kvm001.0这里是虚拟机端口

6. 基本思路

OVS 的流表规则可以限制某个端口的流量方向。你可以通过以下几种方式控制流量:

  • 基于源/目标 IP 地址:限制哪些 IP 地址可以访问。

  • 基于源/目标端口:控制不同应用(如 HTTP、SSH)的访问权限。

  • 基于协议:限制流量类型,如 TCP、UDP 等。

2. 示例规则

假设 kvm001.0 是虚拟机的端口,并且通过 OVS 网桥 br0 连接到网络。

2.1 允许特定 IP 和端口的流量

示例 1:允许 192.168.1.100 IP 访问虚拟机的 kvm001.0 端口上的 TCP 端口 22(SSH)。

ovs-ofctl add-flow br0 "in_port=kvm001.0,ip,nw_src=192.168.1.100,tp_dst=22,priority=100,actions=NORMAL"

解释

  • in_port=kvm001.0:指定进入端口为 kvm001.0

  • nw_src=192.168.1.100:限制源 IP 为 192.168.1.100

  • tp_dst=22:目标端口为 22,允许 SSH 访问。

  • priority=100:优先级设置较高,以确保此规则优先生效。

  • actions=NORMAL:允许流量正常转发。

2.2 拒绝所有其他流量

为了确保所有未授权的流量都被拒绝,可以添加一个较低优先级的丢弃规则。

ovs-ofctl add-flow br0 "in_port=kvm001.0,priority=50,actions=drop"

解释

  • 该规则优先级较低,将丢弃所有未匹配到更高优先级规则的流量。

3. 更复杂的规则组合

3.1 允许特定端口的入站和出站流量

示例:允许虚拟机的 kvm001.0 接收 TCP 80 和 443 端口的流量(HTTP 和 HTTPS),并允许其出站访问任意 IP 的同样端口。

# 允许进入端口 80 和 443 的流量
sudo ovs-ofctl add-flow br0 "in_port=kvm001.0,ip,tp_dst=80,priority=100,actions=NORMAL"
sudo ovs-ofctl add-flow br0 "in_port=kvm001.0,ip,tp_dst=443,priority=100,actions=NORMAL"

# 允许从端口 80 和 443 发出的流量
sudo ovs-ofctl add-flow br0 "out_port=kvm001.0,ip,tp_src=80,priority=100,actions=NORMAL"
sudo ovs-ofctl add-flow br0 "out_port=kvm001.0,ip,tp_src=443,priority=100,actions=NORMAL"

3.2 基于协议的限制

示例:只允许 ICMP(如 ping)流量进入 kvm001.0 端口。

ovs-ofctl add-flow br0 "in_port=kvm001.0,icmp,priority=100,actions=NORMAL"

4. 总结

  • 允许规则应当设置较高的优先级,以便在符合条件时优先转发流量。

  • 拒绝规则actions=drop)通常设置为较低优先级,以防止未授权的流量通过。

  • 可以通过组合多条规则实现复杂的访问控制策略,从而模拟云环境中的网络安全组。

通过 OVS 流表规则,可以精细控制虚拟机的网络流量,构建安全组,实现不同的网络安全策略。


评论