Почему не работает маршрут IPv6 на OpenWrt?
У меня есть роутер с OpenWrt (последняя прошивка 24.10.2) с настоящим IPv6-адресом. Настроен WireGuard-туннель до MikroTik (на котором нет настоящего IPv6-адреса), и я пытаюсь пустить трафик через OpenWrt.
Сеть за MikroTik: fd03:0:0:1::/64 для клиентов MikroTik
Интерфейсы для WireGuard: fd02:0:0:1::1 (OpenWrt) и fd02:0:0:1::2 (MikroTik)
С роутера OpenWrt я могу пинговать сеть MikroTik и интерфейсы туннеля WireGuard, и всё работает. Также с MikroTik ping и traceroute работают без проблем.
Однако, из сети за OpenWrt пинги доходят только до интерфейсов туннеля WireGuard с обеих сторон (со стороны OpenWrt и MikroTik), но при попытке пинга сети за MikroTik маршрут уходит в интернет. То есть прописанные правила маршрутизации IPv6-трафика работают только непосредственно с роутера OpenWrt и игнорируются для клиентов.
Вроде бы причина игнорирования маршрутизации IPv6 связана с номером метрики, но как это настраивается, я понять не могу.
Текущая маршрутизация:
ip -6 route
fd03:0:0:1::/64 from fd02:0:0:1::1 via fd02:0:0:1::2 dev wg0 proto static metric 1 mtu 1420 pref medium
Проблема с маршрутизацией IPv6 на OpenWrt с WireGuard связана с неправильными настройками метрик интерфейсов. По умолчанию интерфейс WireGuard имеет метрику 1024, что делает его менее приоритетным, чем стандартные IPv6-маршруты с метрикой 512. Это приводит к тому, что трафик из локальной сети не проходит через туннель, а отправляется напрямую в интернет.
Содержание
- Понимание проблемы метрик маршрутизации
- Настройка правильных метрик для WireGuard
- Проверка и настройка AllowedIPs
- Дополнительные параметры IPv6 конфигурации
- Полный пример конфигурации
- Диагностика и устранение неполадок
Понимание проблемы метрик маршрутизации
Основная проблема маршрутизации IPv6 в вашей конфигурации заключается в параметрах метрик интерфейсов. Как показывают исследования, в OpenWrt по умолчанию:
- Интерфейс WireGuard имеет метрику 1024
- Стандартный IPv6-шлюз провайдера имеет метрику 512
- Стандартный IPv4-шлюз провайдера имеет метрику 0
Из-за этого маршрутизатор предпочитает использовать IPv6-шлюз провайдера с более низкой метрикой (512), а не туннель WireGuard с метрикой 1024. Это объясняет, почему с самого роутера IPv6 через WireGuard работает (там используется статический маршрут с метрикой 1), а из локальной сети трафик уходит в интернет.
Важно: Метрика - это значение приоритета маршрута. Чем ниже значение метрики, тем выше приоритет маршрута.
Настройка правильных метрик для WireGuard
Чтобы исправить проблему метрик, вам нужно настроить WireGuard интерфейс с более низкой метрикой, чем у стандартного IPv6-шлюза. Вот пошаговая инструкция:
1. Проверка текущих метрик
ip -6 route show
Вы должны увидеть примерно такую картину:
default via fe80::xxx dev eth0 proto ra metric 512 expires ...
fd03:0:0:1::/64 from fd02:0:0:1::1 via fd02:0:0:1::2 dev wg0 proto static metric 1 mtu 1420 pref medium
2. Изменение метрики интерфейса WireGuard
Добавьте метрику для WireGuard интерфейса в конфигурацию сети OpenWrt:
uci set network.wg0.metric='1024'
Однако, как показывает исследование проблем с WireGuard на OpenWrt, простое изменение метрики WireGuard на 1024 не решает проблему, так как IPv6-шлюз провайдера имеет метрику 512. Нужно установить метрику WireGuard ниже:
uci set network.wg0.metric='512'
3. Настройка маршрута с правильной метрикой
Убедитесь, что маршрут к сети MikroTik имеет более низкую метрику, чем стандартный IPv6-шлюз:
# Добавляем маршрут с метрикой 100 (ниже, чем 512)
ip -6 route add fd03:0:0:1::/64 via fd02:0:0:1::2 dev wg0 metric 100
Проверка и настройка AllowedIPs
Как отмечается в исследованиях, правильная настройка AllowedIPs критически важна для работы IPv6 через WireGuard. На стороне MikroTik убедитесь, что в настройках WireGuard peer указан правильный префикс:
AllowedIPs = fd03:0:0:1::/64, fd02:0:0:1::/64
Критически важно: Обязательно укажите
/64suffix, иначе сервер будет рассматривать это как одиночный адрес, а не подсеть.
На стороне OpenWrt в конфигурации WireGuard также должна быть указана сеть MikroTik:
[Interface]
Address = fd02:0:0:1::1/64
PrivateKey = ...
[Peer]
PublicKey = ...
AllowedIPs = fd03:0:0:1::/64
Дополнительные параметры IPv6 конфигурации
Иногда проблема может быть связана с дополнительными параметрами IPv6 конфигурации. Рассмотрим несколько важных настроек:
1. Отключение IPv6 source routing
Если у вас возникают проблемы с маршрутизацией, попробуйте отключить IPv6 source routing:
uci set network.ipv6.sourcefilter='0'
uci commit network
/etc/init.d/network restart
Как отмечает один из пользователей в отчете об опыте настройки, это может помочь при проблемах с маршрутизацией.
2. Настройка RA (Router Advertisement)
Иногда проблема может быть связана с Router Advertisement. Проверьте настройки интерфейса:
# Отключаем RA на интерфейсе WireGuard, если он не нужен
uci set network.wg0.ra='0'
3. Проверка firewall правил
Убедитесь, что в firewall разрешен IPv6 трафик через WireGuard интерфейс:
# Разрешаем IPv6 на WireGuard интерфейсе
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-WireGuard-IPv6'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].dest='wg0'
uci set firewall.@rule[-1].proto='all'
uci set firewall.@rule[-1].family='ipv6'
uci set firewall.@rule[-1].target='ACCEPT'
uci commit firewall
/etc/init.d/firewall restart
Полный пример конфигурации
Вот полный пример конфигурации /etc/config/network для вашей ситуации:
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fd12:3456:789a::/48'
config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
option ip6assign '60'
config interface 'wan'
option ifname 'eth1'
option proto 'dhcp'
option peerdns '0'
option dns '192.168.1.1 8.8.8.8 1.1.1.1'
config interface 'wan6'
option ifname 'eth1'
option proto 'dhcpv6'
option reqaddress 'try'
option reqprefix 'auto'
option peerdns '0'
option dns '192.168.1.1 2001:4860:4860::8888 2606:4700:4700::1111'
config interface 'wg0'
option proto 'wireguard'
option private_key 'ВАШ_ПРИВАТНЫЙ_КЛЮЧ'
option metric '100'
list addresses 'fd02:0:0:1::1/64'
list addresses '192.168.9.1/24'
config wireguard_wg0
option public_key 'ПУБЛИЧНЫЙ_КЛЮЧ_МИКРОТИКА'
option allowedips 'fd03:0:0:1::/64, 192.168.88.0/24'
option endpoint_host 'ВАШ_IP_МИКРОТИКА'
option endpoint_port '51820'
option persistent_keepalive '25'
Соответствующая конфигурация firewall:
config defaults
option syn_flood '1'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'REJECT'
config zone
option name 'lan'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
option network 'lan wg0'
config zone
option name 'wan'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option masq '1'
option mtu_fix '1'
option network 'wan wan6'
config forwarding
option src 'lan'
option dest 'wan'
Диагностика и устранение неполадок
Если проблема сохраняется, выполните следующие шаги диагностики:
1. Проверка маршрутов
# Показать все IPv6 маршруты
ip -6 route show
# Показать таблицу маршрутизации для конкретного префикса
ip -6 route get fd03:0:0:1::1
2. Проверка состояния интерфейса
# Показать состояние WireGuard интерфейса
wg show
# Показать IPv6 адреса интерфейсов
ip -6 addr show
3. Проверка ping и traceroute
# С локального устройства в сети OpenWrt
ping6 fd03:0:0:1::1
ping6 8.8.8.8
# traceroute для диагностики пути
traceroute6 fd03:0:0:1::1
4. Проверка firewall правил
# Показать активные firewall правила для IPv6
iptables -t filter -L -v -n -6
5. Логирование ошибок
Включите подробное логирование для диагностики:
# Проверить логи сети
logread | grep -i wireguard
# Проверить логи IPv6
logread | grep -i ipv6
Источники
- GitHub Issue: Metric of Wireguard interface is 1024
- OpenWrt Forum: How to setup Wireguard with IPv6-PD
- LowEndTalk: Unable to route IPv6 through Wireguard on OpenWRT router
- hrna.moe: My experience with setting up IPv6 only Wireguard client on OpenWrt
- aparcar.org: OpenWrt with Wireguard VPN (IPv6)
- Reddit: IPv6 and WireGuard help
Заключение
Для решения проблемы маршрутизации IPv6 на OpenWrt с WireGuard выполните следующие ключевые шаги:
- Настройте правильные метрики: Установите метрику WireGuard интерфейса ниже, чем у стандартного IPv6-шлюза (например, 100 вместо 512)
- Проверьте AllowedIPs: Убедитесь, что на обеих сторонах туннеля правильно указаны IPv6 префиксы с /64 суффиксом
- Отключите IPv6 source routing: Это может помочь при проблемах с маршрутизацией
- Настройте firewall: Разрешите IPv6 трафик через WireGuard интерфейс
- Используйте статические маршруты: Добавьте явный маршрут с более низкой метрикой
Основная причина вашей проблемы заключается в том, что стандартный IPv6-шлюз провайдера имеет более высокий приоритет (более низкая метрика), чем туннель WireGuard. После настройки правильных метрик маршрутизация должна заработать корректно.