Настройка IPv6 на Ubuntu/Debian
Инструкция по подключению и настройке IPv6 адреса на виртуальном сервере с операционной системой Ubuntu или Debian.
Что это такое?
IPv6 – это протокол сетевого уровня и со временем должен заменить протокол IPv4, который сейчас используется повсеместно. Количество IPv4 адресов ограничено несколькими миллиардами — (2 8 ) 4 адресов, а из-за быстрого роста устройств выходящих в сеть, они начинают заканчиваться. Длина IPv6 адресов больше, а значит и количество доступных адресов в миллиарды раз больше — (2 16 ) 8 .
Основные преимущества IPv6 над IPv4:
- большее количество адресов;
- более эффективная маршрутизация пакетов в сети;
- более эффективная обработка пакетов данных;
- поддержка многоадресной передачи данных.
Подключение IPv6 в панели управления 1cloud
Для подключения виртуального сервера к общей публичной сети с IPv6 откройте настройки вашего сервера, раздел Сети, и нажмите Подключить. Сохраните изменения. Изменение конфигурации займет несколько секунд.
В результате на вашем виртуальном сервере появится еще один сетевой адаптер, который необходимо самостоятельно настроить.
Настройка сетевого интерфейса
Выведете список всех доступных интерфейсов, чтобы определить имя требующего конфигурацию:
Отобразится следующий список:
В настройках сети в панели управления найдите поле MAC со значением параметра HWaddr из вывода списка сетевых интерфейсов. В нашем примере настройки требует адаптер с именем ens192.
Для настройки сетевого адаптера с помощью текстового редактора, например vi, откройте файл /etc/network/interfaces:
Добавьте следующие строки, заменив соответствующие поля на свои значения:
auto
iface inet6 static
pre-up modprobe ipv6
address
netmask 64
gateway
auto ens192
iface ens192 inet6 static
pre-up modprobe ipv6
address aaaa:aaaa:aaaa:a::a
netmask 64
gateway aaaa:aaaa:aaaa:a::1
Далее с помощью текстового редактора, например vi, откройте файл /etc/resolv.conf:
Добавьте строку, указав выданный вам IPv6 адрес:
После сохранения изменений и выхода из текстового редактора, необходимо перезапустить сетевую службу, где ens192 — это имя адаптера, которое вы запомнили:
ifdown ens192 && ifup ens192
Для проверки корректности настроек выполните ping6 до шлюза (gateway) и до сайта Google:
Настройка IPv6 в ОС Linux Debian v7.XX, Ubuntu v14.XX, CentOS v6.XX и FreeBSD v10.XX
Изложенный ниже материал не претендует на эксклюзивность. Однако мне пришлось собирать его по крупицам из разных источников, что-то проверяя экспериментально. После этого родилась идея систематизировать полученные знания и опыт, изложив все в одной заметке.
Linux Debian v7.XX, Ubuntu v14.XX
CentOS v6.XX
FreeBSD v10.XX
После внедрения поддержки IPv6, на хостинговой площадке компании в которой я работаю, у нас возникла необходимость автоматизировать настройку VDS соответствующим образом. Необходимо оговорится, что речь идет не о каком-либо туннелировании, а полноценной поддержке. Т.е. сетевая инфраструктура в дата-центре обеспечивает коммутацию и маршрутизацию IPv6, имеются соответствующие стыки по BGPv6 с магистральными провайдерами Internet.
Адреса назначаются и прописываются в настройках ОС статично, т.е. функционал автоматического конфигурирования IPv6 не задействуется. Это связано с особенностями учета адресного пространства и обеспечения безопасности. Задача осложняется тем, что адресов IPv4 и IPv6 у VDS может быть сразу несколько.
Linux Debian v7.XX, Ubuntu v14.XX
В достаточно свежих дистрибутивах ОС Linux уже присутствует полноценная поддержка IPv6. Поэтому доустанавливать что-либо вручную необходимости нет.
Рассмотрим пример настройки.
«/etc/network/interfaces»
Тут следует обратить внимание на два момента. Во-первых, все адреса IPv6 назначаются непосредственно на сам сетевой интерфейс: в отличие от IPv4 нет необходимости создавать виртуальные адаптеры типа «eth0:X». Во-вторых, шлюз по умолчанию для IPv6 указывается один раз для любого из адресов. Действовать он будет для всех.
Результат настроек в выводе команды «ifconfig»:
Базовую диагностику можно выполнить с помощью команд «ping6 -n -c 4 ipv6.google.com» и «traceroute -n -6 -I ipv6.google.com». Проверить MAC-адреса соседей: «ip -6 neighbor show». Изучить таблицу маршрутизации: «route -n6» или «ip -6 route show». Выяснить, какой из адресов IPv6 используется системой по умолчанию для исходящих подключений: «ip -6 route get 2a00:1450:4013:c01::65».
CentOS v6.XX
Настройка CentOS замысловатее из-за того, что опций несколько больше, и они раскиданы по нескольким файлам.
«/etc/sysconfig/network»
В целом картина аналогична Debian. Виртуальные сетевые интерфейсы «eth0:X» необходимы только для IPv4. Опции «NETWORKING_IPV6» и «IPV6INIT» включают поддержку IPv6. В «IPV6_DEFAULTGW» указываем шлюз по умолчанию. Первый адрес IPv6 назначается в «IPV6ADDR», все остальные перечисляются в «IPV6ADDR_SECONDARIES».
Вывод команды «ifconfig» аналогичен Debian:
FreeBSD v10.XX
В ОС FreeBSD уже также есть все необходимое для поддержки IPv6.
Рассмотрим пример настройки.
» /etc/rc.conf»
Основной адрес IPv6 указывается в опции «ifconfig_xn0_ipv6». Поскольку в FreeBSD механизм виртуальных сетевых интерфейсов для IPv4 не используется, то все дополнительные адреса, в том числе IPv6, перечисляются в «ifconfig_xn0_aliases».
Вывод команды «ifconfig» немного отличается от ОС Linux.
Инструмент для диагностики также немного другой: «ping6 -n -c 4 ipv6.google.com» и «traceroute6 -n ipv6.google.com». Проверить MAC-адреса соседей: «ndp -an». Изучить таблицу маршрутизации: «netstat -rn6». Выяснить, какой из адресов IPv6 используется системой по умолчанию для исходящих подключений: «route -nv6 get 2a00:1450:4013:c01::65».
В данном случае адресом по умолчанию является тот, что указан самым последним в выводе команды: «2a04:XXXX:1::12».
Настрой себе IPv6 в Debian и Ubuntu
Настрой себе 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 соединения нет.
Таким образом, Google решил включать IPv6 в DNS в масштабе отдельных провайдеров. Hurricane Electric относится как раз к таким провайдерам. Они предоставляют DNS сервер 2001:470:20::2, через который все домены сервисов Google резолвятся в том числе и в IPv6 адреса.
Можно сразу вписать в /etc/resolv.conf этот сервер, а можно поднять локальный кеширующий bind и немного выиграть в скорости.
Есть два способа настройки: можно резолвить через этот сервер только адреса 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»;
Проверяем:
# 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
Если нет локальной сети — то всё готово 🙂
Шаг 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
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
# 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 строк:
Теперь все компьютеры в локальной сети получат имена вида 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. В связи с появившимися копипастами напомнимаю, что перепечатка разрешена только с моего разрешения.
Ubuntu Wiki
IPv6 Introduction
Internet Protocol version 6 (IPv6) is the successor to the well known IPv4 protocol, commonly known as IP. Your Ubuntu system comes with all you will need to use IPv6. This section focuses on getting IPv6 properly configured and running.
In the early 1990s, growth of the Internet led to various problems with IPv4, including:
Running out of subnets. This was deferred by conversion to >
Running out of addresses. This was deferred by using RFC1918 private address space (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16) h >
IPv6 deals with these and many other issues:
128 bit address space, with a design goal of supporting 2 40 subnets organizing 2 50 hosts. While theoretically there are 340,282,366,920,938,463,463,374,607,431,768,211,456 addresses possible, this is unattainable in practice. IPv6 does offer multitudes of addresses per person, so we are unlikely to run out again.
There are also lots of other useful features of IPv6 such as:
- Address autoconfiguration (RFC2462)
- Anycast addresses (“one-out-of many”)
- Mandatory multicast addresses
- IPsec (IP security)
- Simplified header structure
- Mobile IP
- IPv6-to-IPv4 transition mechanisms
Background on IPv6 Addresses
There are different types of IPv6 addresses: Unicast, Anycast and Multicast.
Unicast addresses are the well known addresses. A packet sent to a unicast address arrives exactly at the interface belonging to the address.
Anycast addresses are syntactically indistinguishable from unicast addresses but they address a group of interfaces. The packet destined for an anycast address will arrive at the nearest (in router metric) interface. Anycast addresses may only be used by routers.
Note: The IPv4 broadcast address (usually xxx.xxx.xxx.255) is expressed by multicast addresses in IPv6.
Reading IPv6 Addresses
The full form is represented as 8 hexquad parcels of 16 bits each written in lower case hexadecimal, separated by colons (:). For example 2001:0db8:382b:23c1:aa49:4592:4efe:9982.
Often an address will have long substrings of all zeros; the longest and first run of all zero hexquads is abbreviated as a double colon (“::”). Since :: is variable length, it can only be used once per address. Leading “0”s are also omitted, up to three per hexquad. For example, fe80::1 is the canonical form of fe80:0000:0000:0000:0000:0000:0000:0001 and 2001:db8:b:23c1:49:4592:efe:9982 is the canonical form of 2001:0db8:000b:23c1:0049:4592:0efe:9982.
A third form is to write the last 32 bits in the well known dotted decimal IPv4 style. For example 2002::10.0.0.1 corresponds to the (hexadecimal) long representation 2002:0000:0000:0000:0000:0000:0a00:0001 with canonical form 2002::a00:1.
By now the reader should be able to understand the following:
fe80::225:adff:fe2c:af17 of interface eth0 is an autoconfigured link-local address. It is generated as an IEEE EUI-64 style >
For further information on the structure of IPv6 addresses see RFC3513.
Special IPv6 address ranges
Address ranges are specified using a prefix. This is similar to the IPv4 concept of a network prefix and netmask, but in IPv6 we always use C >
Used for default route and router solicitations. cf. 0.0.0.0 in IPv4
The lower 32 bits are the IPv4 address. Used in socket API’s to represent IPv4 hosts.
Unroutable autoconfigured addresses used on a LAN, e.g. for DHCPv6
Addresses used only within an autonomous system, unroutable globally. Cf. RFC 1918 addresses such as used in NAT.
All global unicast addresses currently begin with 2.
Some IPv6 address prefixes have been deprecated, and should no longer be used.
96 zero bits followed by 32 IPv4 bits. Also called “IPv4 compatible IPv6 address”. Replaced by mapped addresses.
Replaced by Unique Local Addresses