субота, 1 жовтня 2011 р.

Заметки об использовании IPv6 в Ubuntu

В наш мир потихоньку приходит новый протокол IPv6, чтобы взять плюсы текущего IPv4 и убрать минусы последнего.

Чтобы узнать больше об этом страшном звере, купил замечательную книгу Найэла Ричарда Мэрфи и Дэвида Мэлоуна "IPv6. Администрирование сетей.". Настоятельно рекомендую вам купить эту недорогую книгу и начать осваивать новые веяния.

Как вы знаете, в мире IPv4 адрес принимает человеческий вид и выглядит примерно так 81.20.36.231 или 192.168.3.1. Естественно компьютеры и сетевое оборудование оперируют адресом в бинарном виде с помощью 0 и 1.

Спасители IPv4.

IPv4 умер бы давно из-за того, что адресное пространство его исчерпалось бы. Так как адреса IPv4 имеют длину 32 бита, то 2^32 = 4294967296 или ~4 млрд. штук. Часть этих адресов зарезервирована, часть была неэффективно распределена в начале на заре Интернета. Спасти от смерти помогли две технологии: NAT и CIDR.

NAT (Network Address Translation) - это когда вы не имеете своего IPv4 адреса в Интернете называемого внешним/белым, а используете IPv4 адрес из специальных диапазонов, таких как 192.168.0.0-192.168.255.255, 172.16.0.0-172.31.255.255, 10.0.0.0-20.255.255.255. И в вашей сети есть устройство, у которого внешний/белый IPv4 адрес, благодаря которому вы и получаете доступ в Интернет.

Минусом NAT, а кто-то посчитает преимуществом, можно считать сложность создания входящий соединений из Интернета в частную сеть. Наивно считается, что NAT помимо основой задачи по экономии внешних IPv4 адресов, заодно мимоходом защищает тех, кто спрятан за ним. Из-за NAT нарушается принцип Интернета точка-точка, когда один хост может напрямую общаться с другим хостом. NAT - это полезное и необходимое зло в мире IPv4.

CIDR (Classeless Inter-Domain Routing) спас от быстрой смерти IPv4, благодаря идеи, что граница между хостовой и сетевой частями адреса не обязана проходить на границе 8 бит (1 байт). Вспомните для примера сеть 192.168.1.0 - эта минимально возможная сеть, но в ней 255-2=253 адреса и если вы её используете не полностью, то адреса пропадают зря. Но чёрт с этой 192.168.0.0. Этот диапазон не используется в Интернете и роутеры его не маршрутизируют дальше и каждый может создавать свои локальные сети с этими диапазонами и делать с ними всё что угодно. НО без CIDR представьте что всем будут выдавать белые адреса IPv4 по 253 адреса и не важно сколько нужно реально. В CIDR граница между сетью и хостом может прийтись на любой бит, например можно разбить 192.168.1.0 на подсети: 192.168.1.0/26, 192.168.1.64/26, 192.168.1.128/26, 192.168.1.192/26. Когда пишут адрес_IPv4/число - это и есть CIDR нотация.

Адреса IPv6.

IPv6 при проектировании использовал плюсы IPv4 и был избавлен от недостатков IPv4. В IPv6 адрес занимает 128 бит и использует шестнадцатеричное представление с двоеточием через каждые 16 бит.
Например адрес IPv6 может выглядеть так:
2001:0DB8:5002:2019:1111:76FF:FEAC:E8A6

Шестнадцатеричная система выбрана из-за того, что 4 бита можно описать 1 шестнадцатеричной "цифрой". Например, :FEAC: - это 1111 1110 1010 1100. То есть FE - это 1 байт из 8 бит (1111 1110) и AC - другой байт (1010 1100).

Большая часть адресов IPv6 содержит повторяющиеся элементы, чаще всего нули. Существует способ скрыть их - элизия. Если элемент адресной группы начинается одним или более нулями, можно опустить её, но должна остаться хоть одна шестнадцатеричная "цифра". Например, :00AD: можно заменить на :AD:. Если есть одна или более групп нулей, то можно заменить знаком ::, но только один раз, иначе нельзя будет понять адрес однозначно.
Например,
адрес IPv6 fe80:0000:0000:0000:0000:0000:0000:001c можно заменить на fe80::001c или fe80::1c.
адрес IPv6 0237:0000:abcd:0000:0000:0000:0000:0010 можно заменить на 237:0:abcd::10 или 237::abcd:0:0:0:0:10

Идея CIDR нашла в IPv6 свою второю жизнь и используется везде, чтобы указывать сколько из 128 бит отводится на адрес сети, а сколько на адрес хоста.

Часть адресов IPv6 зарезервировали под различные нужды.

  • fe80::/10 - локальные канальные адреса. Аналог 169.254.0.0.16 в IPv4.
  • ff02::1 - групповой адрес всех узлов, так как аналога 255.255.255.255 из IPv4 в IPv6 нет.
  • fc00::/7 - уникальные локальные адреса (ULA)
  • ff00::/8 - мультикаст. Аналога 255.255.255.255 из IPv4 в IPv6 нет.
  • ::/128 - аналог 0.0.0.0 в IPv4
  • ::1/128 - аналог 127.0.0.1 в IPv4
  • 2001::/32 - технология Тередо
  • 2002::/16 - технология 6to4

Локальная канальная адресация.

Если в вашей сети нет маршрутизаторов и серверов, выдающих адреса, IPv6 способен автоконфигурироваться без человеческого вмешательства.

При старте системы, MAC адрес сетевой карты становится частью IPv6 адреса этой сетевой карты. Происходит это следующим способом: берётся MAC адрес, для примера 00:21:85:95:75:B5. Седьмой бит адреса устанавливается в единицу, то есть 00: из 0000 0000: становится 0000 0010: или в шестнадцатеричном виде 02:, а значит вся строка становится 02:21:85:95:75:B5. Затем строка делится пополам и между ними вставляется :FF:FE: и получается итоговое 02:21:85:FF:FE:95:75:B5, называемое идентификатором EUI-64. Затем операционная система в зарезервированном для локальных канальных адресах fe80:: формирует окончательный IPv6 адрес данной сетевой карты, в нашем примере fe80:0000:0000:0000:0221:85ff:fe95:75b5

В Ubuntu в Терминале вызовите
ifconfig -a
и при наличии нескольких сетевых карт, подметьте, что из-за EUI-64 локальный канальный адрес IPv6 действительно формируется из MAC сетевой карты.

eth0    Link encap:Ethernet HWaddr 00:21:85:95:75:b5
        inet6 addr: fe80::221:85ff:fe95:75b5/64 Scope:Link
eth1    Link encap:Ethernet HWaddr 00:0d:88:4f:b2:b6
        inet6 addr: fe80::20d:88ff:fe4f:b2b6/64 Scope:Link

Пакеты с локальными канальными адресами IPv6 НИКОГДА не проходят через маршрутизатор. Небольшой офис с одним коммутатором может воспользоваться локальной канальной адресацией для работы несложной сети. Локальные канальные адреса IPv6 в некотором смысле похожи на адреса 169.254.0.0/16 IPv4, но уникальны и неизменны.

Проверить доступность другого хоста можно командой ping6 с параметром -I, указывающий на используемую сетевую карту. Для примера можно попингать себя.

$ ping6 -I eth0 fe80::221:85ff:fe95:75b5
PING fe80::221:85ff:fe95:75b5(fe80::221:85ff:fe95:75b5) from fe80::221:85ff:fe95:75b5 eth0: 56 data bytes
64 bytes from fe80::221:85ff:fe95:75b5: icmp_seq=1 ttl=64 time=0.031 ms
...
64 bytes from fe80::221:85ff:fe95:75b5: icmp_seq=4 ttl=64 time=0.042 ms
--- fe80::221:85ff:fe95:75b5 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2997ms
rtt min/avg/max/mdev = 0.031/0.038/0.042/0.006 ms

Есть адрес ff02::1, который является локальным канальным адресом всех узлов, эдакий эквивалент не маршрутизируемого широковещательного адреса 255.255.255.255 в IPv4. Если пингать ping6 -I eth0 ff02::1, то вам начнут отвечать все компьютеры на канале

PING ff02::1(ff02::1) from fe80::221:85ff:fe95:75b5 eth0: 56 data bytes
64 bytes from fe80::221:85ff:fe95:75b5: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from fe80::a00:27ff:feb1:e53e: icmp_seq=1 ttl=64 time=1.71 ms (DUP!)
64 bytes from fe80::240:f4ff:fe98:6d4b: icmp_seq=1 ttl=64 time=2.07 ms (DUP!)
64 bytes from fe80::221:85ff:fe95:75b5: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from fe80::240:f4ff:fe98:6d4b: icmp_seq=2 ttl=64 time=0.316 ms (DUP!)
64 bytes from fe80::a00:27ff:feb1:e53e: icmp_seq=2 ttl=64 time=0.371 ms (DUP!)
^C
--- ff02::1 ping statistics ---
2 packets transmitted, 2 received, +4 duplicates, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.038/0.762/2.071/0.816 ms

Найти соседей по каналу можно используя команду $ ip -f inet6 neigh
2607:f0d0:2001::10 dev eth0 lladdr 00:21:85:95:75:b5 REACHABLE
fe80::240:f4ff:fe98:6d4b dev eth0 lladdr 00:40:f4:98:6d:4b STALE
fe80::221:85ff:fe95:75b5 dev eth0 lladdr 00:21:85:95:75:b5 STALE
.

Глобальные адреса.

Через файл настроек сети /etc/network/interfaces назначим себе и тестируемым машинам глобальный адрес, например

#IPV6 configuration
iface eth0 inet6 static
        address 2607:f0d0:2001:0000:0000:0000:0000:0010
        netmask 64

и убедимся, что адрес сетевой карте присвоен

eth0   Link encap:Ethernet HWaddr 00:21:85:95:75:b5
        inet6 addr: 2607:f0d0:2001::10/64 Scope:Общий

теперь можно пингать друг друга и быть достижимыми через маршрутизатор.

DNS IPv6.

Указывать 128 битный адрес IPv6 сложнее, чем адрес IPv4, и поэтому DNS в мире IPv6 имеет куда больше значение. Благодаря BIND, можно поучиться созданию и обслуживанию зоны с адресами IPv6. Создадим одну тестовую зону прямого отображения имя в IPv6 firma.net и две зоны обратного отображения IPv6 в имя.

Не забудьте указать в /etc/resolv.conf строку nameserver ::1. Адрес ::1 в IPv6, как 127.0.0.1 в IPv4 указывают на loopback.

Прямое отображение.
Создаём зону
zone "firma.net" {
        type master;
        file "/etc/bind/firma.net";
};

в файле /etc/bind/firma.net прописываем
$TTL 604800
firma.net. IN SOA ns.firma.net. root.firma.net. (
        8 ; Serial
        604800 ; Refresh
        86400 ; Retry
        2419200 ; Expire
        604800 ) ; Negative Cache TTL
firma.net. IN    NS    ns.firma.net.
ns.firma.net.    IN    AAAA    2607:f0d0:2001:0000:0000:0000:0000:0020
name.firma.net.    IN AAAA    2607:f0d0:2001:0000:0000:0000:0000:0010

Как видно в IPv6 используется АААА вместо А для связи имени с IPv6 адресом. Сложностей нет.

Обратное отображение.
Обратное отображение посложней. Исторически получилось, что желательно обслуживать две зоны обратного отображения: .ip6.arpa и .ip6.int.
Создаём зону .ip6.arpa.
zone "0.0.0.0.1.0.0.2.0.d.0.f.7.0.6.2.ip6.arpa" {
        type master;
        file "/etc/bind/firma.ip6.int";
};

Создаём зону .ip6.int.
zone "0.0.0.0.1.0.0.2.0.d.0.f.7.0.6.2.ip6.int" {
        type master;
        file "/etc/bind/firma.ip6.int";
};

Во-первых, для облегчения сопровождения две зоны указывают на один файл. Строка "0.0.0.0.1.0.0.2.0.d.0.f.7.0.6.2" - это обратно записанные шестнадцатеричные "цифры" адреса 2607:f0d0:2001:0000. То есть BIND заставляют искать имена по IPv6 адресу для всего диапазона 2607:f0d0:2001:0000:0000:0000:0000:0000.

В файле /etc/bind/firma.ip6.int прописываем

$TTL 604800
0.0.0.0.1.0.0.2.0.d.0.f.7.0.6.2.ip6.arpa. IN SOA ns.firma.net. root.firma.net. (
        13 ; Serial
        604800 ; Refresh
        86400 ; Retry
        2419200 ; Expire
        604800 ) ; Negative Cache TTL
0.0.0.0.1.0.0.2.0.d.0.f.7.0.6.2.ip6.arpa. IN NS ns.firma.net.
0.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.2.0.d.0.f.7.0.6.2.ip6.arpa. IN PTR ns.firma.net.
0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.2.0.d.0.f.7.0.6.2.ip6.arpa. IN PTR name.firma.net.

Чтобы не сойти с ума, переворачивая IPv6 адрес, и не ошибиться есть утилита sipcalc.

$ sipcalc -r 2607:f0d0:2001:0000:0000:0000:0000:0020
-[ipv6 : 2607:f0d0:2001:0000:0000:0000:0000:0020] - 0
[IPV6 DNS]
Reverse DNS (ip6.arpa) -
0.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.2.0.d.0.f.7.0.6.2.ip6.arpa.

Если всё сделано правильно, то можно пингать по имени, что гораздо удобнее.
$ ping6 -I eth0 name.firma.net
PING name.firma.net(name.firma.net) from 2607:f0d0:2001::20 eth0: 56 data bytes
64 bytes from name.firma.net: icmp_seq=1 ttl=64 time=0.426 ms
64 bytes from name.firma.net: icmp_seq=2 ttl=64 time=0.356 ms
^C
--- name.firma.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.356/0.391/0.426/0.035 ms

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments