Настройка и использование IPv6 на сервере Linux
Linux, VPS | Комментировать запись
IPv6 – это последняя версия интернет-протокола (или IP), который используется в сети Интернет для создания подключений (в данном случае аббревиатура IP расшифровывается как “internet protocol”, то есть IPv6 – это internet protocol version 6). Предыдущая версия, IPv4, по-прежнему широко используется; тем не менее, адресное пространство IPv4 исчерпывается быстрыми темпами, и оно не позволяет быстро развернуть готовые устройства.
IPv6 решает эти проблемы. Кроме общих улучшений в протоколе, наиболее очевидным преимуществом использования IPv6-адресов является то, что IPv6 имеет более широкое адресное пространство. IPv4 позволяет использовать 232 адресов (некоторые из них зарезервированы для отдельных целей), а адресное пространство IPv6 – 2128 адресов, что гораздо больше IPv4.
IPv6 открывает много возможностей и решает многие давнишние проблемы, но требует небольшой корректировки некоторых из обычных сетевых конфигураций (если ранее использовался исключительно протокол IPv4). В этом руководстве речь пойдет об инструментах IPv6, аналогичных популярным инструментам и утилитам IPv4, а также о настройке некоторых сервисов для использования IPv6.
Диагностика сети с IPv6
Некоторые простейшие утилиты, используемые для диагностики проблем сети, были разработаны с ориентировкой на IPv4. Для работы с трафиком IPv6 можно использовать аналоги этих утилит протокола IPv6.
Прежде всего, чтобы просмотреть имеющиеся на данный момент настроенные IPv6-адреса сервера, используйте инструменты iproute2:
ip -6 addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 2400:6180:0:d0::41f/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::601:15ff:fe43:b201/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 fe80::601:15ff:fe43:b202/64 scope link
valid_lft forever preferred_lft forever
Чтобы вывести на экран таблицу маршрутизации IPv6, можно использовать netstat, набрав что-то вроде:
netstat -A inet6 -rn
Kernel IPv6 routing table
Destination Next Hop Flag Met Ref Use If
2400:6180:0:d0::/64 :: U 256 0 1 eth0
fe80::/64 :: U 256 0 0 eth1
fe80::/64 :: U 256 0 0 eth0
::/0 2400:6180:0:d0::1 UG 1024 0 0 eth0
::/0 :: !n -1 1 90 lo
::1/128 :: Un 0 1 20 lo
2400:6180:0:d0::41f/128 :: Un 0 1 86 lo
fe80::601:15ff:fe43:b201/128 :: Un 0 1 75 lo
fe80::601:15ff:fe43:b202/128 :: Un 0 1 0 lo
ff00::/8 :: U 256 0 0 eth1
ff00::/8 :: U 256 0 0 eth0
::/0 :: !n -1 1 90 lo
Пользователи, предпочитающие iproute2, могут получить эту информацию, введя:
ip -6 route show
2400:6180:0:d0::/64 dev eth0 proto kernel metric 256
fe80::/64 dev eth1 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
default via 2400:6180:0:d0::1 dev eth0 metric 1024
Теперь, научившись получать некоторую информацию IPv6, можно ознакомиться с использованием некоторых инструментов, которые работают с IPv6.
На самом деле, часто встречающийся ping является специфичной командой IPv4. Аналогичная команда для IPv6-адресов называется ping6. Например, следующая строка будет пинговать локальный кольцевой интерфейс:
ping6 -c 3 ::1
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.021 ms
64 bytes from ::1: icmp_seq=2 ttl=64 time=0.028 ms
64 bytes from ::1: icmp_seq=3 ttl=64 time=0.022 ms
--- ::1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.021/0.023/0.028/0.006 ms
Как видите, эта команда работает таким же образом, как и ping, с той лишь разницей, что для адресации используется версия протокола.
Еще один важный инструмент, аналог которого можно найти в IPv6 – это traceroute (в IPv6 – traceroute6):
traceroute6 google.com
traceroute to google.com (2404:6800:4003:803::1006) from 2400:6180:0:d0::41f, 30 hops max, 24 byte packets
1 2400:6180:0:d0:ffff:ffff:ffff:fff1 (2400:6180:0:d0:ffff:ffff:ffff:fff1) 0.993 ms 1.034 ms 0.791 ms
2 2400:6180::501 (2400:6180::501) 0.613 ms 0.636 ms 0.557 ms
3 2400:6180::302 (2400:6180::302) 0.604 ms 0.506 ms 0.561 ms
4 10gigabitethernet1-1.core1.sin1.he.net (2001:de8:4::6939:1) 6.21 ms 10.869 ms 1.249 ms
5 15169.sgw.equinix.com (2001:de8:4::1:5169:1) 1.522 ms 1.205 ms 1.165 ms
6 2001:4860::1:0:337f (2001:4860::1:0:337f) 2.131 ms 2.164 ms 2.109 ms
7 2001:4860:0:1::523 (2001:4860:0:1::523) 2.266 ms 2.18 ms 2.02 ms
8 2404:6800:8000:1c::8 (2404:6800:8000:1c::8) 1.741 ms 1.846 ms 1.895 ms
Следующая популярная команда называется tracepath (в IPv6 – tracepath6). Например:
tracepath6 ::1
1?: [LOCALHOST] 0.045ms pmtu 65536
1: ip6-localhost 0.189ms reached
1: ip6-localhost 0.110ms reached
Resume: pmtu 65536 hops 1 back 64
Чтобы контролировать входящий трафик, как правило, используется программа tcpdump. Эта утилита может отфильтровывать IPv6-трафик с помощью выражения ip6 or proto ipv6, введенного после опций.
Например, можно измерить быстрый трафик IPv6, сказав утилите вывести только важную информацию. Данная команда собирает резюме информации, чтобы избежать задержки выхода:
tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6
Проверка информации DNS
С помощью типичных инструментов IPv6 можно быстро проверить информацию о доменах. Главное отличие от IPv4 состоит в том, что нужно запрашивать записи AAAA ((IPv6 address record), которые используются в IPv6 вместо записей А (в IPv4).
Чтобы получить запись об IPv6-адресе домена, можно просто запросить запись AAAA. С помощью команды host это делается следующим образом:
host -t AAAA google.com
google.com has IPv6 address 2404:6800:4003:803::1004
Подобный результат можно получить при помощи команды dig:
dig google.com AAAA
; <<>> DiG 9.8.1-P1 <<>> google.com AAAA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14826
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;google.com. IN AAAA
;; ANSWER SECTION:
google.com. 299 IN AAAA 2404:6800:4003:803::1006
;; Query time: 5 msec
;; SERVER: 8.8.4.4#53(8.8.4.4)
;; WHEN: Tue Apr 1 13:59:23 2014
;; MSG SIZE rcvd: 56
Как видите, работая с IPv6-адресами, можно легко проверить, правильно ли разрешается DNS.
Сетевые сервисы IPv6
Большинство общих сетевых сервисов могут обрабатывать трафик IPv6. Иногда они нуждаются в специальных флагах или синтаксисе, а в некоторых случаях они имеют альтернативную версию, разработанную специально для IPv6.
Настройка SSH
В SSH можно настроить демона на прослушивание IPv6-адресов. Это делается в конфигурационном файле, который можно открыть так:
sudo nano /etc/ssh/sshd_config
Директива ListenAddress указывает, к какому адресу должен привязываться демон SSH. Для адресов IPv4 это выглядит так:
ListenAddress 111.111.111.111:22
То есть, демон прослушивает IPv4-адрес 111.111.111.111 на порту 22. В случае с IPv6-адресами сам адрес нужно взять в квадратные скобки:
ListenAddress [1341:8954:a389:33:ba33::1]:22
Это скажет демону SSH слушать адрес 1341:8954:a389:33:ba33::1 на порту 22. Чтобы сказать демону слушать все доступные адреса IPv6, наберите:
ListenAddress ::
Не забывайте перезагрузить демона после внесения изменений.
sudo service ssh restart
Если на стороне клиента демон, к которому нужно подключиться, настроен на прослушивание адресов IPv4 и IPv6, клиента можно заставить использовать IPv6 только с помощью флага -6, вот так:
ssh -6 username@host.com
Настройка веб-сервера
Как и SSH-демон, веб-сервер должен быть настроен на прослушивание адресов IPv6.
Чтобы Apache отвечал на запросы определенных IPv6-адресов, используйте синтаксис:
Listen [1341:8954:a389:33:ba33::1]:80
Это скажет серверу прослушивать указанный адрес на порту 80. Для большей гибкости эту строку можно скомбинировать с адресами IPv4; это делается так:
Listen 111.111.111.111:80
Listen [1341:8954:a389:33:ba33::1]:80
При необходимости слушать соединения на порт 80 на всех интерфейсах во всех протоколах можно использовать просто:
Listen 80
Указать адрес IPv6 можно также на уровне виртуального хоста. Как видите, здесь можно настроить virtualhost для IPv6- и IPv4-адреса:
<VirtualHost 111.111.111.111:80, [1341:8954:a389:33:ba33::1]:80>
. . .
</VirtualHost>
Не забудьте перезагрузить сервис для активации внесенных изменений.
sudo service apache2 restart
Пользователи, предпочитающие использовать в качестве веб-сервера Nginx, могут выполнить подобную конфигурацию. За прослушивание адресов отвечает директива listen; чтоб прослушивать трафик IPv6:
listen [1341:8954:a389:33:ba33::1]:80;
На самом деле, в Linux трафик IPv4 тоже будет прослушиваться на порту 80, потому что запросы IPv4 автоматически преобразовываются в адрес IPv6. Потому не нужно указывать адреса IPv6 и IPv4 отдельно следующим образом:
listen [1341:8954:a389:33:ba33::1]:80;
listen 111.111.111.111:80;
Это приведет к ошибке, сообщающей, что порт уже привязан к другому сервису. Чтобы использовать отдельные директивы, отключите эту функцию с помощью sysctl:
sysctl -w net.ipv6.bindv6only=1
Чтобы эта строка автоматически выполнялась при загрузке, добавьте ее в /etc/sysctl.conf:
sudo nano /etc/sysctl.conf
. . .
net.ipv6.bindv6only=1
После этого можно использовать отдельные директивы для IPv4 и IPv6, добавив флаг ipv6only=on к директиве, прослушивающей IPv6:
listen [1341:8954:a389:33:ba33::1]:80 ipv6only=on;
listen 111.111.111.111:80;
Опять же, нужно перезапустить Nginx для активации новых настроек:
sudo service nginx restart
Настройки брандмауэра
К счастью, пользователи, привыкшие настраивать правила брандмауэра при помощи фронт-эндов netfilter (например, iptables), могут использовать аналогичный инструмент, который называется ip6tables.
Чтобы узнать, как настроить iptables в Ubuntu, читайте данную статью.
Для управления правилами фильтрации пакетов IPv6 можно просто заменить команду на ip6tables. Например, в список правил IPv6 можно ввести:
sudo ip6tables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
При использовании на сервере инструмента ufw все уже готово! Дело в том, что ufw настраивает сразу оба стека, если не указано иное. Возможно, придется добавить некоторые правила для конкретных адресов IPv6, но использовать другой инструмент не понадобится.
Чтобы узнать больше об использовании ufw, читайте данное руководство.
Настройка TCP-оболочек
При использовании TCP-оболочек для управления доступом к серверу через файлы /etc/hosts.allow и /etc/hosts.deny просто используйте синтаксис IPv6, чтобы соответствовать определенным правилам.
Например, можно разрешить подключаться по SSH только адресам IPv4 и IPv6; для этого внесите в файл /etc/hosts.allow следующее:
sudo nano /etc/hosts.allow
. . .
sshd: 111.111.0.0/255.255.254.0, [1341:8954:a389:33::]/64
Как видите, адаптировать текущие правила оболочки TCP очень легко.
Итоги
Надеемся, данное руководство показало, что переход на IPv6 или использование IPv6 вместе с IPv4 – довольно простой процесс.
Конечно, для рационального использования ресурсов IPv6 часто приходится изучать сетевые сервисы по отдельности, чтобы узнать о необходимости каких-либо дополнительных изменений в конфигурациях. Тем не менее, теперь работать с IPv6, используя основные утилиты и сервисы, будет более комфортно.
Tags: IPv4, IPv6, Linux, VPS