Я провожу эксперимент на 2 серверах на базе Xeon. Оба сервера имеют два двухпортовых сетевых адаптера, всего 4 сетевых адаптера. OVS работает на одном сервере, а DPDK pktgen - на другом.
Я попытался добавить правила потока в таблицу для запуска OVS в качестве коммутатора пересылки L2. Я выполнил следующие команды, чтобы создать мост и добавить правила потока.
./ovs-vsctl del-br br0
./ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
./ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:04:00.0 options:flow-ctrl-autoneg=true
./ovs-vsctl add-port br0 dpdk1 -- set Interface dpdk1 type=dpdk options:dpdk-devargs=0000:04:00.1 options:flow-ctrl-autoneg=true
./ovs-vsctl add-port br0 dpdk2 -- set Interface dpdk2 type=dpdk options:dpdk-devargs=0000:05:00.0 options:flow-ctrl-autoneg=true
./ovs-vsctl add-port br0 dpdk3 -- set Interface dpdk3 type=dpdk options:dpdk-devargs=0000:05:00.1 options:flow-ctrl-autoneg=true
./ovs-ofctl del-flows br0
./ovs-ofctl add-flow br0 "table=0, eth_dst=a0:36:9f:0e:36:48,actions=output=1"
./ovs-ofctl add-flow br0 "table=0, eth_dst=a0:36:9f:0e:36:4a,actions=output=2"
./ovs-ofctl add-flow br0 "table=0, eth_dst=a0:36:9f:3e:eb:a4,actions=output=3"
./ovs-ofctl add-flow br0 "table=0, eth_dst=a0:36:9f:3e:eb:a2,actions=output=4"
В этом случае все работает нормально. А затем я изменил pktgen для генерации пакетов с поддельными MAC-адресами. Я также изменил правила потока в таблице, выполнив следующие команды.
./ovs-ofctl add-flow br0 "table=0, eth_dst=00:00:00:00:00:00,actions=output=1"
./ovs-ofctl add-flow br0 "table=0, eth_dst=00:00:00:00:00:01,actions=output=2"
./ovs-ofctl add-flow br0 "table=0, eth_dst=00:00:00:00:00:02,actions=output=3"
./ovs-ofctl add-flow br0 "table=0, eth_dst=00:00:00:00:00:03,actions=output=4"
Я проверил, что pktgen генерирует пакеты с этими MAC-адресами, но OVS в этом случае не пересылает пакеты. Я что-то упустил?
Я пытался найти решение, но во всех руководствах упоминалось одно и то же о добавлении потоков в таблицы для пересылки l2. Почему OVS не пересылает пакеты в случае поддельных MAC-адресов? Я использовал все порты в беспорядочном режиме.
Я хочу измерить производительность для большого количества записей в таблицах, и поэтому мне нужно генерировать пакеты с поддельным MAC-адресом.
По умолчанию ваш хост не знает MAC-адрес другого хоста. Они будут знать MAC-адрес соседа с протоколом ARP. Итак, убедитесь, что установленный вами поток таблицы обрабатывает процесс ARP для каждого хоста. На контроллере ryu вы можете использовать simple_switch_13.py или для имитации контроллера с графическим интерфейсом вы можете использовать https://github.com/dektiram/SDNColdBrew
Можете ли вы распечатать конфигурацию сетевого пространства имен.
route -n
ip netns ls
ovs-vsctl show
убедитесь, что вы настроили ядро, чтобы разрешить пересылку:
sudo vi /etc/sysctl.conf
раскомментировать net.ipv4.ip_forward = 1
вы можете смотреть трафик
sudo tcpdump -i br0
См. Этот ответ относительно пересылки iptables: https://unix.stackexchange.com/questions/313180/iptables-forward-chain-traffic-not-seen-by-tcpdump