Блокировка подмены Mac для гостей libvirt с помощью openflow
У меня есть пара виртуальных машин KVM, работающих с libvirt, и они используют мосты openvswitch. Мне нужен механизм, предотвращающий подмену Mac на госте. Я пробовал фильтры libvirt без подделки Mac и очистки трафика, но они работают только с мостами Linux. Я подумал, что мог бы использовать правила openflow, чтобы попытаться ограничить трафик, который не соответствует конкретному src mac (отбросить все пакеты, у которых mac отличается от того, который был настроен в xml виртуальной машины). Вот что у меня есть:
[root@t6 /]# ovs-ofctl show vswitch2
OFPT_FEATURES_REPLY (xid=0x2): dpid:00000030641a7b82
n_tables:254, n_buffers:0
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
1(eth5): addr:00:30:64:1a:7b:82
config: 0
state: 0
current: 1GB-FD COPPER AUTO_NEG
advertised: 10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-FD COPPER AUTO_NEG
supported: 10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-FD COPPER AUTO_NEG
speed: 1000 Mbps now, 1000 Mbps max
2(vnet0): addr:fe:54:00:00:00:11
config: 0
state: 0
current: 10MB-FD COPPER
speed: 10 Mbps now, 0 Mbps max
3(vnet1): addr:fe:54:00:00:00:22
config: 0
state: 0
current: 10MB-FD COPPER
speed: 10 Mbps now, 0 Mbps max
4(vnet2): addr:fe:54:00:00:00:33
config: 0
state: 0
current: 10MB-FD COPPER
speed: 10 Mbps now, 0 Mbps max
LOCAL(vswitch2): addr:00:30:64:1a:7b:82
config: 0
state: 0
speed: 0 Mbps now, 0 Mbps max
И я хотел ограничить трафик пакетов, поступающих из vnet2. Поэтому я попытался отбросить пакеты, в которых src mac не соответствовал mac, настроенному на libvirt nic:
[root@t6 /]# ovs-ofctl add-flow vswitch2 dl_src!=52:54:00:00:00:33,in_port=4,actions=drop
ovs-ofctl: unknown keyword dl_src!
[root@t6 /]# ovs-ofctl add-flow vswitch2 dl_src!52:54:00:00:00:33,in_port=4,actions=drop
-bash: !52: event not found
Но, как видите, ! символ не распознается. Я просмотрел документацию по openflow, но не смог найти ничего, что могло бы мне в этом помочь... Может ли кто-нибудь, у кого есть знания openflow и openvswitch, помочь мне в этом? Возможно ли то, что я пытаюсь сделать, с помощью openflow? Честно говоря, я сейчас в замешательстве, так как документация openflow немного утомительна для начинающих пользователей... Заранее благодарю вас за любую помощь, которую вы можете оказать!
1 ответ
Самое простое решение — перевернуть вашу логику:
ovs-vsctl add-flow vswitch2 in_port=4,dl_src=52:54:00:00:00:33,action=NORMAL
ovs-vsctl add-flow vswitch2 in_port=4,action=drop
Я проверил это, и это, кажется, работает. У меня есть две виртуальные машины, подключенные к мостуovsbr0
с адресами 192.168.124.10 и 192.168.124.11. Первая машина имеет такой интерфейс:
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:06:88:31 brd ff:ff:ff:ff:ff:ff
altname enp2s0
inet 192.168.124.10/24 scope global eth1
valid_lft forever preferred_lft forever
И я могу успешно пропинговать вторую систему по адресу 192.168.124.11:
[root@fedora ~]# ping -c2 192.168.124.11
PING 192.168.124.11 (192.168.124.11) 56(84) bytes of data.
64 bytes from 192.168.124.11: icmp_seq=1 ttl=64 time=0.351 ms
64 bytes from 192.168.124.11: icmp_seq=2 ttl=64 time=0.314 ms
--- 192.168.124.11 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1017ms
rtt min/avg/max/mdev = 0.314/0.332/0.351/0.018 ms
Если я добавлю эти два правила открытого потока:
host# ovs-ofctl add-flow ovsbr0 in_port=4,dl_src=52:54:00:06:88:31,actions=NORMAL
host# ovs-ofctl add-flow ovsbr0 in_port=4,actions=drop
Я все еще могу пропинговать вторую систему:
[root@fedora ~]# ping -c2 192.168.124.11
PING 192.168.124.11 (192.168.124.11) 56(84) bytes of data.
64 bytes from 192.168.124.11: icmp_seq=1 ttl=64 time=0.398 ms
64 bytes from 192.168.124.11: icmp_seq=2 ttl=64 time=0.188 ms
--- 192.168.124.11 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1050ms
rtt min/avg/max/mdev = 0.188/0.293/0.398/0.105 ms
Но если я изменю MAC-адрес:
[root@fedora ~]# ip link set eth1 down
[root@fedora ~]# ip link set eth1 address 52:54:00:06:12:34
[root@fedora ~]# ip link set eth1 up
Я обнаружил, что пинг больше не работает:
[root@fedora ~]# ping -c2 192.168.124.11
PING 192.168.124.11 (192.168.124.11) 56(84) bytes of data.
From 192.168.124.10 icmp_seq=1 Destination Host Unreachable
From 192.168.124.10 icmp_seq=2 Destination Host Unreachable
--- 192.168.124.11 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1052ms
pipe 2