Два туннеля ipv6 от разных провайдеров на одном хосте

Два туннеля ipv6 от разных провайдеров на одном хосте

Мой вопрос связан сэтотвопрос, но с небольшой разницей:

У меня есть Ubuntu vps с одним IPv4 на главном интерфейсе. Я хотел бы иметь два отдельных туннеля IPv6 на этой машине, которые от двух разных провайдеров с разными адресами конечных точек. Когда я пробую один из них по отдельности. Все в порядке. Но когда я добавляю второй туннель, первый все еще работает, но второй не может быть пропингован снаружи. Однако он может пропинговать себя и шлюз.

Я добавляю эти строки в свой /etc/network/interfaces:

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
        address 2001:xxx:xxx:xxxx::2
        netmask 64
        endpoint xx.xx.xx.xx
        local yy.yy.yyy.yy
        ttl 255
        gateway 2001:xxx:xxx:xxxx::1

auto sbtb-ipv6
iface sbtb-ipv6 inet6 v4tunnel
        address 2a09:xxx:xxx:xxxx::2
        netmask 64
        endpoint zz.zz.zz.zz
        local yy.yy.yyy.yy
        ttl 255
        gateway 2a09:xxx:xxx:xxxx::1

Кто-нибудь знает, в чем проблема или как ее можно устранить?

решение1

Несколько замечаний

Для сетевых инструментов настройки, отличных от ifupdown, v4tunnelна самом деле это уровень 3СИДЕТЬтуннель, который может быть создан в зависимости от инструментов с использованием эквивалента ip tunnel add FOO mode sit ...или ip link add name FOO type sit ....

Интерфейсы уровня 3 не имеют адреса уровня 2 (нет MAC-адреса Ethernet) и, таким образом, не должны разрешать адрес базового уровня 2: ARP (IPv4) и NDP (IPv6) не происходят с интерфейсом уровня 3. По той же причине нет шлюза для разрешения: шлюз не нужен для его свойства шлюза, но синтаксис все еще может позволить угадать интерфейс для использования при создании записи таблицы маршрутизации без указания интерфейса, и это обычно то, что делается, включаяПримеры собственной конфигурации туннельного брокера. В конце концов, использование сетевой маски /64 и шлюза не нужны нигде для настройки OP. Но этот ответ все равно будет придерживаться этих настроек, поэтому читателю будет проще адаптировать его к туннелю интерфейса уровня 2, где все эти настройки затем станут обязательными. Аналогично, обычно sbtb-ipv6нужны только настройки для интерфейса не по умолчанию (здесь), но в любом случае я предоставляю настройку для двух интерфейсов. Единственное оставшееся различие заключается в том, какой интерфейс получает маршрут по умолчанию в основной таблице маршрутизации.

Многоадресность и маршрутизация политик

Это теперь случаймногоадресная система с использованием нескольких адресовкаждый со своим собственным путем к Интернету (IPv6). Маршрутизаторы восходящего потока, безусловно, реализуютСтрогая переадресация по обратному пути(SRPF) для защиты от спуфинга: каждый исходный адрес должен проходить по своему выделенному пути. При простой маршрутизации используется только один маршрут по умолчанию (первый отображаемый). Можно добавить второй маршрут по умолчанию с более длинной метрикой, но он никогда не будет выбран, пока не исчезнет маршрут с более короткой метрикой.

Чтобы преодолеть это, можно использоватьмаршрутизация политики. Это позволяет системе выбирать другие таблицы маршрутизации (заполненные другими маршрутами) и правила маршрутизации, которые будут выбирать эти таблицы маршрутизации с дополнительными селекторами, а не просто использовать пункт назначения для поиска маршрута. Здесь полезен исходный адрес (и в некоторых случаях также исходящий интерфейс, когда этот интерфейс принудительноSO_BINDTODEVICE).

Итак, цель состоит в том, чтобы создать несколько альтернативных таблиц маршрутизации с частичным представлением маршрутов на основе записей из основной таблицы маршрутизации: каждая таблица маршрутизации будет считать, что существует только один путь в Интернет, и будет иметь свой собственный маршрут по умолчанию. Затем правило маршрутизации на основе адреса источника выберет адекватную таблицу маршрутизации для исходящих пакетов. В случае OP для входящих пакетов ничего особенного не требуется, поскольку локальная таблица маршрутизации уже обрабатывает этот случай.

Выполнение

Сначала interfacesнастройки следует отрегулировать, добавив другойметрикав каждом из них, иначе sbtb-ipv6настройка, скорее всего, завершится ошибкой, поскольку не может быть двух маршрутов по умолчанию с одинаковой метрикой.

Затем вручную вот как это сделать. Добавьте две таблицы маршрутизации с (произвольными) значениями 2000 для HE и 2001 для SBTB и скопируйте в каждую из них только связанные маршруты. Метрика здесь не имеет значения, так как конфликта не может быть.

ip -6 route add 2001:xxx:xxx:xxxx::/64 dev he-ipv6             table 2000
ip -6 route add default via 2001:xxx:xxx:xxxx::1 dev he-ipv6   table 2000

ip -6 route add 2a09:xxx:xxx:xxxx::/64 dev sbtb-ipv6           table 2001
ip -6 route add default via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001

И выберите подходящий маршрут на основе адреса источника с помощью правил маршрутизации (и, чтобы быть точным, укажите фиксированный приоритет и укажите, что это локально инициированный пакет с помощью iif lo):

ip -6 rule add pref 20000 from 2001:xxx:xxx:xxxx::2 iif lo lookup 2000
ip -6 rule add pref 20010 from 2a09:xxx:xxx:xxxx::2 iif lo lookup 2001

Для случая, когда выполняется привязка к интерфейсу (например, ping -I sbtb-ipv6 ...), а не «просто» к адресу интерфейса ( ping -I 2a09:xxx:xxx:xxxx::2), также используйте это для получения правильных результатов (действительно полезно для случаев уровня 2, когда в основной таблице маршрутизации нет второго маршрута по умолчанию, на самом деле не нужно в случае OP с интерфейсами уровня 3):

ip -6 rule add pref 20001 oif he-ipv6 lookup 2000
ip -6 rule add pref 20011 oif sbtb-ipv6 lookup 2001

Обратное направление (входящий трафик, или ingress) уже правильно обрабатывается в localтаблице маршрутизации при добавлении адресов, поэтому для ingress ничего особенного делать не нужно.

Окончательная конфигурация

Вышеуказанное следует сначала попробовать вручную, с резервным доступом к удаленной консоли (хотя IPv4 не затронут, доступа IPv4 должно быть достаточно). Затем его можно интегрировать в interfacesфайл конфигурации, используя команды up/ везде, где не поддерживается эта функция (например: вся маршрутизация политики). Обязательно удалите предыдущие ручные тесты, иначе несколько команд в настройке интерфейса будут конфликтовать с ошибками, такими как и конфигурация интерфейсов не будет выполнена.downifupdownRTNETLINK answers: File exists

ОБНОВЛЕНИЕ: это также включает отправку трех пингов на удаленный конец туннеля SBTB, поскольку из комментариев следует, что этот туннель должен видеть трафик с сервера, прежде чем он сможет принять трафик на сервер. Если адреса пиров SBTB (туннелированного) недостаточно для запуска приема трафика на сервер, замените его на какой-нибудь "хорошо известный" адрес IPv6. То же самое можно добавить на интерфейс HE, но это, похоже, не нужно.

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
        address 2001:xxx:xxx:xxxx::2
        netmask 64
        endpoint xx.xx.xx.xx
        local yy.yy.yyy.yy
        ttl 255
        gateway 2001:xxx:xxx:xxxx::1
        metric 1000
        up   ip -6 route add 2001:xxx:xxx:xxxx::/64 dev he-ipv6 table 2000
        up   ip -6 route add default via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000
        up   ip -6 rule add pref 20000 from 2001:xxx:xxx:xxxx::2 iif lo lookup 2000
        up   ip -6 rule add pref 20001 oif he-ipv6 lookup 2000
        down ip -6 rule del pref 20001
        down ip -6 rule del pref 20000

auto sbtb-ipv6
iface sbtb-ipv6 inet6 v4tunnel
        address 2a09:xxx:xxx:xxxx::2
        netmask 64
        endpoint zz.zz.zz.zz
        local yy.yy.yyy.yy
        ttl 255
        gateway 2a09:xxx:xxx:xxxx::1
        metric 1001
        up   ip -6 route add 2a09:xxx:xxx:xxxx::/64 dev sbtb-ipv6 table 2001
        up   ip -6 route add default via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001
        up   ip -6 rule add pref 20010 from 2a09:xxx:xxx:xxxx::2 iif lo lookup 2001
        up   ip -6 rule add pref 20011 oif sbtb-ipv6 lookup 2001
        up ping -q -c3 -I sbtb-ipv6 2a09:xxx:xxx:xxxx::1
        down ip -6 rule del pref 20011
        down ip -6 rule del pref 20010

Как использовать?

Теперь можно поднять один или оба интерфейса, он всегда будет работать правильно, с приоритетом, he-ipv6когда оба включены. Чтобы использовать sbtb-ipv6интерфейс, когда оба включены, нужно привязаться к его адресу или к самому интерфейсу. Вот примеры для отображения маршрута, который, как ожидается, будет использовать ядро:

# ip route get to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2001:xxx:xxx:xxxx::1 dev he-ipv6 src 2001:xxx:xxx:xxxx::2 metric 1000 pref medium

# ip route get from 2001:xxx:xxx:xxxx::2 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from 2001:xxx:xxx:xxxx::2 via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000 src 2001:xxx:xxx:xxxx::2 metric 1024 pref medium

# ip route get oif he-ipv6 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000 src 2001:xxx:xxx:xxxx::2 metric 1024 pref medium

# ip route get from 2a09:xxx:xxx:xxxx::2 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from 2a09:xxx:xxx:xxxx::2 via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001 src 2a09:xxx:xxx:xxxx::2 metric 1024 pref medium

# ip route get oif sbtb-ipv6 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001 src 2a09:xxx:xxx:xxxx::2 metric 1024 pref medium

Различные команды, демоны или инструменты требуют различных опций для привязки к другому исходному адресу или устройству. Например: ping -I, traceroute -i, curl --interface, ssh -b/ ssh -Bи т. д.

Проверить это можно, сравнив результат одной из этих команд:

curl -6 https://ifconfig.co
curl -6 --interface 2001:xxx:xxx:xxxx::2 https://ifconfig.co
curl -6 --interface he-ipv6 https://ifconfig.co

по сравнению с результатом одного из них:

curl -6 --interface 2a09:xxx:xxx:xxxx::2 https://ifconfig.co
curl -6 --interface sbtb-ipv6 https://ifconfig.co

Связанный контент