(подборка)
Где-то с 2015 года IPv6 включен в Linux по умолчанию.
В древних версиях Linux можно пользоваться утилитой ifconfig (см. ниже, там где BSD), а в современных есть замечательная утилита с легко запоминающимся именем ip, теперь она входит в состав дистрибутивов. Вот как ей пользоваться: на всякий случай cначала нужно проверить, включен ли IPv6 протокол в /etc/sysctl.conf
, то есть убедиться, что если там есть нижеприведённые строки, то их значения должны быть установлены в 0. Если их нет - то ничего делать не нужно. Изменения, внесенные в данный файл, будут применены только после перезагрузки.
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
Временно, а точнее “налету” можно менять эти параметры при помощи команды sysctl с теми же параметрами, только не нужно делать пробелы между параметром, знаком присвоения и значением.
Включить или выключить интерфейс (именно интерфейс, а не протокол), если это необходимо
ip link set dev <interface_name> up
ip link set dev <interface_name> down
Посмотреть конфигурации адресов на всех интерфейсах:
ip -6 addr show
На экране будет что-то такое (в системе с двумя сетевыми интерфейсами плюс loopback), и видно, что eno1 уже сконфигурирован для работы по IPv6, a eno2 - нет
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 2001:db8::1:72/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::8611:3eff:fe32:b118/64 scope link
valid_lft forever preferred_lft forever
3: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 fe80::d3b2:3cad:fe32:a28b/64 scope link
valid_lft forever preferred_lft forever
Или на конкретном интерфейсе (не забудьте подставить фактическое имя интерфейса)
ip -6 addr show dev <interface_name>
Пример:
ip -6 addr show dev eno2
3: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 fe80::d3b2:3cad:fe32:a28b/64 scope link
valid_lft forever preferred_lft forever
Наличие local-link адресов на интерфейсе является хорошим признаком того, что IPv6 активен и ждёт ваших команд.
В данном случае у интерфейса есть link-local адрес, но для работы в интернете он не сконфигурирован или по какой-то причине не получил автоматические настройки. Цифра 3
- это порядковый номер интерфейса в выдаче предыдущей команды
Задать адрес для интерфейса:
ip -6 addr add <ipv6_addr/preffix> dev <interface_name>
Про шлюз по умолчанию: его задавать не нужно, все роутеры умеют генерировать RA. В таблице маршрутов это выглядит так:
ip -6 route show
::1 dev lo proto kernel metric 256 pref medium
2001:db8::1:2:3/64 dev eno1 proto kernel metric 256 pref medium
fe80::/64 dev eno2 proto kernel metric 256 pref medium
fe80::/64 dev eno1 proto kernel metric 256 pref medium
default via fe80::5aac:78ff:febe:fe11 dev eno1 proto ra metric 1024 expires 1724sec hoplimit 64 pref medium
proto ra
в последней строке как раз означает, что адрес роутера взят из RA.
Но если очень хочется задать вручную - то поможет команда
ip -6 route add default via <gw_ipv6_address>
!!! в ней нужно использовать link-local адрес шлюза !!! (так как к “внешнему” адресу ваше устройство не знает пути)
А если вы хотите использовать в этой команде адрес, видимый в интернете, то нужно сначала прописать маршрут для него для интерфейса, который смотрит на роутер
route add -inet6 2001:db8:CCCC::1 -iface <interface_to_router>
Но лучше так не делать и пользоваться RA, так как это современнее, при смене роутера (или провайдера) шлюз на всех устройствах обновится автоматически, и можно включить в сеть сразу несколько маршрутизаторов для избыточности/резервирования
Удалить адрес с интерфейса:
ip -6 addr del <ipv6_addr/preffix> dev <interface_name>
Посмотреть таблицу с маршрутами
ip -6 route show [dev <interface_name> ]
Добавить маршрут
ip -6 route add <ipv6_addr/preffix> via <interface_name>
Удалить маршрут
ip -6 route del <ipv6_addr/preffix>
Для применения настроек при перезагрузке их нужно добавить в тот же файл, где хранятс настройки для IPv4 - то есть в файл /etc/network/interfaces
вносится следующее:
iface en5s0 inet6 static
autoconf 0
accept_ra 1
address 2001:db8:0:a::1024
netmask 64
Вторая строка запрещает автоматическую генерацию адреса в формате eui-64, то есть запрещает SLAAC,
третья строка разрешает принимать Route Advertisements при значении 1
, в противном случае нужно прописывать шлюз
вручную, то есть добавить строку
gateway 2001:db8:0:a::ffff
DNS-серверы прописываются точно так же, как и в IPv4, а если их адреса получаюся из RA, то прописывать их не нужно. Разумеется, enp5s0 следует заменить на имя своего интерфейса. Если хотите использовать SLAAC (например, на рабочей станции) то в файл нужно добавить такое:
iface en5s0 inet6 auto
accept_ra 1
Поскольку mac-адрес используется в SLAAC, то это позволяет отслеживать появление конкретного хоста в сети. В IPv6 есть встроенное средство защиты от такой слежки, называемое Privacy Extension. Оно включено автоматически, принудительно можно включить добавлением в файл /etc/interfaces строки privext 2
для конкретного интерфейса. Тогда протокол сгенерирует ещё несколько случайных адресов для данного интерфейса и будет менять их в случайном порядке при установлении исходящих соединений.
Под BSD работает команда
ifconfig <if_name> inet6 <address> prefixlen <len>
например,
ifconfig em0 inet6 2001:db8:a:b::2004:1 prefixlen 64
Правда, очень часто встречается синтаксис
ifconfig <if_name> inet6 alias <address> prefixlen <len>
но и без alias
все работает.
В случае, если вы не хотите слушать RA, то маршрут по умолчанию добавляется командой
route add -inet6 default <ipv6_address_of_router>
Просмотреть конфигурацию можно командой
ifconfig <if_name>
а таблицу маршрутизации – командами
route show
или
route -n show -inet6
На BSD, во всяком случае, работают обе. Кстати, netstat -rn тоже работает.
В постоянную конфигурацию это дело включается аналогично IPv4. Так, в OpenBSD для интерфейса xl0
в «родной» файл /etc/hostname.xl0
добавляется такая строка:
inet6 <ipv6_address/preffix>
шлюз по умолчанию добавляется отдельной строкой в файл /etc/mygate
соответственно. Во FreeBSD это добавляется в /etc/rc.conf
.
Кстати, опять-таки в половине примеров присутствует слово alias
….
У Cisco процесс выглядит так: на интерфейсе задаем адрес
ter mon
conf t
ipv6 addr xxxx:yyyy:zzzz::5 /48
ipv6 enable
Последняя команда автоматически создает link-local
адреса.
И, разумеется, при использовании масок /64 можно задавать eiu-адреса для Ethernet-интерфейсов. Команда для интерфейса при этом выглядит так:
ipv6 addr xxxx:yyyy:zzzz::/64 eiu-64
При этом роутер честно инвертирует 7й бит mac-адреса, хотя практически никто этого не делает.
Также заметил, что если хочешь задать eiu-64 адрес (то есть префикс будет строго 64 бит), то на конце префикса всё равно нужно ставить ::
– иначе получишь сообщение об ошибке в синтаксисе. Если адрес имеет вид 2007:1234:4321:9876, то команда будет выглядеть так:
ipv6 addr 2007:1234:4321:9876::/64 eiu-64
Вот еще: sh run int <name>
покажет эти адреса (точнее – строки), sh int
и sh ip int
– не покажет, а sh ipv6 int
– покажет.
Ну, и для включения процесса роутинга 6й версии нужно дать глобальную команду
ipv6 unicast-routing
… после чего можно включать отладчик deb ipv6 packet
и любоваться.
Разумеется, тут все посложнее по сравнению с Windows.
Сначала редактируем /etc/sysctl.conf
Меняем только один параметр, точнее устанавливаем его равным 1. В «родном» файле также есть комментарий, что форвардинг должен быть отключен. Вот модифицируемая строка, она должна выглядеть так:
net.inet6.ip6.accept_rtadv=1 # 1=Permit IPv6 autoconf (forwarding must be 0)
Предположим, что у нас сетевой адаптер именуется em0
, тогда редактируем файл /etc/hostname.em0
помещаем в него одну-единственную строку
rtsol
(это — для «чистой» IPv6 конфигурации, если не требуется поддержка IPv4)
И — перезагружаем машину. Можно обойтись и без перезагрузки, но у нас была тестовая конфигурация.
Что было сделано?
— в конфигурационном файле было разрешено принимать router advertisement (RA) —в конфигурации интерфейса разрешено использовать router solicitation (RS)
То есть машина сможет получать и использовать для генерации собственного IPv6-адреса префикс (префиксы) от роутера и адрес шлюза по умолчанию.
Проверяем: пусть наш роутер анонсирует 2001:0db8::/64
Смотрим, что стало с нашим интерфейсом:
ifconfig em0
em0: flags=8843 mtu 1500
lladdr d0:27:88:3e:22:15
priority: 0
groups: egress
media: Ethernet autoselect (100baseTX full-duplex)
status: active
inet6 fe80::d227:88ff:fe3e:2215%em0 prefixlen 64 scopeid 0x1
inet6 2001:0db8:0:0:d227:88ff:fe3e:2215 prefixlen 64 autoconf pltime 604723 vltime 2591923
Видим: «глобальный» IPv6-адрес получен, link-local также есть, и оба они построены в соответствии с EUI-64.
Смотрим таблицу роутинга:
(часть информации опущена, самое важное здесь — в строке, помеченной звездочками: это дефолтный маршрут)
route show routing tables
Internet6:
Destination Gateway Flags Refs Use Mtu Prio Iface
::/104 localhost UGRS 0 0 - 8 lo0
::/96 localhost UGRS 0 0 - 8 lo0
** default fe80::222:91ff:fe9 UG 0 3 - 4 re0 **
localhost localhost UH 14 0 33160 4 lo0
::127.0.0.0/104 localhost UGRS 0 0 - 8 lo0
::224.0.0.0/100 localhost UGRS 0 0 - 8 lo0
::255.0.0.0/104 localhost UGRS 0 0 - 8 lo0
::ffff:0.0.0.0/96 localhost UGRS 0 0 - 8 lo0
2002::/24 localhost UGRS 0 0 - 8 lo0
2002:7f00::/24 localhost UGRS 0 0 - 8 lo0
2002:e000::/20 localhost UGRS 0 0 - 8 lo0
2002:ff00::/24 localhost UGRS 0 0 - 8 lo0
2001:0db8:0:0::/64 link#1 UC 0 0 - 4 re0
2001:0db8:0:0:d227 d0:27:88:3e:20:65 UHL 0 0 - 4 lo0
Проверяем:
ping6 ipv6.google.com
PING6 (56=40+8+8 bytes)
2001:0db8:0:0:d227:88ff:fe3e:2215
--> 2a00:1450:4008:c00::93
16 bytes from 2a00:1450:4008:c00::93, icmp_seq=0 hlim=57 time=43.746 ms
16 bytes from 2a00:1450:4008:c00::93, icmp_seq=1 hlim=57 time=43.991 ms
16 bytes from 2a00:1450:4008:c00::93, icmp_seq=2 hlim=57 time=43.764 ms
16 bytes from 2a00:1450:4008:c00::93, icmp_seq=3 hlim=57 time=43.533 ms
16 bytes from 2a00:1450:4008:c00::93, icmp_seq=4 hlim=57 time=43.734 ms
^C
-- ipv6.l.google.com ping6 statistics --
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 43.533 /43.754 /43.991 /0.145 ms
Отвечает? Тогда ура, работает!
Проверить, доступен ли IPv6 на вашей Linux-машине можно командойip a
Если на экране появилась хоть одна строчка, начинающаяся с inet6 - то всё в порядке.