Настройка IPv6 туннеля на Linux с маршрутизацией клиентов

Настройка ядра

Взводим все параметры ядра, связанные с IPv6:

CONFIG_IPV6=m CONFIG_IPV6_PRIVACY=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y CONFIG_IPV6_OPTIMISTIC_DAD=y CONFIG_INET6_AH=m CONFIG_INET6_ESP=m CONFIG_INET6_IPCOMP=m CONFIG_IPV6_MIP6=m CONFIG_INET6_XFRM_TUNNEL=m CONFIG_INET6_TUNNEL=m CONFIG_INET6_XFRM_MODE_TRANSPORT=m CONFIG_INET6_XFRM_MODE_TUNNEL=m CONFIG_INET6_XFRM_MODE_BEET=m CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y CONFIG_IPV6_TUNNEL=m CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_SUBTREES=y CONFIG_IPV6_MROUTE=y CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y CONFIG_IPV6_PIMSM_V2=y # # IPv6: Netfilter Configuration # CONFIG_NF_CONNTRACK_IPV6=m CONFIG_IP6_NF_QUEUE=m CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_AH=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_MH=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_IP6_NF_TARGET_HL=m CONFIG_IP6_NF_TARGET_LOG=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_RAW=m

Если машина будет работать как IP6-маршрутизатор, в /etc/sysctl.conf необходимо разрешить проброс пакетиков:

# Enables packet IPv6 forwarding net.ipv6.conf.all.forwarding = 1

USE-flags

В /etc/make.conf в список USE-флагов добавляем ipv6 и пересобираем систему:

emerge --nospinner -uDNvt --with-bdeps y world -j2

Настройка туннеля

Заходим на сайт Hurricane Electric, регистрируемся, входим :) В меню «User Functions» выбираем «Create Regular Tunnel» и заполняем форму:

«IPv4 endpoint» – указываем адрес нашей машины, которая будет держать туннель

«Which Server Is Closest to you» – выбираем с каким сервером Hurricane Electric будет настраиваться туннель.

В «Account Menu» выбираем «Click For Main Page». Тыкаем на наш свежесозданный туннель и:

вводим название туннеля (это надо, что бы отличать туннели между собой, если их будет несколько)

проверяем, что IPv4 адрес нашей стороны туннеля указан верно

тыкаем кнопку «Show Config»

по-умолчанию нам выдают только блок адресов /64, что является аналогом транспортной сетки /30 в мире IPv4, если надо иметь «локальную» сеть (a la /24 в IPv4) в строке «Routed /48», говорим, чтобы нам выдали блок адресов /48.

С помощью мышки поднимаем туннель и проверяем, что удалённый конец туннеля достижим:

ping6 "то, что указано в поле Server IPv6 address"

Если всё заработало, прописываем наш туннель в конфиги:

##################################################################### # ## IPv6@eth0 configuration (tunnel via hurricane electric) # ##################################################################### iptunnel_he0="mode sit remote 216.66.84.46 local 111.222.33.22 ttl 255" mtu_he0="1280" config_he0=( "2001:470:1f14:ad4::2/64" ) routes_he0=( "::/0 dev he0" )

Далее убиваем туннель, который был настроен мышкой, и поднимаем туннель через инитовый скрипт:

ip tunnel del he-ipv6 ln -sndf /etc/init.d/net.{lo,he0} /etc/init.d/net.he0 restart rc-update add net.he0 default

Firewall

Концептуально, настройка пакетного фильтра для IPv6 ничем не отличается от того, что делается для IPv4. Необходимо только помнить, что:

вместо команды iptables надо использовать ip6tables

протокол ICMP заменяется протоколом ICMPv6, а сам протокол ICMPv6 широко используется для поддержания работы ip6-сети. Если его полностью заблокировать, можно, с высокой вероятностью, получить не работающую сеть.

Автонастройка сети на клиентах

IPv6 имеет два альтернативных способа автоматической настройки адресов на клиентских машинах:

Stateless

Stateful

Независимо от того, какой вариант будет выбран, необходимо иметь работающий radvd, для анонсов маршрутизации и dhcpv6 для настройки всяческих параметров не связанных с собственно адресацией/маршрутизацией. Например, NTP-, SIP-, DNS-сервера, имя домена и т.п.

Stateless

При таком режиме работы сети информация о клиентских машинах нигде не хранится. Это возможно по следующим соображениям:

Все MAC-адреса в сети (и вообще в мире) уникальны (про дешёвые китайские поделки не вспоминаем)

На основе уникального MAC-адреса легко получается – уникальный же – EUI-64 адрес, который префиксуется адресом IPv6-сети.

IPv6-префикс определяется на основе Router Advertisement/Router Solicitation

interface eth1 { AdvSendAdvert on; AdvManagedFlag on; AdvOtherConfigFlag on; IgnoreIfMissing on; MinRtrAdvInterval 3; MaxRtrAdvInterval 10; AdvHomeAgentFlag off; # Disable Mobile IPv6 support prefix 2001:470:d6a7::/64 { AdvOnLink on; AdvAutonomous on; # Enable stateless configuration AdvRouterAddr on; }; };
default-lease-time 2592000; preferred-lifetime 604800; option dhcp-renewal-time 3600; option dhcp-rebinding-time 7200; allow leasequery; option dhcp6.name-servers 2001:470:d6a7::22, 2001:470:1f14:ad4::2; option dhcp6.domain-search "sabitov.pp.ru", "sabitov.su"; option dhcp6.preference 255; option dhcp6.info-refresh-time 21600; use-host-decl-names on; ddns-update-style none; ddns-updates off; subnet6 2001:470:d6a7::/64 { }

Stateful

При таком режиме работы информация о выданных адресах хранится на DHCP-сервере, и клиенты должны периодически подтверждать, право использования выданного им адреса.

radvd по прежнему анонсирует информацию о маршрутах, но выключенный флаг AdvAutonomous указывает клиенту, что он не имеет права использовать stateless-механизм настройки адреса.

interface eth1 { AdvSendAdvert on; AdvManagedFlag on; AdvOtherConfigFlag on; IgnoreIfMissing on; MinRtrAdvInterval 3; MaxRtrAdvInterval 10; AdvHomeAgentFlag off; # Disable Mobile IPv6 support prefix 2001:470:d6a7::/64 { AdvOnLink on; AdvAutonomous off; # Disable stateless configuration AdvRouterAddr on; }; };
default-lease-time 2592000; preferred-lifetime 604800; option dhcp-renewal-time 3600; option dhcp-rebinding-time 7200; allow leasequery; option dhcp6.name-servers 2001:470:d6a7::22, 2001:470:1f14:ad4::2; option dhcp6.domain-search "sabitov.pp.ru", "sabitov.su"; option dhcp6.preference 255; option dhcp6.info-refresh-time 21600; use-host-decl-names on; ddns-update-style none; ddns-updates off; subnet6 2001:470:d6a7::/64 { } host yew6 { hardware ethernet 00:11:d8:82:d6:e0; fixed-address6 2001:470:d6a7::21; }

Вообще говоря, DHCPv6 вместо MAC-адреса оперирует понятием DUID, но поскольку использование MAC-адреса привычней, а dhcp-сервер позволяет, то в примере указано использование MAC-адреса.

— Andrew A. Sabitov 2011-03-21 23:52

Tracedump:

newBaseSize: 16pt
newBaseSizeInPt: 16