Вопрос или проблема
Я пытаюсь наладить работу VRF в Linux.
Предыстория: Я ознакомился с множеством документов по настройке VRF-lite в ядре Linux и у меня есть простая просьба к VRF – вернуть мне ping 🙂
Я прочитал все эти документы:
- https://docs.kernel.org/networking/vrf.html
- https://alexkaouris.medium.com/vrfs-quick-intro-f0f7191779d2
- https://netplan.readthedocs.io/en/0.106.1/netplan-yaml/#properties-for-device-type-vrfs
- https://www.dasblinkenlichten.com/working-with-linux-vrfs/
- https://interpip.es/linux/creating-a-vrf-and-running-services-inside-it-on-linux/
- https://docs.frrouting.org/en/stable-9.1/zebra.html#virtual-routing-and-forwarding
- https://people.kernel.org/dsahern/management-vrf-and-dns
- https://jerryxiao.cc/archives/1004
- https://stbuehler.de/blog/article/2020/02/29/using_vrf__virtual_routing_and_forwarding__on_linux.html
- https://docs.nvidia.com/networking-ethernet-software/cumulus-linux-59/Layer-3/VRFs/Virtual-Routing-and-Forwarding-VRF/#frrouting-in-a-vrf
- https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/assembly_starting-a-service-within-an-isolated-vrf-network_configuring-and-managing-networking#proc_configuring-a-vrf-device_assembly_starting-a-service-within-an-isolated-vrf-network
- https://www.linkedin.com/pulse/running-vrf-linux-gerardo-marciales
Но ни один из них не описывает простую ситуацию с пингом.
Конфигурация:
Ubuntu 24.04 VM
# конфигурация netplan
root@as-test-ubuntu:~# netplan get
network:
version: 2
renderer: networkd
ethernets:
ens3:
match:
macaddress: "fa:16:3e:d6:d5:0c"
addresses:
- "192.168.40.15/21"
dhcp4: false
set-name: "ens3"
ens4:
match:
macaddress: "fa:16:3e:ef:59:e7"
addresses:
- "192.168.2.60/24"
dhcp4: false
set-name: "ens4"
vrfs:
vrf-mgmt:
interfaces:
- ens3
routes:
- to: "default"
via: "192.168.40.1"
table: 1
Логи tcpdump на интерфейсе VRF
root@as-test-ubuntu:~# tcpdump -npe -i vrf-mgmt
tcpdump: подробный вывод подавлен, используйте -v[v]... для полного декодирования протокола
прослушивание на vrf-mgmt, тип канала EN10MB (Ethernet), длина снимка 262144 байт
13:03:23.373513 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 560, длина 64
13:03:23.373559 42:b6:48:39:49:0f > 42:b6:48:39:49:0f, ethertype IPv4 (0x0800), длина 98: 192.168.40.15 > 10.192.10.82: ICMP эхо-ответ, id 44994, seq 560, длина 64
13:03:24.397483 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 561, длина 64
13:03:24.397535 42:b6:48:39:49:0f > 42:b6:48:39:49:0f, ethertype IPv4 (0x0800), длина 98: 192.168.40.15 > 10.192.10.82: ICMP эхо-ответ, id 44994, seq 561, длина 64
13:03:25.421560 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 562, длина 64
13:03:25.421607 42:b6:48:39:49:0f > 42:b6:48:39:49:0f, ethertype IPv4 (0x0800), длина 98: 192.168.40.15 > 10.192.10.82: ICMP эхо-ответ, id 44994, seq 562, длина 64
13:03:26.445783 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 563, длина 64
13:03:26.445834 42:b6:48:39:49:0f > 42:b6:48:39:49:0f, ethertype IPv4 (0x0800), длина 98: 192.168.40.15 > 10.192.10.82: ICMP эхо-ответ, id 44994, seq 563, длина 64
Логи tcpdump на нижнем Ethernet-интерфейсе
root@as-test-ubuntu:~# tcpdump -npe -i ens3
tcpdump: подробный вывод подавлен, используйте -v[v]... для полного декодирования протокола
прослушивание на ens3, тип канала EN10MB (Ethernet), длина снимка 262144 байт
13:04:44.269975 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 639, длина 64
13:04:45.293675 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 640, длина 64
13:04:46.317790 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 641, длина 64
13:04:47.341587 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 642, длина 64
13:04:48.299941 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype ARP (0x0806), длина 56: Запрос who-has 192.168.40.15 tell 192.168.40.1, длина 42
13:04:48.299972 fa:16:3e:d6:d5:0c > 00:09:0f:09:01:1b, ethertype ARP (0x0806), длина 42: Ответ 192.168.40.15 is-at fa:16:3e:d6:d5:0c, длина 28
13:04:48.365754 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 643, длина 64
13:04:49.391177 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 644, длина 64
13:04:50.414066 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 645, длина 64
13:04:51.438125 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 646, длина 64
13:04:52.463347 00:09:0f:09:01:1b > fa:16:3e:d6:d5:0c, ethertype IPv4 (0x0800), длина 98: 10.192.10.82 > 192.168.40.15: ICMP эхо-запрос, id 44994, seq 647, длина 64
Как видно, пакеты застревают где-то между VRF и нижним Ethernet.
Я не нашел решения этой проблемы.
Ответ или решение
Проблема с отсутствующими ответами на ICMP-запросы (ping) в вашей конфигурации VRF может быть связана с несколькими аспектами настройки сети в Linux, включая маршрутизацию, правила iptables, или настройки самой VRF. Давайте рассмотрим все шаги, которые могут помочь исправить ситуацию.
1. Проверка конфигурации VRF
Судя по предоставленной вами конфигурации netplan, у вас есть VRF vrf-mgmt
, которая привязана к интерфейсу ens3
. Убедитесь, что маршрут по умолчанию для VRF настроен правильно и что сеть, к которой вы пытались подключиться, доступна через этот маршрут.
Проверьте маршруты:
ip route show table 1
Убедитесь, что маршрут по умолчанию (default
) правильно указывает на IP-адрес вашего шлюза (192.168.40.1).
2. Проверка iptables
Проблемы с блокировкой ICMP могут возникать из-за настроек iptables. Вы можете временно отключить iptables, чтобы проверить, является ли оно причиной проблемы:
iptables -L -n -v
Если правило блокировки есть, вы можете временно отключить iptables командой:
iptables -F
После тестирования, не забудьте вернуть правила обратно.
3. Убедитесь, что интерфейсы VRF активированы
Проверьте состояние интерфейсов в вашей VRF:
ip link show
Интерфейс vrf-mgmt
должен быть активен (UP
). Если он неактивен, вы можете активировать его:
ip link set dev vrf-mgmt up
4. Проверка ARP и настройка interfaces
Иногда проблемы могут быть связаны с неправильным разрешением ARP. Убедитесь, что ваш сервер правильно разрешает ARP для интерфейсов VRF и что никакие конфликты IP не происходят. Вы можете проверить ARP-таблицу с помощью команды:
arp -n
Если ваш пинг проходит, но вы не получаете ответа, это может означать, что ответ блокируется или теряется.
5. Пинг с VRF
Для тестирования вы можете попробовать выполнить ping через конкретную таблицу, используя ip
:
ip -4 -o route get 192.168.40.15 dev vrf-mgmt
ping -I vrf-mgmt 192.168.40.15
6. Логи протоколов
Проверьте системные логи на наличие ошибок, связанных с сетью:
journalctl -u systemd-networkd
7. Используйте tcpdump
для отладки
Вы уже использовали tcpdump
, и это хорошо. Обратите внимание, что на интерфейсе vrf-mgmt
вы должны видеть входящие и исходящие пакеты ICMP. Если вы видите исходящий ICMP, но не получаете ответ, это указывает на проблемы с маршрутизацией или фильтрацией трафика.
8. Перезапустите сетевые службы
После внесения изменений в конфигурацию не забудьте перезапустить сетевые службы:
netplan apply
или, если вы используете systemd-networkd:
systemctl restart systemd-networkd
Заключение
Если после всех проведенных действий ping все равно не работает, рекомендуется проверить наличие обновлений для вашей системы и напрямую обратиться к документации Ubuntu по сетевым интерфейсам и VRF. Важно убедиться, что ваша версия ядра поддерживает все необходимые функции для корректной работы VRF.
Надеюсь, это поможет вам решить проблему. Если вопросы останутся, пожалуйста, дайте знать!