VYOS-VPP
Подготовка сервера с VYOS для работы с VPP
1. Настройки BIOS
В BIOS включить настройку Intel VT-d (или как там она называется)
Примечание: на всякий случай можно еще включить X2APIC = Enable (непонятно, влияет или нет - но лучше включить)
2. Настройки ядра VYOS
В файле /boot/grub/grub.cfg.d/vyos-versions найти следующую строчку:
set boot_opts="boot=live rootdelay=5 noautologin net.ifnames=0 biosdevname=0 vyos-union=/boot/VYOS-1.5-Rolling"
и добавить в конец: " intel_iommu=on iommu=pt"
т.е. полная строка должна быть:
set boot_opts="boot=live rootdelay=5 noautologin net.ifnames=0 biosdevname=0 vyos-union=/boot/VYOS-1.5-Rolling intel_iommu=on iommu=pt"
Далее выполнить перезагрузку.
Примечание: после перезагрузки файл /boot/grub/grub.cfg.d/vyos-versions перезаписывается, так что придется потом снова строку
"set boot_opts = ..." перезаписывать, пока не придумается как ее там зафиксировать. В противном случае после следующей перезагрузки поддержка IOMMU опять слетит.
После перезагрузки нужно убедиться, что режим IOMMU включен, для этого выполнить команду:
dmesg | grep IOMMU
Вывод должен быть примерно таким:
[ 0.046990] DMAR: IOMMU enabled
[ 0.109294] DMAR-IR: IOAPIC id 1 under DRHD base 0xfbffc000 IOMMU 1
[ 0.109297] DMAR-IR: IOAPIC id 2 under DRHD base 0xfbffc000 IOMMU 1
[ 0.372778] DMAR: IOMMU feature sc_support inconsistent
[ 0.372779] DMAR: IOMMU feature dev_iotlb_support inconsistent
[ 0.386236] AMD-Vi: AMD IOMMUv2 functionality not available on this system - This is not a bug.
3. Настройка работы сетевых карт в режиме VFIO
Проверка сетевых карт через ip link (обращаем внимание на eth0 и eth1):
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 22:41:4d:03:1d:70 brd ff:ff:ff:ff:ff:ff
altname enp6s0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 40:a6:b7:93:42:44 brd ff:ff:ff:ff:ff:ff
altname enp3s0f0
altname ens4f0
4: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether 40:a6:b7:93:42:45 brd ff:ff:ff:ff:ff:ff
altname enp3s0f1
altname ens4f1
5: pim6reg@NONE: <NOARP,UP,LOWER_UP> mtu 1452 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
Убеждаемся, что загружены модули ядра для VFIO:
sudo modprobe vfio
sudo modprobe vfio-pci
sudo modprobe vfio_iommu_type1
Проверяем, что PCI-код соответствует устройству (eth0 = 0000:03:00.0, eth1 = 0000:03:00.1):
lspci -k -v -s 0000:03:00.0
lspci -k -v -s 0000:03:00.1
Вывод должен быть примерно таким (обращаем внимание на текущий Kernel driver in use):
03:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
Subsystem: Intel Corporation Ethernet Converged Network Adapter X710-2
Physical Slot: 4
Flags: bus master, fast devsel, latency 0, IRQ 27, NUMA node 0, IOMMU group 28
Memory at 383ffe800000 (64-bit, prefetchable) [size=8M]
Memory at 383fff808000 (64-bit, prefetchable) [size=32K]
Expansion ROM at fbd80000 [disabled] [size=512K]
Capabilities: <access denied>
Kernel driver in use: i40e
Kernel modules: i40e
Для обеих сетевух отвязываем их от текущего драйвера и привязываем к VFIO:
echo 0000:03:00.0 | sudo tee /sys/bus/pci/devices/0000:03:00.0/driver/unbind
# 2. Привязываем к vfio-pci
echo vfio-pci | sudo tee /sys/bus/pci/devices/0000:03:00.0/driver_override
echo 0000:03:00.0 | sudo tee /sys/bus/pci/drivers/vfio-pci/bind
# 3. Проверяем
lspci -k -s 03:00.0
Те же манипуляции делаем для 0000:03:00.1 (не забываем в путях к файлам настроек корректно прописать каталог устройства 0000:03:00.1).
Убеждаемся, что для обеих сетевух теперь используется драйвер VFIO:
03:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
Subsystem: Intel Corporation Ethernet Converged Network Adapter X710-2
Physical Slot: 4
Flags: fast devsel, IRQ 27, NUMA node 0, IOMMU group 28
Memory at 383ffe800000 (64-bit, prefetchable) [size=8M]
Memory at 383fff808000 (64-bit, prefetchable) [size=32K]
Expansion ROM at fbd80000 [disabled] [size=512K]
Capabilities: <access denied>
Kernel driver in use: vfio-pci
Kernel modules: i40e
Примечание: Также в выводе команды ip link интерфейсов eth0 и eth1 теперь не будет, так как они перешли под управление VFIO.
4. Запуск контейнера для VPP
Создаем сетевое пространство имен NGFW (нужно для корректного запуска контейнера):
sudo ip netns add ngfw
Выполняем запуск контейнера с VPP:
sudo podman run -d --name vpp --network host --privileged --restart always --ulimit core=0:0 --shm-size 4g --volume /var/run/netns:/var/run/netns --volume /var/vpp/netplan:/etc/vpp/netplan --volume /var/log:/var/log --volume /var:/config/shared --env-file /config/vpp/env docker-archive:/home/vyos/vpp-image.tar
Примечания:
- Необходимо убедиться, что все монтируемые каталоги, а также образ и файл env, указанные в команде, лежат на своих местах.
- В случае ошибки запуска (может ругаться на то, что контейнер VPP уже существует) следует добавить в команду параметр --replace
Проверяем состояние контейнера:
sudo podman ps
Настраиваем контейнер:
sudo podman cp /home/vyos/vpp.conf vpp:/config/vpp.conf
sudo podman restart vpp
5. Настройка интерфейсов внутри контейнера VPP:
Заходим внутрь запущенного контейнера:
sudo podman exec -it vpp vppctl
=
######################################################################################### ===
test web server (для проверки работы vyos)
while true; do { echo -e 'HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, World!'; } | nc -l 8081; done
надо будет еще ядро перенастраивать (но пока рано)
sudo grub-probe --device /dev/sda3
это мое !
podman cp /home/vyos/vpp.conf vpp:/config/vpp.conf
конфигурирование podman
sudo nano /etc/containers/containers.conf
dns_bind_port=54
sudo chattr +i /etc/containers/containers.conf
ip netns add ngfw
podman rm vpp -f
создание host interface
ip netns exec ngfw bash
ip link add name http1out type veth peer name http1host
ip link set dev http1out up
ip link set dev http1host up
ip addr add 10.10.10.10/24 dev http1host
ip addr show http1host
podman run -d --name vpp --network host --privileged --restart always --ulimit core=0:0 --shm-size 4g --volume /var/run/netns:/var/run/netns --volume /var/vpp/netplan:/etc/vpp/netplan --volume /var/log:/var/log --volume /var:/config/shared --env-file /config/vpp/env docker-archive:/home/vyos/vpp-image.tar
vpp:
create host-interface name http1out
set interface state host-http1out up
podman cp /home/vyos/vpp.conf vpp:/config/vpp.conf
podman restart vpp
назначаем адрес для теста (data2 в бридже loop10)
podman exec -it vpp vppctl
set interface ip address loop10 10.1.100.125/24
show int addr
#########################################################################################
########## enode on podman -----------------------------
включение разрешений для podman
set nat source rule 100 source address '10.88.0.0/16'
set nat source rule 100 translation address 'masquerade'
commit
save
для traefik нуже сервис podman api
podman system service -t 0 unix:///run/user/1000/podman/podman.sock &
vyos|vyos
sudo podman exec -it vpp vppctl
show acl-plugin acl
#########################################################################################
### пример лога vpp контейнера
[INFO ] root.main: Loading configfile /etc/vpp/netplan/netplan.yaml
[INFO ] vppcfg.config.valid_config: Configuration validated successfully
[INFO ] root.main: Configuration is valid
[INFO ] vppcfg.vppapi.connect: VPP version is 24.02-release
[INFO ] vppcfg.reconciler.write: Wrote 46 lines to /etc/vpp/applynetplan.yaml
[INFO ] root.main: Planning succeeded
api_response => lcp_itf_pair_get []
111111111111111111 create sub data1 109 dot1q 109 exact-match
111111111111111111 create sub data1 110 dot1q 110 exact-match
111111111111111111 create sub data1 10 dot1q 10 exact-match
create loopback interface instance 110
linux-cp/itf [debug ]: mtu_change: sw loop110 0
linux-cp/itf [debug ]: mtu_change: si loop110 hi loop110, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi loop110
loop110
linux-cp/itf [debug ]: interface_add: sw data1.109 parent data1
data1.109
linux-cp/itf [debug ]: interface_add: sw data1.110 parent data1
data1.110
linux-cp/itf [debug ]: interface_add: sw data1.10 parent data1
data1.10
bridge-domain 10
bridge-domain 109
bridge-domain 110
linux-cp/itf [debug ]: mtu_change: sw tap4 0
linux-cp/itf [debug ]: mtu_change: si tap4 hi tap4, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi data1.109
linux-cp/itf [info ]: pair create: {loop10, tap4, vlaneth0}
linux-cp/itf [info ]: add: host:tap4 phy:loop10, host_if:vlaneth0 vif:7 ns:ngfw
linux-cp/mpls-sync [debug ]: pair_add_cb: mpls enabled 0, parent itf-pair: [0] loop10 tap4 vlaneth0 7 type tap netns ngfw
linux-cp/itf [info ]: pair create: itf-pair: [0] loop10 tap4 vlaneth0 7 type tap netns ngfw sw-flags 0 hw-flags 1
linux-cp/itf [debug ]: admin_state_change: sw tap4 1
linux-cp/itf [debug ]: mtu_change: sw tap5 0
linux-cp/itf [debug ]: mtu_change: si tap5 hi tap5, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi data1.110
linux-cp/itf [info ]: pair create: {loop109, tap5, vlaneth99}
linux-cp/itf [info ]: add: host:tap5 phy:loop109, host_if:vlaneth99 vif:8 ns:ngfw
linux-cp/mpls-sync [debug ]: pair_add_cb: mpls enabled 0, parent itf-pair: [1] loop109 tap5 vlaneth99 8 type tap netns ngfw
linux-cp/itf [info ]: pair create: itf-pair: [1] loop109 tap5 vlaneth99 8 type tap netns ngfw sw-flags 0 hw-flags 1
linux-cp/itf [debug ]: admin_state_change: sw tap5 1
linux-cp/itf [debug ]: mtu_change: sw tap6 0
linux-cp/itf [debug ]: mtu_change: si tap6 hi tap6, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi data1.10
linux-cp/itf [info ]: pair create: {loop110, tap6, vlaneth100}
linux-cp/itf [info ]: add: host:tap6 phy:loop110, host_if:vlaneth100 vif:9 ns:ngfw
linux-cp/mpls-sync [debug ]: pair_add_cb: mpls enabled 0, parent itf-pair: [2] loop110 tap6 vlaneth100 9 type tap netns ngfw
linux-cp/itf [info ]: pair create: itf-pair: [2] loop110 tap6 vlaneth100 9 type tap netns ngfw sw-flags 0 hw-flags 1
linux-cp/itf [debug ]: admin_state_change: sw tap6 1
linux-cp/itf [debug ]: mtu_change: sw data1 0
linux-cp/itf [debug ]: mtu_change: si data1 hi data1, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi data1
linux-cp/itf [debug ]: mtu_change: sw data1.10 0
linux-cp/itf [debug ]: mtu_change: sw data1.110 0
linux-cp/itf [debug ]: mtu_change: sw data1.109 0
linux-cp/itf [debug ]: mtu_change: sw data2 0
linux-cp/itf [debug ]: mtu_change: si data2 hi data2, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi data2
linux-cp/itf [debug ]: mtu_change: sw host-http1out 0
linux-cp/itf [debug ]: mtu_change: si host-http1out hi host-http1out, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi host-http1out
linux-cp/itf [debug ]: mtu_change: sw loop10 0
linux-cp/itf [debug ]: mtu_change: si loop10 hi loop10, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi loop10
linux-cp/itf [info ]: sync_state: itf-pair: [0] loop10 tap4 vlaneth0 7 type tap netns ngfw flags 0 sup-flags 0 mtu 1500 sup-mtu 1500
linux-cp/itf [debug ]: mtu_change: sw tap4 0
linux-cp/itf [debug ]: mtu_change: si tap4 hi tap4, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi data1.109
linux-cp/itf [debug ]: mtu_change: sw loop109 0
linux-cp/itf [debug ]: mtu_change: si loop109 hi loop109, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi loop109
linux-cp/itf [info ]: sync_state: itf-pair: [1] loop109 tap5 vlaneth99 8 type tap netns ngfw flags 0 sup-flags 0 mtu 1500 sup-mtu 1500
linux-cp/itf [debug ]: mtu_change: sw tap5 0
linux-cp/itf [debug ]: mtu_change: si tap5 hi tap5, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi data1.110
linux-cp/itf [debug ]: mtu_change: sw loop110 0
linux-cp/itf [debug ]: mtu_change: si loop110 hi loop110, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi loop110
linux-cp/itf [info ]: sync_state: itf-pair: [2] loop110 tap6 vlaneth100 9 type tap netns ngfw flags 0 sup-flags 0 mtu 1500 sup-mtu 1500
linux-cp/itf [debug ]: mtu_change: sw tap6 0
linux-cp/itf [debug ]: mtu_change: si tap6 hi tap6, syncing children
linux-cp/itf [debug ]: sync_state_hw: hi data1.10
linux-cp/itf [debug ]: ip4_addr_add: si:loop109 172.16.99.1/24
linux-cp/itf [debug ]: ip4_addr_add: itf-pair: [1] loop109 tap5 vlaneth99 8 type tap netns ngfw ip4 172.16.99.1/24
linux-cp/itf [debug ]: ip4_addr_add: si:loop110 172.16.100.1/24
linux-cp/itf [debug ]: ip4_addr_add: itf-pair: [2] loop110 tap6 vlaneth100 9 type tap netns ngfw ip4 172.16.100.1/24
linux-cp/itf [debug ]: admin_state_change: sw data1 1
### пример конфигурации vpp
## sudo podman exec vpp vppctl show int
Name Idx State MTU (L3/IP4/IP6/MPLS) Counter Count
data1 1 up 1500/0/0/0 tx-error 40
data1.109 7 up 1500/0/0/0
data1.110 8 up 1500/0/0/0
data1.10 9 up 1500/0/0/0
data2 2 up 1500/0/0/0 tx packets 13
tx bytes 1086
host-http1out 3 up 1500/0/0/0 rx packets 4
rx bytes 280
drops 4
ip6 4
local0 0 down 0/0/0/0
loop109 5 up 1500/0/0/0 tx packets 26
tx bytes 2172
drops 13
tx-error 1
loop10 4 up 1500/0/0/0 tx packets 26
tx bytes 2172
drops 13
tx-error 1
loop110 6 up 1500/0/0/0 tx packets 28
tx bytes 2352
drops 14
tap4 10 up 1500/0/0/0 rx packets 13
rx bytes 1046
drops 1
ip6 13
tap5 11 up 1500/0/0/0 rx packets 13
rx bytes 1046
drops 1
ip6 13
tap6 12 up 1500/0/0/0 rx packets 13
rx bytes 1046
ip6 13