
Мой вопрос связан сэтотвопрос, но с небольшой разницей:
У меня есть 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
/ везде, где не поддерживается эта функция (например: вся маршрутизация политики). Обязательно удалите предыдущие ручные тесты, иначе несколько команд в настройке интерфейса будут конфликтовать с ошибками, такими как и конфигурация интерфейсов не будет выполнена.down
ifupdown
RTNETLINK 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