Настрой себе IPv6 в Debian и Ubuntu
Настраивать будем 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
Устанавливаем демона для 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.
Теперь можно использовать имена 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. В связи с появившимися копипастами напомнимаю, что перепечатка разрешена только с моего разрешения.
IPv6 Tunnel via Own Linux (IPv6-connected) Server
Unfortunately, there’s a lot of IPv6 tunnel brokers, and their documentation often clutters the search results for how to setup your own IPv6 tunnel. I have a Linux server with IPv6 connectivity. I want to make my own tunnel (very securely, via SSH SOCKS or similar, if possible) for my Windows 7 x64 computer to utilize for all IPv6 purposes, while using my own ISP-given IPv4 address for everything else. How would one go about setting this up? This is very similar to what I posted here, but I would very much appreciate either a Windows-level or Chrome-level solution.
1 Answer 1
Creating a 6in4 gateway:
Note (Feb 25, 2015): I’m reviewing these instructions, and I think that you could skip the addr add and route del steps, but I’m not entirely sure yet. Will need to test.
# ip tunnel add tun6in4 mode sit local remote any # ip link set tun6in4 up
# ip addr add 2001:db8:e3af:666::1/64 dev tun6in4
# ip route del 2001:db8:e3af:666::/64 dev tun6in4 # ip route add 2001:db8:e3af:666::/64 via ::78.260.211.195 dev tun6in4
# echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
Client-side
On your PC, follow the standard 6in4 tunnel instructions, assigning yourself an address from the same subnet as above.
C:\> netsh netsh> int ipv6 netsh interface ipv6> add v6v4tunnel Myserver
netsh interface ipv6> add addr Myserver 2001:db8:e3af:666::2
netsh interface ipv6> add route ::/0 Myserver netsh interface ipv6> show route
netsh interface ipv6> add route 2001:db8:e3af:666::/64 eth0 pub=yes netsh interface ipv6> set route ::/0 Myserver pub=yes netsh interface ipv6> show route netsh interface ipv6> set interface eth0 forward=enable advertise=enable netsh interface ipv6> show interface eth0
Securing only the IPv6 tunnel does not make sense, as 1) the traffic between your gateway and the destination will be public anyway, 2) you never know whether a connection is going to be plain IPv4 or «secured» IPv6.
However, you can try to set up IPsec between the two computers to secure the 6in4 traffic, or create a proper VPN such as OpenVPN or L2TP/IPsec.