Адреса IPv4 заканчиваются. По состоянию на 30 ноября в мире их осталось 2.73% и это количество закончится через 3 месяца. Пора готовиться к переходу на IPv6. Мои мысли по этому вопросу вы можете почитать в статье «IPv6: что год грядущий нам готовит».

Крайне маловероятно, что ваш провайдер предлагает подключение на адресах IPv6. Да и ресурсов IPv6 достаточно мало. Начать эксперименты можно, построив бесплатный туннель на брокера туннелей IPv6 Hurricane Electric. В этой схеме вы будете ходить на ресурсы IPv4 напрямую, а на IPv6 — через туннель.

Минус в том, что туннель строится с заранее описанного в заявке адреса, и если он динамический, то для построения туннеля вам придётся каждый раз обновлять конфигурацию на HE. К счастью, это можно делать автоматически перед запуском туннеля, но нужно писать скрипт.

Туннель может работать через NAT, производимый Airport Express/Extreme/Time Capsule, и, возможно другими маршрутизаторами.

Для начала нужно зарегистрироваться на Hurricane Electic IPv6 Tunnel Broker.

После регистрации создаём туннель («Create Regular Tunnel»):

IPv6 Mac OS X

В поле «IPv4 endpoint (your side of the tunnel)» нужно указать внешний адрес, с которого будет устанавливаться туннель. Например, на внешнем интерфейсе Time Capsule у меня стоит постоянный адрес 94.45.55.146, а Mac, с которого я строю туннель, имеет адрес 192.168.98.10. В этом поле нужно указать 94.45.55.146, а не 192.168.98.10.

Для подсказки в поле «You are viewing from IP» показывается ваш внешний адрес. У меня там стоит 2001:470:1f14:fee::2, так как я пишу статью c уже настроенным IPv6.

Ещё из списка «Which Server Is Closest to you» нужно выбрать сервер, к которому время отклика лучше. Географическая близость не при чём. Для примера, если вы находитесь в Киеве, то необязательно сервер из Киева будет ближе сервера из Франкфурта. Ваш провайдер может иметь каналы в Германию, но не иметь пиринга с UA-IX. Позапускайте ping на указанные сервера и выберите лучший для вас.

Я получил такой туннель:

IPv6 Mac OS X

Для получения конфигурации из выпадающего списка «Example IPv6 Tunnel Configurations by OS» выберите NetBSD/Mac OS X (если вы дочитали до этого момента, то вы и так знаете, что Mac OS X построена на базе BSD):

IPv6 Mac OS X

Я использую слегка модифицированную версию (подставьте ваши значения из конфигурации туннеля):

$ sudo ifconfig gif0 tunnel Client_IPv4_address Server_IPv4_address
$ sudo ifconfig gif0 inet6 Client_IPv6_address alias
$ sudo ifconfig gif0 inet6 Client_IPv6_address Server_IPv6_address prefixlen /64
$ sudo route -n add -inet6 default Server_IPv6_address

Эта конфигурация рассчитана на прямое подключение, когда на интерфейсе вашего компьютера прописан внешний IP-адрес, который вы указали при создании туннеля. В моём случае ноутбук ходит через NAT и на интерфейсе стоит адрес 192.168.98.10. Поэтому я изменил первую команду. Моя конфигурация такова:

$ sudo ifconfig gif0 tunnel 192.168.98.10 216.66.84.46
$ sudo ifconfig gif0 inet6 2001:470:1f14:fee::2 alias
$ sudo ifconfig gif0 inet6 2001:470:1f14:fee::2 2001:470:1f14:fee::1 prefixlen /64
$ sudo route -n add -inet6 default 2001:470:1f14:fee::1

Если всё прошло без ошибок, то интерфейс gif0 у вас будет в состоянии UP:

$ ifconfig gif0
gif0: flags=8051&ltUP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
	tunnel inet 192.168.98.10 --> 216.66.84.46
	inet6 fe80::225:bcff:fedc:ddae%gif0 prefixlen 64 scopeid 0x2
	inet6 2001:470:1f14:fee::2 --> 2001:470:1f14:fee::1 prefixlen 128

Дефолтовый маршрут IPv6 будет идти через gif0:

$ netstat -rn -f inet6
default	2001:470:1f14:fee::1            UGSc           gif0
</pre>

Обратите внимание на то, что два стека (IPv4 и IPv6) работают независимо. К ресурсам IPv4 вы будете обращаться через IPv4 default route, а к ресурсам IPv6 — через IPv6 default route. При поднятом туннеле IPv6 вы будете полноценно работать со всеми привычными сайтами и протоколами.

Проверяем (не забудьте, что нужно использовать ping6/traceroute6, а не ping/tracecoute):

$ ping6 ipv6.google.com
PING6(56=40+8+8 bytes) 2001:470:1f14:fee::2 --> 2a00:1450:8007::68
16 bytes from 2a00:1450:8007::68, icmp_seq=0 hlim=57 time=53.959 ms
16 bytes from 2a00:1450:8007::68, icmp_seq=1 hlim=57 time=53.507 ms

Трасса:

$ traceroute6 ipv6.google.com
traceroute6 to ipv6.l.google.com (2a00:1450:8007::63) from 2001:470:1f14:fee::2, 64 hops max, 12 byte packets
 1  ctrld-2.tunnel.tserv11.ams1.ipv6.he.net  51.220 ms  48.980 ms  48.551 ms
 2  gige-g2-20.core1.ams1.he.net  42.653 ms  43.184 ms  50.666 ms
 3  pr61.ams04.net.google.com  43.669 ms  45.181 ms  77.431 ms
 4  2001:4860::1:0:8  44.318 ms  50.518 ms  43.950 ms
 5  2001:4860::1:0:11  113.400 ms
    2001:4860::1:0:10  57.398 ms  58.136 ms
 6  2001:4860::2:0:48d  56.788 ms
    2001:4860::2:0:48c  51.554 ms
    2001:4860::2:0:48d  53.205 ms
 7  2001:4860:0:1::c7  57.076 ms  51.348 ms
    2001:4860:0:1::c9  59.842 ms
 8  2a00:1450:8007::63  51.139 ms  51.923 ms  51.441 ms

Для вас может стать сюрпризом, что при доступе через IPv4 DNS не всегда выдают ответы по адресам IPv6. Например, если запросить Google IPv4 DNS о записи AAAA для google.com, то вы получите «No AAAA»:

$ dig @8.8.8.8 google.com aaaa
;; AUTHORITY SECTION:
google.com.		600	IN	SOA	ns1.google.com. dns-admin.google.com. 1435074 7200 1800 1209600 300

А если то же самое запросить через IPv6, то ответ будет получен:

$ dig @2001:470:20::2 google.com aaaa
;; ANSWER SECTION:
google.com.		300	IN	AAAA	2a00:1450:8005::68

Это логично, так как популярные операционные системы могут запрашивать запись AAAA даже при отсутствии подключения IPv6 и, получив правильный ответ, не смогут подсоединится к ресурсу. Доказать предметно я не могу, нужно исследовать вопрос, но факт есть факт. Можно почитать статью "Улучшаем жизнь пользователей с IPv6 и SCTP", там есть информация к размышлению.

Поэтому для завершения настроек нужно сконфигурировать резолвинг через DNS-сервер IPv6, который указан в информации по туннелю.

$ sudo vim /etc/resolv.conf
nameserver 2001:470:20::2
# nameserver 8.8.8.8

Это не совсем правильный метод. Во-первых при любом изменении сетевой конфигурации resolv.conf перетрётся и там снова будет DNS, указанный в настройках через GUI или же адрес, полученный по DHCP. А во-вторых при опускании туннеля IPv6 система будет использовать указанный адрес, через IPv4 он будет недоступен, и вы окажетесь без Интернет. Поэтому помните об этой особенности и при необходимости подправьте resolv.conf.

Кстати, мой блог The Apple Geek работает и на IPv6:

$ traceroute6 theapplegeek.ru
traceroute6 to theapplegeek.ru (2001:470:1f08:1120::2) from 2001:470:1f14:fee::2, 64 hops max, 12 byte packets
 1  ctrld-2.tunnel.tserv11.ams1.ipv6.he.net  51.299 ms  49.283 ms  49.060 ms
 2  gige-g2-20.core1.ams1.he.net  42.792 ms  44.847 ms  42.974 ms
 3  10gigabitethernet1-4.core1.lon1.he.net  50.552 ms  51.724 ms  50.053 ms
 4  gige-gbge0.tserv5.lon1.ipv6.he.net  55.614 ms  55.965 ms  57.411 ms
 5  ctrld-1-pt.tunnel.tserv5.lon1.ipv6.he.net  50.898 ms  56.757 ms  51.128 ms

Пока тяжело назвать это стабильным решением, за сутки туннель на мой сервер один раз падал и пришлось его подымать вручную. Но «дорогу осилит идущий».

Полезные ресурсы

Продолжить изучение IPv6 можно например, чтением «IPv6 Essentials». Теперь вы можете испытывать IPv6 на практике, а не изучать чистую теорию.

Узнать свой IPv6-адрес можно на сайте WhatIsMyIPv6.net.

Если вы зайдёте на сайт Kame.net через IPv6, то черепашка затанцует.

Посмотреть текущее состояние IPv6 по миру можно в отчёте «Global IPv6 Deployment Progress Report», который поддерживается Hurricane Electric. В нём приводится списки популярных сайтов, поддерживающих IPv6. Интересно то, что в TOP50 присутствует единственный домен в зоне .ru, и это торрент-трекер ipv6.nnm-club.ru.

В заключение

Я показал, как строить туннель вручную командами в терминале для случая постоянного IP-адреса. Автоматический старт рассмотрю в отдельной статье.

Если у вас динамический адрес, то перед подключением вам нужно зайти в настройки туннеля и поменять клиентский адрес:

IPv6 Mac OS X

Для определения внешнего адреса можно зайти на WhatIsMyIP.com или же, что гораздо удобнее, можно внести в .bashrc алиас myip:

$ vim .bashrc
alias myip="dig +short myip.opendns.com @resolver1.opendns.com"

$ myip
94.45.55.146

Для автоматизации изменения динамического адреса пригодится информация:

Please use the format:
	https://ipv4.tunnelbroker.net/ipv4_end.php?ipv4b=$IPV4ADDR&pass=$MD5PASS&user_id=$USERID&tunnel_id=$GTUNID

WHERE:
$IPV4ADDR = The new IPv4 Endpoint
set ipv4b='AUTO' if you want to set the variable to the requesting client's IP address.
set ipv4b='your_public_ipv4_address' if you want to manually provide the address.
$MD5PASS = The MD5 Hash of your password
Try echo -n 'yourpassword' | md5sum if you need to produce the MD5 Hash of your password
$USERID = The UserID from the main page of the tunnelbroker (not your username)
$GTUNID = The Global Tunnel ID from the tunnel_details page

Your IPv4 endpoint must be pingable. If you are blocking ICMP, please allow 66.220.2.74 through your firewall.

P.S. Кто там говорил про то, что я ударился в популизм в ущерб гиковости? ;-)