Как настроить radvd для роутера linux ipv6 в направлении восходящего шлюза dsl

Я пытаюсь заставить свой домашний Linux-маршрутизатор также поддерживать ipv6 в домашней сети.

У меня есть DSL-маршрутизатор NVG599, выступающий в качестве GW для общедоступного Интернета, а затем мой маршрутизатор Linux с двумя интерфейсами: eth0 в направлении домашней сети и eth1 в направлении DSL-маршрутизатора.

ГЛАВНАЯ сеть <---- eth0 -----> LinuxRouter <------ eth1 ------>DSLrouter ->>>>>

Маршрутизатор DSL настроен с префиксом сети /64 от моего провайдера (предположим, это 2001:0:0:1234::/64), а маршрутизатор DSL имеет глобальный адрес ipv6 2001:0:0:1234::1, Я настроил маршрутизатор Linux с radvd для объявления того же префикса сети /64 для eth0 по отношению к домашней локальной сети, и действительно я вижу, что узлы в локальной сети могут автоматически настраивать свои IP-адреса. В объявлении также указан маршрутизатор Linux в качестве маршрутизатора по умолчанию для::/0, и переадресация настроена так, что он будет отправлять пакеты на маршрутизатор DSL.

Проблема, с которой я столкнулся, заключается в том, что маршрутизатор DSL отправляет пакеты запросов соседей по eth1, когда он получает входящие пакеты из Интернета, и эти запросы соседей не передаются из eth1 -> eth0 на маршрутизатор Linux. Я думаю, что это происходит, потому что маршрутизатор DSL считает, что он напрямую подключен к домашней сети (как это обычно бывает в 99% домашних сетей без маршрутизатора Linux в середине).

Потратив 2 дня, пытаясь выяснить это, ответ до сих пор ускользал от меня. Я надеюсь, что есть какой-то способ отправить объявление маршрутизатора, используя radvd, на маршрутизатор DSL, чтобы сказать ему, что он должен маршрутизировать все пакеты с префиксом /64 через маршрутизатор Linux. В настоящее время объявление маршрутизатора, отправляемое маршрутизатором Linux, настроено с префиксом /64, отправляемым маршрутизатору DSL с помощью:

interface eth1
{
    AdvSendAdvert on;
    MinRtrAdvInterval 3;
    MaxRtrAdvInterval 10;
    route 2001:0:0:1234::/64 {
    };

};

Я думаю, что этого должно быть достаточно, чтобы маршрутизатор DSL перенаправил все пакеты в сеть, но я все еще вижу запросы соседей.

Я вижу, что маршрутизатор DSL имеет настройки IP-пропускной способности с возможностью установки "сервера по умолчанию", но, похоже, они применяются только к IPv4. Предполагая, что маршрутизатор DSL не учитывает мой RA, я полагаю, что я мог бы настроить многоадресную пересылку ipv6, используя 'xorb' на моем маршрутизаторе Linux, но задавался вопросом, есть ли другие варианты.

1 ответ

Решение

Проблема, с которой я столкнулся, заключается в том, что маршрутизатор DSL отправляет пакеты запросов соседей по eth1, когда он получает входящие пакеты из Интернета, и эти запросы соседей не передаются из eth1 -> eth0 на маршрутизатор Linux.

Это нормально. Запросы соседей работают так же, как запросы ARP - они преобразуют IP-адрес в MAC-адрес и поэтому имеют смысл только в пределах одного домена широковещания. Для маршрутизатора нет смысла пересылать их.

(Хотя в некоторых ситуациях маршрутизатор может прокси-сервер их, как описано в конце, но... оставьте это для плана C.)

Я думаю, что это происходит, потому что маршрутизатор DSL считает, что он напрямую подключен к домашней сети (как это обычно бывает в 99% домашних сетей без маршрутизатора Linux в середине).

Да, и ты никогда не говорил это иначе.

Итак, ваша текущая ситуация такова, что одна и та же IP-подсеть используется двумя разными сетями, и вы ожидаете, что маршрутизатор Linux будет работать как мост... Это почти полная противоположность маршрутизатора.

(Если сбивает с толку часть IPv6, подумайте обо всей настройке в терминах IPv4, поскольку маршрутизация более или менее одинакова в обоих, а ND в основном эквивалентен ARP. Поэтому, если вы не будете использовать ту же подсеть 192.168.1.0 в v4...)


Ваш лучший способ действий - получить секунду /64 и использовать ее для сети eth1 вашего маршрутизатора Linux. (Если маршрутизатор DSL получает свой префикс через DHCPv6-PD, возможно, его можно обмануть, запросив второй.) Разница, однако, заключается в том, что 2nd /64 не будет использоваться непосредственно на интерфейсе, а вместо этого направляется к Адрес роутера Linux.

Например:

  • Маршрутизатор DSL имеет 2001:db8:0:0:a:b:c:d на интерфейсе WAN.
  • Маршрутизатор DSL получает 2001:db8:10:0::/64 от интернет-провайдера, самостоятельно назначает 2001:db8:10:0::1/64 на интерфейсе локальной сети и отправляет для него объявления маршрутизатора.
  • Автоматическая настройка маршрутизатора Linux 2001:db8:10:0:x:y:z:t для eth1 на основе RA.
  • Маршрутизатор Linux получает 2001:db8:10:1::/64 от провайдера (каким-то образом), самостоятельно назначает 2001:db8:10:1::1/64 на интерфейсе eth0, и radvd отправляет объявления маршрутизатора для этого - не для первой подсети.
  • Маршрутизатору DSL нужен маршрут типа "2001:db8:10:1::/64 через 2001:db8:10:0:x:y:z:t", чтобы весь трафик для 2-й подсети перенаправлялся на маршрутизатор Linux,

(Извиняюсь за не очень понятный пример.)

Иногда ISP делегирует вам целое /60 или даже /56 и направляет все это к маршрутизатору DSL. В этом случае вы можете просто настроить 2-ю подсеть без какой-либо магии DHCPV6-PD. Действительно, хотя я не могу дать здесь хороший "общий" ответ, так как он зависит как от провайдера, так и от CPE.


Если получение второго префикса /64 невозможно, возможны и другие варианты:

  • Превратите систему Linux в чистый мост без каких-либо функций маршрутизации.

  • Используйте другие источники для получения дополнительных /64, такие как туннельный провайдер (или 6to4). Существующие туннельные службы будут работать намного надежнее (за исключением некоторой дополнительной задержки), чем описанные ниже взломы.

  • Заставьте маршрутизатор DSL получать только /64, но не настраивать его для локальной сети. (Зависит от того, насколько гибок маршрутизатор.) Вместо этого снова установите маршрут для этого /64 через локальный адрес eth0 вашей системы Linux, а также настройте маршрут в системе Linux для::/0 через маршрутизатор DSL. LAN link-локальный адрес. В результате /64 будет использоваться только во 2-й подсети, а в 1-й вообще не будет никакого публичного префикса.

  • Продолжите текущую настройку, но установите "ndppd" для выполнения прокси Neighbor Discovery. (Нет, многоадресная переадресация не будет работать, поскольку пакеты ND часто имеют локальные адреса каналов.) Будьте осторожны с этим, это может привести к путанице.

  • Используйте частные адреса (ULA) для 2-й локальной сети и включите NAT (маскирование) 1-ко-многим на маршрутизаторе Linux... теряя большую часть полезности IPv6 в этом процессе. (Да, официально NAT не существует в IPv6, но это не помешало Linux netfilter/iptables сдаться и реализовать его.)

Другие вопросы по тегам