Как настроить 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 сдаться и реализовать его.)