Есть вот такой ресурс — https://srv6.md

Там неплохое описание того, как работает SRv6, с разными нюансами и в целом очень понятно сформированное, плюс внутри есть совсем базовая лаба — https://srv6.md/labs/containerlab/. Как введение в тему очень даже.

Так вот, думаю, дай-ка поделюсь тут с вами, но предварительно запущу лабу то. Ну и очевидно, что ничего не сработало, нет ни конфигов, ни параметров для хостов. Но справедливости ради, стоит сказать, что оно есть в виде каких-то шаблонов раскиданных по сайту.

Поэтому пошёл и вот вам собрал, можно пользоваться. Там ничего сложного, PE1 — P — PE2, ну и трафик от PE1 к PE2 идёт, IPv4 завернутый в IPv6. Плюс два VRFа, RED и BLUE, чтоб изоляцию тоже показать.

Вот тут всё: https://github.com/like-a-bus/srv6-frr-lab

Если у вас Ubuntu 24.04 с ядром от 5.11, то ставите докер, контейнерлаб и запускаете. Скрипт внутри всё настроит, поднимет тачки и пустит тестовый пинг.

Ну а если вы, как и я, фанат винды и используете WSL, то придётся конечно же обязательно поковыряться. Суть в том, что все дефолтные ядра, которые поставляет microsoft не содержат нужных опций и их придётся добавлять самому, пересобирая ядро. Собственно вот ниже инструкция :) Ради приличия, снёс целиком WSL, поставил заново и прошёл весь путь с нуля, ну чтоб наглядно было.

1. Ставим сам дистрибутив

wsl --install -d Ubuntu-24.04

Попробовал поставить 24.04, думая что повезёт и нужные опции будут… увы.

2. Идём внутрь и проверяем, что там есть

uname -r
# 5.15.167.4-microsoft-standard-WSL2

sudo ip -6 route add fc00:9::1/128 encap seg6local action End dev lo
# Error: CONFIG_LWTUNNEL is not enabled in this kernel

Как видите нет, маршрут не добавляется, нет поддержки LWTUNNEL, вот его и придётся нам докинуть в ядро.

3. Ставим всякое для сборки

sudo apt update
sudo apt install -y build-essential flex bison libssl-dev libelf-dev bc dwarves cpio pahole git

Тут базовый набор всякого для будущего make.

4. Забираем исходники и настраиваем немножечко

cd ~
git clone --depth 1 -b linux-msft-wsl-5.15.y https://github.com/microsoft/WSL2-Linux-Kernel.git

Обратите внимание на ветку, нужно выбрать ту, которая вам подходит, чтобы не переходить с одной на другую. Мне при установке приехала 5.15.x, её и использую дальше — linux-msft-wsl-5.15.y.

5. Делаем конфиг и проверяем

cd WSL2-Linux-Kernel
cp Microsoft/config-wsl .config

scripts/config --enable CONFIG_LWTUNNEL
scripts/config --enable CONFIG_IPV6_SEG6_LWTUNNEL
scripts/config --enable CONFIG_NET_VRF
scripts/config --enable CONFIG_DUMMY

make olddefconfig
grep -E 'CONFIG_LWTUNNEL=|CONFIG_IPV6_SEG6_LWTUNNEL=|CONFIG_NET_VRF=|CONFIG_DUMMY=' .config

Добавляем нужные опции — lwtunnel, seg6 — это прям про SRv6, их нет ни в одном ядре от microsoft. Но я ещё вот докинул vrf и dummy, т.к. у меня они при установке wsl не приехали, хотя есть соседний ноутбук, где всё ок и приехало, так что тут смотрите, может не всё для вас будет нужно.

6. Собираем ядро со всеми штуками для SRv6

make -j$(nproc)

Тут придётся подождать, собирается это всё достаточно долго. У меня на 12 ядрах собралось за 15 минут.

В конце получаем Kernel: arch/x86/boot/bzImage is ready (#1)

7. Допиливаем напильничком

sudo make modules_install
cp arch/x86/boot/bzImage /mnt/c/Users/Admin/bzImage-srv6

Тут по сути мы уже нашу сборку переложили сразу в директорию, которую видно напрямую из винды и теперь осталось её применить.

8. Подсунем теперь WSL правильный конфиг

printf '[wsl2]\nkernel=C:\\\\Users\\\\Admin\\\\bzImage-srv6\n' > /mnt/c/Users/Admin/.wslconfig
cat /mnt/c/Users/Admin/.wslconfig
[wsl2]
kernel=C:\\Users\\Admin\\bzImage-srv6

Создали файлик .wslconfig и в нём указали чтобы использовал наше новое собранное ядро!

9. Теперь перезапустим его и проверим результат

exit

C:\Users\Admin>wsl --shutdown
C:\Users\Admin>wsl -d Ubuntu-24.04

likeabus@DESKTOP-BEF0PVR:~$ uname -r
5.15.167.4-microsoft-standard-WSL2+

likeabus@DESKTOP-BEF0PVR:~$ sudo ip -6 route add fc00:9::1/128 encap seg6local action End dev lo && echo SRV6-OK
SRV6-OK
likeabus@DESKTOP-BEF0PVR:~$ sudo ip -6 route del fc00:9::1/128

Теперь всё норм, ошибок нет.

Плюсик в конце версии — это значит наша сборка активная, а выхлоп SRV6-OK означает, что наши опции сработали и роуты ставятся.

WSL настроили, можно идти теперь к самой лабе.

10. Закидываем докер и контейнерлаб

cd ~
sudo apt install -y docker.io
bash -c "$(curl -sL https://get.containerlab.dev)"

У меня они были, но я ради вас всё удалил и заново поставил.

11. Запускаем и проверяем, что докер есть

sudo systemctl start docker
sudo docker info | head -5

Если всё ок, то идём дальше, если не ок, то надо чинить и смотреть логи. Мне повезло и прошло всё сразу.

12. Клонируем репу и врубаем лабу

cd ~
git clone https://github.com/like-a-bus/srv6-frr-lab
cd srv6-frr-lab
bash setup.sh
...

==> Пингую 10.0.3.1 из RED
PING 10.0.3.1 (10.0.3.1) from 10.0.1.1: 56 data bytes
64 bytes from 10.0.3.1: seq=0 ttl=64 time=0.116 ms
64 bytes from 10.0.3.1: seq=1 ttl=64 time=0.096 ms
64 bytes from 10.0.3.1: seq=2 ttl=64 time=0.086 ms

--- 10.0.3.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.086/0.099/0.116 ms

==> Пингую 10.1.3.1 из BLUE
PING 10.1.3.1 (10.1.3.1) from 10.1.1.1: 56 data bytes
64 bytes from 10.1.3.1: seq=0 ttl=64 time=0.111 ms
64 bytes from 10.1.3.1: seq=1 ttl=64 time=0.090 ms
64 bytes from 10.1.3.1: seq=2 ttl=64 time=0.099 ms

--- 10.1.3.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.090/0.100/0.111 ms

Пошла тёпленькая) Intra-VRF работает в обоих.

Дополнительно ещё проверим, что Inter-VRF не работает и изоляция есть:

likeabus@DESKTOP-BEF0PVR:~/srv6-frr-lab$ sudo docker exec clab-srv6-lab-r1 ip vrf exec RED ping -c2 -W2 -I 10.0.1.1 10.1.3.1
PING 10.1.3.1 (10.1.3.1) from 10.0.1.1: 56 data bytes

--- 10.1.3.1 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss

Всё норм, из RED в BLUE не идёт, ну оно и очевидно.

13. Посмотрим в дамп

Проверим, что там правда есть нужные нам заголовки, но сначала его соберём:

PID=$(sudo docker inspect -f '' clab-srv6-lab-r2)
sudo nsenter -t $PID -n timeout 15 tcpdump -ni eth1 -w /mnt/c/Users/Admin/srv6.pcap &
sleep 2
sudo docker exec clab-srv6-lab-r1 ip vrf exec RED ping -c5 -I 10.0.1.1 10.0.3.1
wait
ls -lh /mnt/c/Users/Admin/srv6.pcap

Если вы думаете, что это я сам такую команду придумал, то ошибаетесь, спасибо Клоду)

Идём в проводник и там ищем наш файлик srv6.pcap. Открываем и смотрим что внутри.

img.png

Ура! Всё взлетело, пинг идёт, трафик вложен в IPv6, балдёж!


На этом наверное пока что остановимся, это была самая простая лаба, просто настроили 3 коробочки и запустили трафик между.

Но SRv6 он ведь не только про энкапсуляцию, хоть она и прикольная конечно, но ещё и про управление трафиком и про многое-многое другое. Хочется пойти дальше, добавить ещё узлов и вариативно управлять пакетиками. Короче, stay tuned 👍