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
使用说明
替换占位符:
将
<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 服务器地址。
应用配置:
编辑并保存文件后,应用 Netplan 配置:
netplan apply
检查ovs是否正确的接管:
未出现任何error信息即可
ovs-vsctl show
4. 使用OVS对虚拟机的端口进行IP绑定,防止偷IP行为发生
常规的端口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 会将流量转发至目标接口或其他符合标准的接口。
配置流量丢弃
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 会直接丢弃数据包,而不会将其转发到其他接口或进行其他处理。
使用mac地址+IP地址进行绑定
ovs-ofctl add-flow <网桥名称> "in_port=<接口名称>,dl_src=<绑定的MAC地址>,priority=100,actions=NORMAL"
priority=100
priority
表示该流表规则的优先级。在 OVS 中,优先级数值越大,规则的优先级越高。优先级高的规则会优先匹配流量。
priority=100
表示此规则的优先级较高,确保它优先匹配到符合条件的流量。如果有其他优先级较低的规则(如丢弃规则),此规则会优先匹配,而不会被丢弃规则影响。
检查验证绑定是否成功
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
命令分解及含义
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 配置对象。
--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
的速率,以应对流量高峰。
queues:0=@q0
queues:0=@q0
:将队列0
分配给@newqos
,并将其标识为@q0
,后续会定义@q0
这个队列的详细配置。
--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 流表规则,可以精细控制虚拟机的网络流量,构建安全组,实现不同的网络安全策略。