Раздача IPv6 от Ланты в свою ЛВС

17th Ноябрь 2011 | Метки: , , , ,
Опубликовал: Dmitriy [dk] Kalinin

В нашем захолустном городке наконец-то один из провайдеров (ЛанТа) начал выдавать IPv6 адреса. Адреса выдаются по технологии SLAAC (автоконфигурация).berryjam.ru

Услуга работает в тестовом режиме, и подключить ее можно, при наличии технической возможности, отправивив письмо на helpdesk@lanta-net.ru следующего содержания: «Прошу предоставить доступ по протоколу ipv6, по dualstack технологии. Номер договора xxxx.»

Технически это выглядит так: на порту провайдера для каждого клиента выделяется префикс /64, из которого он может сконфигурироваться.

Если на порту клиент один — то и проблем никаких нет, выбрал себе клиент адрес и забыл.

Если клиентов на порту несколько и нет роутера — то они тоже замечательно сами конфигурируются.

Но что делать, если есть роутер, за которым расположена своя локальная сеть  и есть желание в нее запустить IPv6? Именно про это и хотелось бы порассуждать.

Просто повторить префикс на интерфейсе ЛВС — успеха не принесло, ибо провайдер ничего не знает об этих хостах. Для решения проблемы выбрал вариант через bridge-интерфейс. После недолгих раздумий была собрана такая схема:

Немного пояснений:

— весь ipv4 трафик идет сквозь роутера;

— весь ipv6 трафик идет через интерфейс bridge0, как-бы в обход роутера.

Теперь осталось решить следующие задачи:

— не пропускать через bridge0 ipv4-трафик (ну не нужен он там)

— фильтровать ipv6-трафик на роутере.

 

Приступим к ломанию роутера :)

Первым делом конечно-же потребуется поддержка if_bridge, для этого собираем и подгружаем модули:

Не забываем добавить загрузку модулей при старте ОС, прописываем модули в /boot/loader.conf:

Теперь создаем bridge-интерфейс:

И смотрим, что получилось:

Вроде все нормально. Теперь нужно разобраться с фильтрацией пакетов.
Для управления прохождения трафика через bridge-интерфейс существует несколько системных переменных, нам интересны следующие:
net.link.bridge.pfil_onlyip — фильтровать только IP-трафик;
net.link.bridge.pfil_bridge — фильтровать трафик на bridge-интерфейсе;
net.link.bridge.pfil_member — так-же фильтровать трафик и на родительских интерфейсах;
Есть еще и прочие переменные, но мне они пока не требуются.

Разберемся как идет трафик через bridge: при включенном net.link.bridge.pfil_onlyip обрабатываются фаерволом только IP-пакеты, соответственно L2-пакеты идут в обход фаервола на всех участках цепи. Если включен net.link.bridge.pfil_member — пакеты будут также обрабатываться правилами на родительских интерфейсах bridge0. При включенном net.link.bridge.pfil_bridge пакеты также будут обрабатываться правилами для bridge-интерфейса. Небольшая зарисовка, как лезет пакет:

В моем задаче нет смысла фильтровать пакеты на родительских интерфейсах, поэтому ставлю net.link.bridge.pfil_member=0. Но мне нужно контролировать трафик, для этого его буду фильтровать на bridge-интерфейсе: net.link.bridge.pfil_bridge=1. Не IP-пакеты на интерфейсе не интересны, поэтому: net.link.bridge.pfil_onlyip=1.
Продублируем это в /etc/sysctl.conf:

С bridge-интерфейсом разобрались. Теперь осталось написать для него правила фильтрации. С этим очень просто, режем все, что не IPv6:

На этом все.

  1. 18th Ноябрь 2011 в 08:30

    > для каждого клиента выделяется префикс /64
    Как выяснилось, далеко не для каждого :)

  2. earl
    19th Ноябрь 2011 в 18:18

    Имеется в виду при наличии технической возможности ))

Вы должны авторизоваться для отправки комментария.