Я пытаюсь сделать так, чтобы мой домашний маршрутизатор Linux также поддерживал IPv6 в домашней сети.
У меня есть маршрутизатор DSL NVG599, работающий в качестве шлюза для публичного Интернета, а также мой маршрутизатор 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 pass through с возможностью установки "сервера по умолчанию", но они, похоже, применяются только к 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, его можно обмануть и запросить второй.) Разница, однако, в том, что второй /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.
(Извините за не совсем понятный пример.)
Иногда провайдер делегирует вам целый /60 или даже /56 и направляет его весь к маршрутизатору DSL. В этом случае вы можете просто настроить 2-ю подсеть без всякой магии DHCPV6-PD. Хотя на самом деле я не могу дать здесь хороший "общий" ответ, поскольку это зависит и от провайдера, и от CPE.
Если получение второго префикса /64 невозможно, возможны другие варианты:
Превратите систему Linux в чистый мост, без какой-либо функции маршрутизации.
Используйте другие источники для получения дополнительных /64, например, туннельного провайдера (или 6to4). Существующие туннельные сервисы будут работать намного надежнее (за исключением некоторой дополнительной задержки), чем описанные ниже хаки.
Сделайте так, чтобы маршрутизатор DSL получал только /64, но не настраивал его для LAN. (Зависит от гибкости маршрутизатора.) Вместо этого снова настройте маршрут для этого /64 через локальный адрес eth0 вашей системы Linux, и аналогичным образом настройте маршрут в системе Linux для ::/0 через локальный адрес LAN маршрутизатора DSL. В результате /64 будет использоваться только во 2-й подсети, а 1-я вообще не будет иметь публичного префикса.
Продолжайте использовать текущую настройку, но установите «ndppd» для выполнения проксирования Neighbor Discovery. (Нет, многоадресная пересылка не подойдет, поскольку пакеты ND часто имеют локальные адреса источника.) Будьте осторожны с этим, это может все сильно запутать.
Используйте частные (ULA) адреса для второй локальной сети и включите NAT «один ко многим» (маскарадинг) на маршрутизаторе Linux... при этом теряется большая часть полезности IPv6. (Да, официально NAT не существует в IPv6, но это не помешало Linux netfilter/iptables сдаться и реализовать его.)