SRv6. Часть 1. Basic.
Есть вот такой ресурс — 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. Открываем и смотрим что внутри.

Ура! Всё взлетело, пинг идёт, трафик вложен в IPv6, балдёж!
На этом наверное пока что остановимся, это была самая простая лаба, просто настроили 3 коробочки и запустили трафик между.
Но SRv6 он ведь не только про энкапсуляцию, хоть она и прикольная конечно, но ещё и про управление трафиком и про многое-многое другое. Хочется пойти дальше, добавить ещё узлов и вариативно управлять пакетиками. Короче, stay tuned 👍
Пишу это всё в свободное время. Если статья пригодилась — можно закинуть на пиво. Или просто подписаться на канал.