
Я пытаюсь решить странную проблему с маршрутизацией. У меня настроен маршрутизатор (Turris, работающий под управлением настроенного OpenWRT) с туннелированием ipv6-соединения Strongswan. Это отлично работает для самого маршрутизатора, так как его ipv6-соединение работает нормально (через туннель, мой провайдер не предлагает нативный ipv6).
TL;DR: Маршруты выбираются не так, как я ожидал. Как наиболее общий, ::/0, по-видимому, всегда оказывается предпочтительным, хотя доступно соответствие /64.
Но когда я попытался распространить это на свою домашнюю сеть, я столкнулся с проблемой, причину которой я не могу найти.
Хотя ipsec работает, я получаю интерфейс ipsec0 и следующие маршруты:
Kernel IPv6 routing table
Destination Next Hop Flags Metric Ref Use Iface
::/0 :: U 1024 0 2 ipsec0
2a01:490:19:42::/64 :: U 1024 0 0 br-lan
Здесь 2a01:490:19:42::/64 — это ранг, который я выделил для своей локальной сети, 2a01:490:19:42::1 — это IP-адрес маршрутизатора в этой сети.
Вот некоторые наблюдения:
1) Когда я пингую 2a01:490:19:42::1 с компьютера в моей локальной сети, маршрутизатор отвечает, но отправляет ответ в интерфейс ipsec0. Понятия не имею, почему. Разве не должен быть более конкретный префикс 2a01:490:19:42::/64 на br-lan быть предпочтительным? Кажется, он правильно выбирает исходный IP-адрес 2a01:490:19:42::1.
2) То же самое происходит, когда я пытаюсь отправить пакет из своей локальной сети на какой-то другой сайт, скажем, ping6 stackexchange.com. Пакеты попадают на маршрутизатор, пересылаются, сервер отправляет ответ, маршрутизатор его получает... и отправляет обратно на интерфейс ipsec0.
3) Нет политик xfrm. ip xfrm pol
ничего не возвращает. Но Strongswan работает, и у меня сложилось впечатление, что Strongswan всегда создает какие-то политики. В моей предыдущей настройке мне пришлось добавить некоторые, чтобы разрешить прохождение пакетов в туннель, но меня немного смущает пустой список политик.
Хорошо, так в чем проблема? Почему для моих пакетов ipv6 предпочтителен самый общий маршрут, ::/0?
Спасибо!
решение1
Проблема была в том, что ipsec вставил свои правила в другую таблицу маршрутизации (таблица 220
) и создал политику для направления трафика туда:
root@turris:/etc/config# ip rule list
0: from all lookup local
220: from all lookup 220
32766: from all lookup main
32767: from all lookup default
Но таблица 220
содержала только маршрут по умолчанию в туннель ipsec, а не в локальную сеть:
root@turris:/etc/config# ip -6 r show table 220
default dev ipsec0 proto static src 2a01:490:19:42::1 metric 1024
Что неизбежно привело к пересылке всех пакетов в туннель.
Сеть самого маршрутизатора работала только потому, что они принимались, а не маршрутизировались.
Я исправил это, указав strongswan вставить правила маршрутизации в основную таблицу вместо этого, установив charon.routing_table = 254
(id основной таблицы, как показано в /etc/iproute2/rt_tables
). strongswan.conf
Теперь мой код выглядит так:
charon {
# load_modular = yes
plugins {
include strongswan.d/charon/*.conf
}
routing_table = 254 # main
}