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

Linux Debian v7.XX, Ubuntu v14.XX
CentOS v6.XX
FreeBSD v10.XX

После внедрения поддержки IPv6, на хостинговой площадке компании в которой я работаю, у нас возникла необходимость автоматизировать настройку VDS соответствующим образом. Необходимо оговорится, что речь идет не о каком-либо туннелировании, а полноценной поддержке. Т.е. сетевая инфраструктура в дата-центре обеспечивает коммутацию и маршрутизацию IPv6, имеются соответствующие стыки по BGPv6 с магистральными провайдерами Internet.

Spoiler
$ ping6 -n -c 4 ipv6.google.com
PING ipv6.google.com(2a00:1450:4013:c01::66) 56 data bytes
64 bytes from 2a00:1450:4013:c01::66: icmp_seq=1 ttl=51 time=12.4 ms
64 bytes from 2a00:1450:4013:c01::66: icmp_seq=2 ttl=51 time=12.3 ms
64 bytes from 2a00:1450:4013:c01::66: icmp_seq=3 ttl=51 time=12.4 ms
64 bytes from 2a00:1450:4013:c01::66: icmp_seq=4 ttl=51 time=12.4 ms

--- ipv6.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3017ms
rtt min/avg/max/mdev = 12.393/12.423/12.465/0.028 ms


$ traceroute -n -6 -I ipv6.google.com
traceroute to ipv6.google.com (2a00:1450:4013:c01::66), 30 hops max, 80 byte packets
 1  2a04:XXXX:1::1  11.684 ms  11.758 ms  11.753 ms
 2  2a04:XXXX:0:103::1  0.978 ms  0.980 ms  0.977 ms
 3  2001:1900:5:2:2::1939  11.640 ms  11.637 ms  11.633 ms
 4  2001:1900:104:8::8  11.629 ms  11.699 ms  11.696 ms
 5  2001:1900:5:3::276  11.692 ms  11.688 ms  11.683 ms
 6  2001:4860::1:0:abf6  11.681 ms  10.735 ms  10.721 ms
 7  2001:4860::8:0:abf1  10.705 ms  3.051 ms  3.036 ms
 8  2001:4860::8:0:8f8e  5.778 ms  5.768 ms  5.756 ms
 9  2001:4860::8:0:519f  9.570 ms  9.562 ms  9.544 ms
10  2001:4860::8:0:519e  23.371 ms  23.363 ms  12.068 ms
11  2001:4860::2:0:8652  12.659 ms  12.637 ms  12.625 ms
12  2a00:1450:4013:c01::66  12.339 ms  12.445 ms  12.426 ms


Адреса назначаются и прописываются в настройках ОС статично, т.е. функционал автоматического конфигурирования IPv6 не задействуется. Это связано с особенностями учета адресного пространства и обеспечения безопасности. Задача осложняется тем, что адресов IPv4 и IPv6 у VDS может быть сразу несколько.

Linux Debian v7.XX, Ubuntu v14.XX


В достаточно свежих дистрибутивах ОС Linux уже присутствует полноценная поддержка IPv6. Поэтому доустанавливать что-либо вручную необходимости нет.
Рассмотрим пример настройки.
"/etc/network/interfaces"
auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet static
  address 185.XXX.208.119
  network 185.XXX.208.0
  netmask 255.255.255.0
  broadcast 185.XXX.208.255
  gateway 185.XXX.208.1

auto eth0:1
iface eth0:1 inet static
  address 185.XXX.208.169
  netmask 255.255.255.255

auto eth0:2
iface eth0:2 inet static
  address 185.XXX.208.171
  netmask 255.255.255.255

iface eth0 inet6 static
  address 2a04:XXXX:1:0:0:0:0:12
  netmask 48

iface eth0 inet6 static
  address 2a04:XXXX:1:0:0:0:0:15
  netmask 48

iface eth0 inet6 static
  address 2a04:XXXX:1:0:0:0:0:16
  netmask 48
  gateway 2a04:XXXX:1::1


Тут следует обратить внимание на два момента. Во-первых, все адреса IPv6 назначаются непосредственно на сам сетевой интерфейс: в отличие от IPv4 нет необходимости создавать виртуальные адаптеры типа «eth0:X». Во-вторых, шлюз по умолчанию для IPv6 указывается один раз для любого из адресов. Действовать он будет для всех.
Результат настроек в выводе команды «ifconfig»:
# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:16:3e:34:80:fe
          inet addr:185.XXX.208.119  Bcast:185.XXX.208.255  Mask:255.255.255.0
          inet6 addr: fe80::216:3eff:fe34:80fe/64 Scope:Link
          inet6 addr: 2a04:XXXX:1::12/48 Scope:Global
          inet6 addr: 2a04:XXXX:1::16/48 Scope:Global
          inet6 addr: 2a04:XXXX:1::15/48 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:823965 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1223 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:450489490 (429.6 MiB)  TX bytes:158298 (154.5 KiB)
          Interrupt:26

eth0:1    Link encap:Ethernet  HWaddr 00:16:3e:34:80:fe
          inet addr:185.XXX.208.169  Bcast:185.XXX.208.169  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:26

eth0:2    Link encap:Ethernet  HWaddr 00:16:3e:34:80:fe
          inet addr:185.XXX.208.171  Bcast:185.XXX.208.171  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:26

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Базовую диагностику можно выполнить с помощью команд «ping6 -n -c 4 ipv6.google.com» и «traceroute -n -6 -I ipv6.google.com». Проверить MAC-адреса соседей: «ip -6 neighbor show». Изучить таблицу маршрутизации: «route -n6» или «ip -6 route show». Выяснить, какой из адресов IPv6 используется системой по умолчанию для исходящих подключений: «ip -6 route get 2a00:1450:4013:c01::65».

CentOS v6.XX


Настройка CentOS замысловатее из-за того, что опций несколько больше, и они раскиданы по нескольким файлам.
"/etc/sysconfig/network"
NETWORKING=yes
GATEWAY=185.XXX.209.1
HOSTNAME=ipv6.test
NETWORKING_IPV6=yes
IPV6_AUTOCONF=no
IPV6_AUTOTUNNEL=no
IPV6_DEFAULTDEV=eth0
IPV6_DEFAULTGW=2a04:XXXX:1::1


"/etc/sysconfig/network-scripts/ifcfg-eth0"
TYPE=Ethernet
DEVICE=eth0
ONBOOT=yes
IPADDR=185.XXX.209.208
NETWORK=185.XXX.209.0
NETMASK=255.255.255.0
BROADCAST=185.XXX.209.255
GATEWAY=185.XXX.209.1
IPV6INIT=yes
IPV6_DEFAULTGW=2a04:XXXX:1::1
IPV6ADDR=2a04:XXXX:1:0:0:0:0:12/48
IPV6ADDR_SECONDARIES="2a04:XXXX:1:0:0:0:0:15/48 2a04:XXXX:1:0:0:0:0:16/48"


"/etc/sysconfig/network-scripts/ifcfg-eth0:1"
TYPE=Ethernet
DEVICE=eth0:1
ONBOOT=yes
IPADDR=185.XXX.209.213
NETMASK=255.255.255.255


"/etc/sysconfig/network-scripts/ifcfg-eth0:2"
TYPE=Ethernet
DEVICE=eth0:2
ONBOOT=yes
IPADDR=185.XXX.209.232
NETMASK=255.255.255.255


В целом картина аналогична Debian. Виртуальные сетевые интерфейсы «eth0:X» необходимы только для IPv4. Опции «NETWORKING_IPV6» и «IPV6INIT» включают поддержку IPv6. В «IPV6_DEFAULTGW» указываем шлюз по умолчанию. Первый адрес IPv6 назначается в «IPV6ADDR», все остальные перечисляются в «IPV6ADDR_SECONDARIES».

Вывод команды «ifconfig» аналогичен Debian:
$ ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:16:3E:18:BF:3A
          inet addr:185.XXX.209.208  Bcast:185.XXX.209.255  Mask:255.255.255.0
          inet6 addr: 2a04:XXXX:1::12/48 Scope:Global
          inet6 addr: 2a04:XXXX:1::15/48 Scope:Global
          inet6 addr: 2a04:XXXX:1::16/48 Scope:Global
          inet6 addr: fe80::216:3eff:fe18:bf3a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:80834 errors:0 dropped:0 overruns:0 frame:0
          TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:40241487 (38.3 MiB)  TX bytes:11895 (11.6 KiB)
          Interrupt:245

eth0:1    Link encap:Ethernet  HWaddr 00:16:3E:18:BF:3A
          inet addr:185.XXX.209.213  Bcast:185.XXX.209.213  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:245

eth0:2    Link encap:Ethernet  HWaddr 00:16:3E:18:BF:3A
          inet addr:185.XXX.209.232  Bcast:185.XXX.209.232  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:245

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Инструменты для диагностики — те же самые, что используются в Debian.

FreeBSD v10.XX


В ОС FreeBSD уже также есть все необходимое для поддержки IPv6.
Рассмотрим пример настройки.
" /etc/rc.conf"
hostname="ipv6.test"
defaultrouter="185.XXX.209.1"
ifconfig_xn0="inet 185.XXX.209.41 netmask 255.255.255.0"
ipv6_defaultrouter="2a04:XXXX:1::1"
ifconfig_xn0_ipv6="2a04:XXXX:1:0:0:0:0:12/48"
ifconfig_xn0_aliases="inet6 2a04:XXXX:1:0:0:0:0:15/48 inet6 2a04:XXXX:1:0:0:0:0:16/48 inet 185.XXX.209.104 netmask 255.255.255.255 inet 185.XXX.209.131 netmask 255.255.255.255"


Основной адрес IPv6 указывается в опции «ifconfig_xn0_ipv6». Поскольку в FreeBSD механизм виртуальных сетевых интерфейсов для IPv4 не используется, то все дополнительные адреса, в том числе IPv6, перечисляются в «ifconfig_xn0_aliases».
Вывод команды «ifconfig» немного отличается от ОС Linux.

# ifconfig -a
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
xn0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=503<RXCSUM,TXCSUM,TSO4,LRO>
        ether 00:16:3e:f4:17:6c
        inet 185.XXX.209.41 netmask 0xffffff00 broadcast 185.XXX.209.255
        inet6 fe80::216:3eff:fef4:176c%xn0 prefixlen 64 scopeid 0x2
        inet6 2a04:XXXX:1::12 prefixlen 48
        inet 185.XXX.209.104 netmask 0xffffffff broadcast 185.XXX.209.104
        inet 185.XXX.209.131 netmask 0xffffffff broadcast 185.XXX.209.131
        inet6 2a04:XXXX:1::15 prefixlen 48
        inet6 2a04:XXXX:1::16 prefixlen 48
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        media: Ethernet manual
        status: active


Инструмент для диагностики также немного другой: «ping6 -n -c 4 ipv6.google.com» и «traceroute6 -n ipv6.google.com». Проверить MAC-адреса соседей: «ndp -an». Изучить таблицу маршрутизации: «netstat -rn6». Выяснить, какой из адресов IPv6 используется системой по умолчанию для исходящих подключений: «route -nv6 get 2a00:1450:4013:c01::65».

# route -nv6 get 2a00:1450:4013:c01::65
RTA_DST: inet6 2a00:1450:4013:c01::65; RTA_IFP: link ; RTM_GET: Report Metrics: len 240, pid: 0, seq 1, errno 0, flags:<UP,GATEWAY,HOST,STATIC>
locks:  inits:
sockaddrs: <DST,IFP>
 2a00:1450:4013:c01::65 link#0
   route to: 2a00:1450:4013:c01::65
destination: ::
       mask: ::
    gateway: 2a04:XXXX:1::1
        fib: 0
  interface: xn0
      flags: <UP,GATEWAY,DONE,STATIC>
 recvpipe  sendpipe  ssthresh  rtt,msec    mtu        weight    expire
       0         0         0         0      1500         1         0


locks:  inits:
sockaddrs: <DST,GATEWAY,NETMASK,IFP,IFA>
 :: 2a04:XXXX:1::1 :: xn0:0.16.3e.f4.17.6c 2a04:XXXX:1::12

В данном случае адресом по умолчанию является тот, что указан самым последним в выводе команды: «2a04:XXXX:1::12».

Комментарии (14)


  1. gotch
    11.11.2015 18:25

    Подскажите для общего развития eth0:1 — это просто дополнительный адрес на интерфейсе, или это отдельный интерфейс в VLAN 1?
    В чем фишка пачки адресов с маской 255.255.255.255?


    1. VBKesha
      11.11.2015 20:48

      eth0:1 — это просто дополнительный адрес на интерфейсе, или это отдельный интерфейс в VLAN 1?

      Это просто дополнительный адрес.


    1. ValdikSS
      11.11.2015 21:33
      +4

      eth0:1 — алиас, который является костылем из-за невозможности использовать несколько адресов на одном сетевом интерфейсе через ifconfig, который не обновляется с 2001 года.
      Непонятно, какого хрена автор вообще его использует в статье 2015 года, когда его нет уже во многих дистрибутивах по умолчанию.
      Разумеется, Debian поддерживает iproute2 и назначение нескольких IP-адресов на одном интерфейсе:

      auto eth0
      allow-hotplug eth0
      iface eth0 inet static
          address 192.168.1.42
          netmask 255.255.255.0
          gateway 192.168.1.1
      
      iface eth0 inet static
          address 192.168.1.43
          netmask 255.255.255.0
      
      iface eth0 inet static
          address 192.168.1.44
          netmask 255.255.255.0
      
      # adding IP addresses from different subnets is also possible
      iface eth0 inet static
          address 10.10.10.14
          netmask 255.255.255.0

      Так что
      Тут следует обратить внимание на два момента. Во-первых, все адреса IPv6 назначаются непосредственно на сам сетевой интерфейс: в отличие от IPv4 нет необходимости создавать виртуальные адаптеры типа «eth0:X»
      тоже неверна.


      1. snp
        11.11.2015 23:17
        +3

        С некоторого времени теперь можно подсеть через слэш задавать (о счастье!).

        auto eth0
        allow-hotplug eth0
        iface eth0 inet static
            address 192.168.1.42/24
            gateway 192.168.1.1
        
        iface eth0 inet static
            address 192.168.1.43/24
        
        iface eth0 inet static
            address 192.168.1.44/24
        
        # adding IP addresses from different subnets is also possible
        iface eth0 inet static
            address 10.10.10.14/24
        


        1. simnetworks
          12.11.2015 12:47

          С некоторого времени теперь можно подсеть через слэш задавать (о счастье!).
          В CentOS v6.XX нельзя, поэтому по привычке использую сетевую маску.


          1. snp
            12.11.2015 14:07
            +1

            Речь про Дебиан и Убунту — конфиг я для них упомянул. В Центоси вообще другой формат.


      1. pavelsh
        12.11.2015 03:13

        А автор и не пользуется ifconfig-ом на мой взгляд. Автор использует штатную конфигурацию интерфейсов из дистрибутива.


        1. ValdikSS
          12.11.2015 03:22
          +3

          В документации написано, что такой способ настройки — legacy, да и в статье автор везде пользуется ifconfig для просмотра состояния интерфейсов.


          1. Borz
            12.11.2015 08:02
            +1

            Legacy как раз таки «eth0:0». При этом, для iproute2 прямо написано: «Note however that this method is dangerous!»


            1. gotch
              12.11.2015 09:29

              То есть опасен медот iproute2, когда для алиасов не создаются lables для основного интерфейса?


              1. Borz
                12.11.2015 10:22

                да


        1. simnetworks
          12.11.2015 12:50
          +1

          А автор и не пользуется ifconfig-ом на мой взгляд. Автор использует штатную конфигурацию интерфейсов из дистрибутива.
          Автор использует функциональные возможности скриптов автоконфигурирования рассмотренных ОС, не прибегая к каким-либо уловкам наподобие if-up и if-down. Команды «ifconfig» и «ip» применяются только для диагностики.


      1. simnetworks
        12.11.2015 12:46

        Разумеется, Debian поддерживает iproute2 и назначение нескольких IP-адресов на одном интерфейсе
        Такой подход нарушает функционирование механизма виртуальных хостов в серверах HTTP Apache и nginx, работающих под управлением панели ISPmanager 4. В чем именно заключается проблема, я уже, честно говоря, не помню. И смысла разбираться не вижу. Четвертая версия официально более не поддерживается. Как обстоят дела в пятой, еще не проверял.


    1. simnetworks
      12.11.2015 12:45
      +1

      gotch, для чего необходимы виртуальные сетевые интерфейсы «eth0:X» тут уже разъяснили достаточно развернуто, с VLAN они никак не связаны. Сетевая маска 255.255.255.255 служит для того, что бы один из дополнительных адресов IPv4 не использовался системой по умолчанию для исходящих подключений. Данная тема несколько выходит за рамки заметки, подробнее об этом написано, например, вот здесь: http://serverfault.com/a/422230