Pull to refresh

Настрой себе IPv6 в Debian и Ubuntu

System administration *IPv6 *
Настрой себе IPv6 за несколько простых шагов.

Настраивать будем Debian Squeeze. В Ubuntu в принципе то же самое.

Шаг 1. Регистрируем туннель


Заходим на сайт Hurricane Electric, регистрируемся. Логинимся на сайте, и создаём туннель: вписываем свой IPv4 адрес и выбираем сервер поближе. Нам выделяют одну /64 подсеть, в которой будут находиться сервер и клиент как конечные точки туннеля.

В подсети /64 туннеля первый адрес — адрес сервера, второй — адрес клиента (то есть, наш).

Если у вас есть локальная сеть и вы хотите чтобы все машины в ней тоже получили IPv6 адреса, то запрашиваем ещё одну /64 подсеть («routed /64»). Если у вас 2 или более локальных сети за роутером, то запрашиваем /48 подсеть («routed /48»), которую будем нарезать на нужное количество /64. Все выделенные нам подсети будут маршрутизироваться через наш сервер.

Шаг 2. Настраиваем IPv6


Настраиваем туннель — интерфейс he-ipv6. Здесь используем подсеть /64 для туннеля. Вместо «переменных» вводим то, что получили на первом шаге.

Дописываем в конец /etc/network/interfaces
auto he-ipv6
iface he-ipv6 inet6 v4tunnel
        address $CLIENT_IPv6
        netmask 64
        endpoint $SERVER_IPv4
        local $CLIENT_IPv4
        gateway $SERVER_IPv6
        ttl 64


Включаем и проверяем:
# ifup he-ipv6
# ping -n ipv6.google.com


Шаг 3. DNS и Google


К сожалению, ipv6.google.com — единственная DNS запись Google, которая резолвится в IPv6 для всех. Google решил пока не резолвить все сервисы в IPv6 из-за того, что на довольно большом числе машин он неправильно настроен или неправильно отключен, в связи с чем пользователь может увидеть задержку пока браузер пытается соединиться с сервером по IPv6, а на самом деле IPv6 соединения нет.

Подробнее: www.google.com/intl/en/ipv6

Таким образом, Google решил включать IPv6 в DNS в масштабе отдельных провайдеров. Hurricane Electric относится как раз к таким провайдерам. Они предоставляют DNS сервер 2001:470:20::2, через который все домены сервисов Google резолвятся в том числе и в IPv6 адреса.

Можно сразу вписать в /etc/resolv.conf этот сервер, а можно поднять локальный кеширующий bind и немного выиграть в скорости.

# apt-get install bind9

Есть два способа настройки: можно резолвить через этот сервер только адреса Google (но нужно знать их список), а можно резолвить вообще всё (и не использовать DNS серверы провайдера вообще). Предлагаю второй способ, он проще, и к тому же у меня нет списка всех адресов сервисов Google.

Правим файл /etc/bind/named.conf.options
acl mynetworks {
  localhost;
  192.168.0.0/16; // наша локальная сеть, если есть
  2001:XXXX:XXXX:XXXX::/64; // наша IPv6 /64
  2001:XXXX:XXXX::/48; // наша IPv6 /48, если есть
};

options {
  directory "/var/cache/bind";

  allow-query { mynetworks; };

  forwarders {
    2001:470:20::2;
  };

  auth-nxdomain no;
  listen-on-v6 { any; };
};


Проверяем:
# dig +short google.com @::1 AAAA
2a00:1450:8003::63
2a00:1450:8003::67
2a00:1450:8003::68
2a00:1450:8003::69
2a00:1450:8003::6a
2a00:1450:8003::93


Если всё хорошо, то можно использовать. Вписываем в /etc/resolv.conf
nameserver ::1


Если нет локальной сети — то всё готово :)

Шаг 4. Маршрутизация


Для настройки машин в локальной сети предлагаю использовать stateless autoconfiguration. Это чем-то напоминает DHCP, но разница в том, что этот протокол staleless, то есть, сервер не хранит список выданных адресов. Принцип работы следующий: серверу выделяется одна /64, из которой он раздаёт адреса клиентам. Уникальность полученного IPv6-адреса обеспечивается тем, что в него включается MAC адрес клиента (немного преобразованный).

Пусть у нас на eth0 локальная сеть, а на eth1 — провайдер. Пока что IPv6 настроен только на интерфейсе he-ipv6. Поэтому eth0, смотрящий в локальную сеть должен получить статический IPv6-адрес для установки соединений с клиентами. Но мы не может назначить eth0 адрес из нашей туннельной /64, так как тогда получится что два интерфейса смотрят в одну и ту же подсеть. Можно разбить нашу /64 на две, но тогда не будет работать stateless autoconfiguration. Поэтому мы взяли себе ещё одну /64, из которой будем раздавать адреса в локальную сеть (важно подчеркнуть: это настоящие внешние IPv6 адреса). Пусть нам выдали 2001:XXXX:YYYY:ZZZZ::/64.

Если у нас несколько сетей за маршрутизатором, то мы взяли себе ещё и /48, из которой будем использовать необходимое количество подсетей /64. Пусть нам выдали 2001:XXXX:YYYY::/48. Дописываем ещё номер сети — будет занимать целых 2 байта и получаем: 2001:XXXX:YYYY:1::/64. Таким образом, у нас могло бы быть аж 65536 разных сетей. Адресом сервера будет 2001:XXXX:YYYY:1::1. Дальше пример с несколькими сетями не развиваю, думаю что довольно просто обобщить конфигурационные файлы на случай нескольких сетей.

Итак, у нас одна сеть за маршрутизатором, 2001:XXXX:YYYY:ZZZZ::/64. Дописываем в конец /etc/network/interfaces
iface eth0 inet6 static
        address 2001:XXXX:YYYY:ZZZZ::1
        netmask 64


Устанавливаем демона для stateless autoconfiguration:
# apt-get install radvd

/etc/radvd.conf
interface eth0
{
  AdvSendAdvert on;
  MaxRtrAdvInterval 30;

  prefix 2001:XXXX:YYYY:ZZZZ::1/64
  {
    AdvOnLink on;
    AdvAutonomous on;
    AdvRouterAddr off;
    AdvValidLifetime 300;
    AdvPreferredLifetime 120;
  };
};


Включаем форвардинг:
/etc/sysctl.conf
net.ipv6.conf.all.forwarding=1


# sysctl -w net.ipv6.conf.default.forwarding=1
# echo 1 > /proc/sys/net/ipv6/conf/all/forwarding


Перезапускаем radvd:
# invoke-rc.d radvd restart

Теперь все компьютеры из локальной сети должны автоматически получить IPv6 адреса и адрес шлюз. За процессом можно следить на сервере при помощи команды radvdump, а на клиентах проверять наличие адреса при помощи ip -6 a.

DNS-сервер придётся прописать клиентам вручную, stateless autoconfiguration этого не умеет.

Шаг 5. Avahi


Так как адреса клиентов основываются на MAC адресах, то в результате получаются адреса вида: 2001:528d:d4b6:1:215:f2ff:fe55:2d85. Работать с этим довольно тяжело, запомнить — невозможно. На помощь приходит multicast dns и его реализация в виде Avahi.

# apt-get install avahi-daemon avahi-utils

Проверяем наличие в /etc/avahi/avahi-daemon.conf строк:
[server]
use-ipv4=yes
use-ipv6=yes


Теперь все компьютеры в локальной сети получат имена вида hostname.local. Эти имена будут резолвиться по умолчанию в IPv4 адреса. Чтобы они резолвились по умолчанию в IPv6, правим строчку в /etc/nsswitch.conf.

Было:
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4

Стало:
hosts: files mdns_minimal [NOTFOUND=return] dns mdns


Теперь можно использовать имена hostname.local и по умолчанию будут устанавливаться IPv6 соединения.

Шаг 6. Squid + IPv6


Держите кеширующий прокси в локальной сети? Небольшая проблема: Squid получил полноценную поддержку IPv6 только в версии 3.1.0.x, которая сейчас находится в репозитории experimental. На самом деле ничего особо экспериментального, у меня нормально работает уже 4 месяца.

Устанавливаем squid3, в разрешающий ACL вписываем наши сети /64 и /48.

Удачных экспериментов!

UPD. На linuxforum заметили, что Hurricane Electric выдаёт две /64, поэтому запрашивать /48 с одной локальной сетью не нужно. Обновил топик.

UPD2. В связи с появившимися копипастами напомнимаю, что перепечатка разрешена только с моего разрешения.
Tags:
Hubs:
Total votes 107: ↑100 and ↓7 +93
Views 51K
Comments Comments 76