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

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

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

.config
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 необходимо разрешить проброс пакетиков:

/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"

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

/etc/conf.d/net
#####################################################################
#
## 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. Необходимо только помнить, что:

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

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

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

  • Stateless
  • Stateful

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

Stateless

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

  1. Все MAC-адреса в сети (и вообще в мире) уникальны (про дешёвые китайские поделки не вспоминаем)
  2. На основе уникального MAC-адреса легко получается – уникальный же – EUI-64 адрес, который префиксуется адресом IPv6-сети.
  3. IPv6-префикс определяется на основе Router Advertisement/Router Solicitation
/etc/radvd.conf
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;
        };
};
/etc/dhcp/dhcpd.conf
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-механизм настройки адреса.

/etc/radvd.conf
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;
        };
};
/etc/dhcp/dhcpd.conf
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


net/настройка_ipv6_на_linux.txt · Последние изменения: 2012-12-27 12:20 — Andrew A. Sabitov