Настройка 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. Необходимо только помнить, что:
- вместо команды 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
- /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