Некоторые вещи непонятны нам не потому, что мы не можем их понять, а потому что они не входят в круг наших понятий.
© К. Прутков
Если верить Вики — ipv6 появился раньше, чем я научился соединять два компьютера в сеть, но за всё эти годы, несмотря на всё, нигде, никогда на практике я с ним не сталкивался.
Ну да, есть иногда на интерфейсах какие‑то странные длинные адреса, на какая от них польза и зачем они вообще — совершенно непонятно.
И вот в обсуждениях очередной статьи — очередное «никто почему‑то не хочет использовать ipv6» — так может быть, пора попробовать?
Сразу дисклеймер: тут на Хабре уже есть хорошая техническая статья именно по ipv6, лучше я точно не напишу, но зато напишу, так сказать, с бытовой точки зрения: что мне это может дать и зачем.
Но сначала — небольшое лирическое отсупление (см. про «круг понятий» — многим это наверняка после вуза ни в зуб не впилось. Но тут оно пригодится)
Что такое обычный, «традиционный» ip‑адрес, он же ipv4?
Это 4 байта, или лучше сказать, октета, которые традиционно записываются в виде 4 десятичных чисел, разделенных точками: 192.168.1.1, например.
Или в hex‑виде C0 A8 01 01 (но так не пишут).
В паре к адресу идет «маска подсети», например /24 — что означает «первые 24 бита неизменяемые, остальные можно менять».
В октете 8 бит, то есть 24 бита это ровно 3 октета, значит, в адресах подсети 192.168.1.0/24 первые 3 октета неизменны (192.168.1), а последний может принимать значения от 0 до FF, итого 256 значений.
Причем 0 и FF — адреса хостам давать нельзя, остается 254 адреса.
Технически никто вам не запрещает в своей локальной сети использовать любые адреса и любые маски, хоть /13 или /2 — что дает намного большее количество возможных адресов, всё будет работать, но когда вы попробуете выйти «во внешние сети» — а фиг, там уже всё поделено, правила расписаны, сети нарезаны и выделены, и вот там — адресов на всех не хватает.
Вам разрешено делать свои «серые сети», адреса которых запрещены в глобальном интернете, либо придется выпрашивать у кого‑то доступную реальную подсеть, с глобальными адресами.
Выпрашивание дефицитного ресурса обычно стоит денег.
Для выхода из «серой» сети в глобальную придумали NAT — для исходящих он подменяет ваши внутренние адреса на адрес NAT‑шлюза, для входящих — подменяет обратно на запомненные внутренние.
В общем случае, без спроса, снаружи внутрь на конкретный заданный хост попасть нельзя — NAT просто не знает куда именно перенаправить пакет.
Особенно, если за одним NATом (сеть провайдера) стоит второй (локальный), а то и третий. Потому что адресов не хватает, Карл!
Но вот такой нехитрый костыль позволяет всему этому колхозу работать...
Так вот, для чего придумали ipv6 — в нем 128 бит, то есть целых 16 октетов. вместо 4!
А всего возможных адресов — 2^128, что, мягко говоря, много. Автоматически ресурс перестает быть дефицитным, и его можно раздавать мешками.
Минимальная рекомендумемая подсеть — /64, то есть остается еще 64 бита адресов только одному пользователю — бери, и ни в чем себе не отказывай! Не нужен больше NAT, всему можно назначить свой адрес, и не один, и менять его можно намного чаще чем носки...
Записывать 16 октетов десятичными цифрами негуманно, их стали записывать парами в hex:
2001:0123:dead:beef:0000:0000:0000:0001
А потом — пропускать лидирующие нули, и сокращать последовательности нулей:
2001:123:dead:beef::1 — это тот же самый адрес
Не забываем, что маска применяется к октетам, то есть маска подсети /56 — это 7 октетов, и в данном случае соответсвует (20)(01):(01)(23):(de)(ad):(be)..:....:....:....:...., или запишем так: 2001:123:dead:be00::/56
Что оставляет нам для экспериментов еще 128 — 56 = 72, 2^72 вариантов адресов.
Осталась мелочь: очередную подсеть, уже ipv6, тоже кто‑то должен вам выделить. Традиционно это должен делать провайдер, но традиционно же провайдер тоже не знает, «зачем ему ipv6?» и поэтому никому ничего не выдаёт.
Во всяком случае, из наблюдаемых местных провайдеров (6 проводных, 3 сотовых) ipv6-адрес выдал только МТС на мобильном.
Нет подсети ipv6 — вы не пользуетесь ipv6, а если вы все не пользуетесь — никто и не пользуется.
Но не всё так плохо. Во‑первых, сетевые интерфейсы уже автоматически получают свои ipv6 адреса из специальной подсети fe80::
ip addr
...
eth0 ...
....
inet6 fe80::3485:73ff:fe4f:bbbb/64 scope link
....
Они связаны с MAC‑адресами интерфейсов, не маршрутизируются наружу, но если на одном линке (сегменте сети) есть два интерфейса с подобными адресами — то можно с одного компьютера связаться с другим, чисто по вот этому адресу, указав еще дополнительно интерфейс, через который его искать:
A: eth0 fe80::3485:73ff:fe4f:bbbb/64
B: end0 fe80::a01:2d/64
A:
ping6 fe80::a01:2d/64%eth0
То есть, что‑то вроде «серой сети» на уровне сегмента сети, без сервера и DHCP.
Уже это можно использовать.
Во‑вторых, есть ULA‑адреса, fd00::/8, они применяются для настройки соединения через туннели.
Можно создать туннель, и присвоить ему такие адреса для обмена по ipv6, вместо или вместе с ipv4
И наконец, бывают «туннельные брокеры» — провайдеры подсетей ipv6, раздающие эти подсети через туннель.
Принцип примерно такой:
создается туннель между двумя ipv4 адресами (провайдера и наш)
поднимается связь по ipv6 через него
провайдер настраивает маршрутизацию выданной сети через туннель к нам
мы настраиваем маршрутизацию наружу по ipv6 через провайдера
раздаем адреса у себя локально.
Но, как обычно, есть нюанс: туннель к брокеру требует реального фиксированного IP, а у меня его как раз и нет.
Зато есть свой VDS, у которого есть реальный адрес. Его и буду использовать.
Процесс выбора брокера и регистрации на нем аккаунта пропустим: это можно найти в интернете.
Брокер выделяет подсеть, скажем, 2001:123:4567:5600::/56, дает свой IP 123.45.67.89, и два адреса для туннеля, 2001:11:ff::1 со своей стороны, и 2001:11:ff::2 для клиента.
Тип туннеля — GRE
Адрес моего сервера — пусть 89.23.45.22
Настраиваем на сервере:
ip tunnel add mytunnel mode gre remote 123.45.67.89 local 89.23.45.22 ttl 255
ip link set mytunnel up
ip -6 addr add 2001:11:ff::2/64 dev mytunnelПроверка соединения:
ping6 2001:11:ff::1если пинги пошли — ок, туннель установлен.
Добавляем маршрут в него и включаем форвардинг пакетов:
ip -6 route add default via 2001:11:ff::1
sysctl net.ipv6.conf.all.forwarding=1Теперь на сервере есть ipv6 и выданная подсеть, нужно настроить раздачу ее дальше, в удаленную локальную сеть.
Выдана подсеть /56 (7 октетов), ее можно поделить на 256 сетей /64 (8 октетов), и всё еще не нарушить рекомендации по выделению минимум /64 сетей.
А можно было поделить и на 2 сети /57 — необязательно же по октетам выравнивать? Ну да ладно.
Пусть подсеть 2001:123:4567:5600::/64 отвечает за тоннель к LAN, а 2001:123:4567:5601::/64 будет внутри LAN.
Тут потребуется еще один туннель, от шлюза в LAN к серверу (и есть разные варианты его создания, слово из трех букв).
Допустим, он называется tun0:
ip -6 addr add 2001:123:4567:5600::1/64 dev tun0На другой стороне, на шлюзе, соответственно, так:
ip -6 addr add 2001:123:4567:5600::2/64 dev tun0(а может, можно было использовать как раз туннельные ULA‑адреса? попробую потом)
Проверка с сервера:
ping6 2001:123:4567:5600::2Работает, настраиваем машруты на сервере:
ip -6 route add 2001:123:4567:5601::/64 via 2001:123:4567:5600::2И на шлюзе, не забывая включить форвардинг и там:
ip -6 route add default via 2001:123:4567:5600::1
sysctl net.ipv6.conf.all.forwarding=1Теперь соединения со шлюза к любому глобальному ipv6-адресу должны проходить через туннель на сервер, и через второй туннель к брокеру и далее.
Осталось последнее: раздать адреса в сети.
В случае ipv6 это делается не через обычный dhcp, а немного иначе:
apt install radvd
vim /etc/radvd.conf
interface end0 {
AdvSendAdvert on;
AdvManagedFlag off;
AdvOtherConfigFlag on;
prefix 2001:123:4567:5601::/64 {
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
RDNSS 2001:4860:4860::8888 2001:4860:4860::8844 {
AdvRDNSSLifetime 3600;
};
route ::/0 {
AdvRoutePreference medium;
AdvRouteLifetime 1800;
};
};
/etc/init.d/radvd restartТо есть, в сети, подключенной к интерфейсу end0, будут раздаваться адреса из заданной подсети, а вместе с ними машины получат адреса DNS‑серверов Google.
Теперь на компьютерах в локальной сети появляются реальные глобальные ipv6 адреса.
В общем цель достигнута, ipv6 работает, и к каждому устройству можно обратиться снаружи по его адресу.
(Можно было бы их и статически прописать, конечно)
Проверка: https://testmyconnection.net
А минусы какие? Скажем так, образно:
Вот представьте, что живете вы в типичном загородном дачном доме, с забором из профлиста. Внутри у вас хорошо, а что снаружи — не видно, да и снаружи не видно что внутри.
Наслушавшись продвинутых и осознанных — решаете забор убрать, чтобы не портил вид, чтобы цивилизация была.
Первые часы всё хорошо: чисто, красиво, забор глаза не мозолит, клумбы там у дома, газон подстрижен.
А потом замечаете прохожего, который решил, что ваша бензопила возле гаража ему нужнее, и решил ее позаимствовать — ну а что, вот же она лежит на виду!
Другой прохожий решил, что нести пакет с мусором до мусорного бака далеко, и положил рядом с вашим, всё равно же выбрасывать.
Третьего очень заинтересовали занавески в доме, он так заглядывает в окна, как будто хочет такие же купить.
В общем, ходют тут всякие!
А у вас и гараж не запирается, и решеток на окнах не было никогда, забор же был
Короче говоря, пришлось забор восстанавливать: запрещать на шлюзе все входящие соединения.
То есть, если будет надо — открыть конкретный порт на конкретном адресе можно, а оставлять так — больше нельзя, теперь тут проходной двор.
А наутро пришло письмо от провайдера сети: «в вашей сети завелась какая‑то кака, заблокируйте ее, или заблокируем мы сами!»
Оказалось — и правда, в одном из купленных в магазине девайсов в прошивке давно живет троян. Увидев ipv6 сеть — он обрадовался, и полез на свои сервера, ботнет строить. Ботнет довольно известный, Grandoreiro (интересно сколько таких девайсов в работе, и что еще кроме этого ботнета они умеют делать, сидя в юзерских сетях?).
Причем в отличии от ipv4 так просто, по ip‑адресу, его заблокировать нельзя, адреса у девайса динамические и меняются.
Пришлось изыскивать способы заблокировать исходящие по MAC‑адресу (и планировать вскрытие с перепрошивкой).
И вот что мне это всё напоминает:
Если кто не помнит — еще в конце позапрошлого века умные люди создали язык эсперанто (не программирования, а человеческий).
Типа, у традиционных языков масса недостатков, сотни правил, исключений, нечитаемые буквы (enought Renault) — давайте сделаем простой, понятный язык! Esperanto — la lingua por ni!
Энтузиасты создавали кружки, изучали язык, его пытались сделать рабочим языком ООН.
У него масса достоинств, в нем исправлены недостатки. Он не слишком сложен, интуитивно понятен, и так далее и тому подобное
Вот только при всех своих достоинствах, при наличии большой группы поддержки, официального признания — он не используется реально примерно нигде.
Потому что на плохих естественных языках вы всё‑таки можете разговаривать с бОльшим количеством людей, чем на хорошем языке, который почти никто не знает.
И тут то же самое: вроде хорошо, вроде интересно — но что это сейчас дает, кроме излишней прозрачности?
Какие практические преимущества с точки зрения использования?
Ну, могу сделать еще один ipv6-only сайт с картинкой и лозунгом «Давайте все!» — но те, кто его достанет через ipv6 — и так уже в ipv6, а остальным оно недоступно и не надо.
Несмотря на то, что действительно, могут все — и даже написал как.
Древние костыли NAT давно стали удобным инструментом.
ЗЫ: а теперь представьте, что всё это сделано не в собственной сети у себя дома, а в сети какой‑нибудь организации — снова «убрали забор», и только охранник в своей будке ждет предьявления пропусков...
