Институт Системного Программирования РАН

Реализация бесконтекстного IP/ICMP транслятора (SIIT) в операционной среде Linux.

В.З.Шнитман, Д.С.Мишин, Д.В.Москалев, Г.В.Ключников


Последняя модификация: 28/04/2004
Версия для ядра 2.2.х: siit-1.0.4.tar.gz
Версия для ядра 2.4.х: siit-1.0.6.tar.gz

Аннотация

Данная статья описывает реализацию механизма бесконтекстной IP/ICMP трансляции SIIT (Stateless IP/ICMP Translation Algorithm) в операционной среде Linux по спецификации RFC 2765, разработанной в рамках рабочей группы IETF Next Generation Transition (http://www.ietf.org/html.charters/ngtrans-charter.html). Данный механизм позволяет узлам, работающим только по IPv6 протоколу, иметь возможность взаимодействовать с узлами, работающими по IPv4, путем трансляции заголовков протоколов IPv6/ICMPv6 в IPv4/ICMPv4 и обратно на сетевом уровне без какого-либо сохранения состояния в течении соединения.


Содержание

Введение
Описание реализации
Заключение
Список литературы


Введение

Очевидно, что переход на Internet-протокол нового поколения IPv6 сопряжен с различными проблемами. И такой переход не может произойти в один день и даже в один год. Естественно предположить, что потребуется некоторый переходный период, сроки которого в настоящее время определить наверное невозможно. Кроме того, весь мир Internet работает по "старому" протоколу IPv4, и опутан огромным количеством приложений, которых в основном вполне удовлетворяет IPv4. Поэтому введение IPv6 будет постепенным и потребует некоторые механизмы взаимодействия узлов и сетей, поддерживающих новый IPv6 протокол (которых вначале будет немного) и существующим миром IPv4. В дальнейшем, по мере доминирования IPv6 в Internet (если такое доминирование в конечном итоге произойдет), с большой вероятностью остануться узлы и сети, реализующие только IPv4 протокол и по каким-либо причинам не в состоянии поддерживать IPv6. В этом случае потребуются механизмы для взаимодествия остатков IPv4 c IPv6 миром. Разработкой таких инструментов и механизмов перехода занимается рабочая группа организации IETF Next Generation Transition (http://www.ietf.org/html.charters/ngtrans-charter.html). Этой рабочей группой разработано несколько механизмов, предназначенных для различных сценариев введения IPv6 в Internet. Руководство для введения IPv6 в IPv4 сети, а также краткое описание инструментов и механизмов перехода на IPv6 изложены в Internet-Draft "An overview of the Introduction of IPv6 in the Internet" ( draft-ietf-ngtrans-introduction-to-ipv6-transition-07.txt).

При вводе IPv6 в Internet появляются две основные проблемы. Первая связана с обеспечением взаимодествия по IPv6 между двумя или большим числом островков IPv6, изолированных в мире IPv4. Вторая проблема связана с взаимодействием между существующим IPv4 миром и новым миром IPv6. Одним из механизмов, решаюших проблему взаимодействия IPv6 узлов с IPv4 узлами является механизм бесконтекстной трансляции заголовков IP/ICMP протоколов SIIT (Stateless IP/ICMP Translation Algorithm)(RFC2765). Протокол SIIT предназначен для взаимодействия узлов, которые могут работать только по IPv6 протоколу (IPv6-only), с узлами существующей IPv4 сети Internet.

IPv6-only узел - это узел, который имеет IPv4 реализацию (кроме IPv6), но не назначает IPv4 адресов, либо хост вообще не имеющий IPv4 реализации и осуществляющий сетевое взаимодействие только по протоколу IPv6. Соответственно, IPv6-only сеть - это сеть, узлы которой работают только по протоколу IPv6 и не поддерживают IPv4 маршрутизацию.

Документ [RFC2765] "Stateless IP/ICMP Translation Algorithm" описывают только сам алгоритм трансляции и не рассмотривает другой необходимый компонент для обеспечения взаимодействия IPv6-only узлов с IPv4-only узлами. Это механизм получения и назначения IPv6-only узлами временных IPv4 адресов. Такие временный IPv4 адреса будут использоваться IPv6-only узлами в виде IPv4-translated IPv6 адресов в качестве адреса источника при посылке пакетов IPv4-only узлам. Адрес IPv4-only узла (адрес назначения), в таких пакетах, будет представляться в виде IPv4-mapped IPv6 адреса. Такие пакеты должны будут направляться на бесконтекстной IP/ICMP транслятор, который будет траслировать заголовоки IPv6 в заголовоки IPv4 и преобразовывать IPv4-mapped IPv6 адреса и IPv4-translated IPv6 адреса в IPv4 адреса. При получении пакетов от IPv4 узлов с адресом назначения, который является временно назначенным IPv4 адресом IPv6-only узлу, траслятор будет транслировать заголовоки IPv4 в заголовоки IPv6 и преобразовывать IPv4 адрес назначения в IPv4-translated IPv6 адрес, а IPv4 адрес источника в IPv4-mapped IPv6 адрес в заголовке IPv6 транслированного пакета.

IPv4-mapped IPv6 адрес представляется в форме 0::ffff:a.b.c.d (где a.b.c.d - это IPv4 адрес) и используется в IPv6 пакете для указания на то, что удаленная сторона является IPv4 узлом. IPv4-translated IPv6 адрес представляется в форме 0::ffff:0:a.b.c.d (где a.b.c.d - это IPv4 адрес) и используется для идентификации IPv6 узла.

Кроме того, использование IPv4-mapped и IPv4-translated IPv6 адресов позволяют избежать пересчет контрольной суммы псевдо-заголовка в TCP и UDP пакетах, с одним исключением - нефрагментированые UDP пакеты, у которых контрольная сумма отсутствует (в IPv4 для UDP контрольная сумма необязательна). Так же, необходимо считать pseudo-header checksum для ICMPv6, в ICMPv4 контрольная сумма отсутствует. И в ICMP error сообщениях необходимо модифицировать включенные в них IP заголовки, так чтобы получатель мог понимать включенный IP заголовок.

Все операции транслятора выполняются независимо над каждым пакетом, не учитывая никаких состояний одного пакета в зависимости от другого. Что позволяет иметь одно и тоже TCP соединеие, пакеты которого могут проходить через два и более независимых транслятора (без какого-либо взаимодействия этих трансляторов).

Транслятор НЕ ТРАНСЛИРУЕТ:
   - какие-либо IPv4 опции (any IPv4 options),
   - IPv6 routing headers,
   - IPv6 hop-by-hop extension headers,
   - IPv6 destination options headers,
   - ESP и AH headers,
   - фрагментированные IPv4 UDP пакеты, не имеющие UDP контрольной суммы,
   - пакеты с IPv4 multicast адресами (IPv4 multicast адреса не могут быть оттображены в IPv6 multicast).

С детальным описанием алгоритма бесконтекстной трансляции SIIT можно ознакомиться в [RFC2765] и статье В.З.Шнитмана и А.А.Ломака "Обеспечение совместимости протоколов IPv4 и IPv6: бесконтекстный IP/ICMP транслятор в среде Linux".


Описание реализации

В 1999 году по гранту РФФИ 99-90220 нашей группой был реализован бесконтекстной транслятор SIIT для операционной системы Linux. Так как на тот момент еще не было окончательного стандарта для SIIT, работа была произведена по Internet-Draft "Stateless IP/ICMP Translation Algorithm (SIIT)" (draft-ietf-ngtrans-siit-08.txt). Кроме того, еще не было достаточно стабильной реализации IPv6 стека в ядре Linux и поддержка этой реализации оставляла желать лучшего. С течением времени ситуация изменилась. В феврале 2000 года вышел стандарт на SIIT [RFC2765], а так же появился проект USAGI (http://www.linux-ipv6.org), целью которого является реализация и поддержка IPv6 стека для ОС Linux для ядра версий 2.2.х и 2.4.х. Естественно, появилась необходимость исправить "старую" реализацию SIIT для Linux. Учитавая большое количество изменений, которые необходимо было внести в существующий код, мы решели переписать реализацию транслятора заново. Мы тестировали нашу реализацию на Debian Linux 2.2 с версией ядра 2.2.20 (usagi-20011112-linux22).

Как транслятор встраивается в ядро Linux?

Транслятор выполнен в виде сетевого модуля ядра. Это позволяет избежать выполнение различнах действий над приходящими пакетами непосредственно в трансляторе (например, проверка котрольных сумм), так как такую работу будут выполняют стеки IPv4/IPv6. После загрузки модуля в ядро транслятор выглядит как обычный Ethernet интерфейс с именем siit0. И над ним можно выполнять все операции, доступные для обычных сетвых интерфейсов. Узел, на котором выполняется транслятор, должен быть пограничным маршрутизатором между IPv6-only сетью и IPv4 внешним миром, т.е. он должен иметь как минимум два раельных сетевых интерфейсов, к одному из которых подключена IPv6-only сеть, а к другому IPv4. Рис.1 поясняет местоположение транслятора в ядре операционной системы.



Рис.1 Место транслятора в сетевой архитектуре ядра

В таком варианте исполнения код транслятора будет выполнять только операции связанные непосредственно с трансляцией, полагаясь в остальном на IP стек ядра. Чтобы заставить транслятор работь по схеме представленной на рис.1 необходимо, используя стандартные средства механизма маршрутизации и специальные адреса (использующиеся для трансляции) направлять на интерфейс транслятора:

* все IPv6 пакеты с IPv4-mapped IPv6 адресами назначения (пришедшие с интерфейса IPv6-only сети) (такие IPv6 пакеты будут преобразовываться в IPv4 пакеты);
* все IPv4 пакеты, предназначенные для временно назначенных IPv4 адресов IPv6-only узлов (расположенных в IPv6-only сети) (такие IPv4 пакеты будут преобразовываться в IPv6 пакеты).

Для этого необходимо добавить соответствующие записи в таблицу маршрутизации и присвоить нужные адреса интерфейсу транслятора и интерфейсу IPv6-only сети.

Таким образом пакет, пришедший из IPv4 сети, будет попадать в IP стек (IPv4) и стандартно на нем обрабатываться. Если этот пакет предназначен для адреса из пула временных IPv4 адресов IPv6-only узлов, то такой пакет будет направляться в интерфейс транслятора и преобразовываться на нем в IPv6 пакет. Этот IPv6 пакет затем будет передан транслятором обратно в IP стек (но уже IPv6), который направит его в соответствующий сетевой интерфейс. Пришедший из IPv6 сети пакет, также попадет в IP стек (IPv6), и, если адрес назначения является IPv4-mapped IPv6 адрес, данный пакет будет отправлен на интерфейс транслятора и будет преобразован в IPv4 пакет. И этот пакет снова вернется в IP стек (IPv4) и далее будет направлен в нужный интерфейс для отправки.

Теперь попытаемся пояснить вышесказанное на реальном примере нашего рабочего лабораторного стенда. На рис.2 показана схема этого стенда.



Рис.2 Схема лабораторного стенда

Узел, на котором выполняется транслятор, является маршрутизатором и имеет три сетевых интерфейса (помимо loopback интерфейса):
* eth0 - для подключения IPv4 сети,
* eth1 - для подключения IPv6-only сети,
* siit0 - непосредственно SIIT транслятор.

Для временных IPv4 адресов IPv6-only узлов выделена подсеть 194.186.94.8/29 (маска 255.255.255.248). Адреса назначаются вручную, поэтому за каждым IPv6-only узлом закрепляется фиксированный IPv4 адрес. Этот адрес представляется в виде IPv4-translated IPv6 адреса и назначается сетевому интерфейсу. Как можно увидеть на рис.2 IPv6-only узел имеет IPv4-translated IPv6 адрес ::ffff:0:c2ba:5e0a/96, последнии 32 бита содержат IPv4 адрес 194.186.94.10. На узле с транслятором сетевому интерфейсу IPv6 eth1 также назначается фиксированный IPv4-translated IPv6 адрес ::ffff:0:c2ba:5e09/96 (194.186.94.9), а интерфейсу транслятора siit0 назначается реальный IPv4 адрес 194.186.94.9/29. Кроме того добавляются необходимые записи в таблицу маршрутизации, как показано на рис.2. На IPv6-only узлах необходима запись в таблице маршрутизации для направления на узел с транслятором пакетов с IPv4-mapped адресами назначения, а на IPv4 узлах необходима запись для направления на узел с транслятором пакетов c адресами назначения из диапазона 194.186.94.8/29.

Таким образом, приходящии на eth0 IPv4 пакеты с адресом назначения из диапазона 194.186.94.8/29 будут напрвляться на siit0, на нем транслироваться, и далее направляться на eth1, так как адресом назначения отранслированного IPv6 пакета будет являться IPv4-translated IPv6 адрес, а все пакеты с префиксом ::ffff:0:0:0/96 должен доставлять интерфейс eth1 (как видно из таблицы маршрутизации на рис.2). А приходящии на eth1 IPv6 пакеты, у которых адрес назначения имеет префис ::ffff:0:0/96 (IPv4-mapped), будут также напрвляться на интерфейс siit0, преобразовываться на нем в IPv4 пакет и переправляться на eth0 для отправки.

# Проблема 1 #
В вышеописанной конфигурации мы сталкнулись с проблемой использования IPv4-mapped IPv6 адресов в IPv6 пакетах. Дело в том, что не все операционные системы корректно обрабатывают IPv6 пакеты с IPv4-mapped IPv6 адресами. Например, реализация IPv6 для BSD систем KAME просто отбрасывает такие IPv6 пакеты, что отмечено в описании реализации (файл IMPLEMENTATION дистрибутива KAME.
Более детально с описанием проблемы можно ознакомиться в следующих документах:
* v6test/conf/transition-abuse.conf (included in kame kit);
* http://playground.iijlab.net/i-d/draft-itojun-ipv6-transition-abuse-01.txt.
Поэтому вместо IPv4-mapped IPv6 адресов мы используем новый префикс ::ffff:ffff:0:0/96. Т.е. там, где по спецификации SIIT должны использоваться IPv4-mapped IPv6 адреса, мы используем этот префикс. В остальном логика работы транслятора не изменяется. В нашем примере необходимо заменить записи в таблице маршрутизации для IPv4-mapped префикса (::ffff:0:0/96) на префикс ::ffff:ffff:0:0/96 на узле с транслятором и на всех IPv6-only узлах. И, естественно, указать транслятору на замену префикса.

Настройка стенда

Итак, перейдем к конфигурации узлов стенда:

* Узел с транслятором: 
   Имя: crow,
   ОС:  Debian Linux 2.2,
   Версия ядра: 2.2.20 (usagi-20011112-linux22)

* IPv6-only узел: 
   Имя: findus,
   ОС: FreeBSD 4.4-RELEASE
   Версия ядра: kame-20011122 (from cvs repository)

* IPv4 узел: 
   Имя: rabbit,
   ОС: FreeBSD 4.4-RELEASE
   Версия ядра: kame-20011122 (from cvs repository)
Начнем с узла, где будет работать транслятор. Первым делом разрешаем на нем прохождение IPv4 и IPv6 пакетов (ip forwarding):
[grn@crow siit]$ sysctl -w net/ipv4/conf/all/forwarding=1
net/ipv4/conf/all/forwarding = 1
[grn@crow siit]$ sysctl -w net/ipv6/conf/all/forwarding=1
net/ipv6/conf/all/forwarding = 1

Далее загружаем модуль транслятора в ядро командой:

[grn@crow siit]$ insmod siit.o
и присваиваем адреса интерфесам:
[grn@crow siit]$ ifconfig eth1 add ::ffff:0:c2ba:5e09/96
[grn@crow siit]$ ifconfig siit0 inet 194.186.94.9 netmask 255.255.255.248
а так же добавляем запись в таблицу маршрутизации:
[grn@crow siit]$ route add -A inet6 ::ffff:ffff:0:0/96 dev siit0

Теперь можно посмотреть результат. Ниже приведен вывод команды ifconfig и netstat -rn :

[grn@crow siit]$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:D0:B7:0C:42:42 
          inet addr:194.67.37.213  Bcast:194.67.37.255  Mask:255.255.255.0
          inet6 addr: fe80::2d0:b7ff:fe0c:4242/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:309039 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1946 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          Interrupt:9 Base address:0x2000 

eth1      Link encap:Ethernet  HWaddr 00:20:AF:38:DA:2F
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::220:afff:fe38:da2f/64 Scope:Link
          inet6 addr: ::ffff:0:c2ba:5e09/96 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          Interrupt:5 Base address:0x320

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:3924  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 

siit0     Link encap:Ethernet  HWaddr 00:53:49:49:54:30
          inet addr:194.186.94.9  Bcast:194.186.94.255  Mask:255.255.255.248
          inet6 addr: fe80::253:49ff:fe49:5430/64 Scope:Link
          UP BROADCAST RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:1 overruns:0 carrier:0
          collisions:0 txqueuelen:100

[grn@crow siit]$ netstat -rnA inet
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
194.186.94.8    0.0.0.0         255.255.255.248 U         0 0          0 siit0
194.67.37.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
0.0.0.0         194.67.37.193   0.0.0.0         UG        0 0          0 eth0

[grn@crow siit]$ netstat -rnA inet6
Kernel IPv6 routing table
Destination                   Next Hop      Flags Metric Ref    Use Iface
::1/128                       ::            U     0      0        0 lo      
::ffff:0:c2ba:5e09/128        ::            U     0      0        0 lo      
::ffff:0:0:0/96               ::            UA    256    0        0 eth1    
::ffff:ffff:0:0/96            ::            U     1      0        0 siit0   
fe80::220:afff:fe38:da2f/128  ::            U     0      0        0 lo      
fe80::253:49ff:fe49:5430/128  ::            U     0      0        0 lo      
fe80::2d0:b7ff:fe0c:4242/128  ::            U     0      0        0 lo      
fe80::/64                     ::            UA    256    0        0 eth0    
fe80::/64                     ::            UA    256    0        0 eth1    
fe80::/64                     ::            UA    256    0        0 siit0   
ff00::/8                      ::            UA    256    0        0 eth0    
ff00::/8                      ::            UA    256    0        0 eth1    
ff00::/8                      ::            UA    256    0        0 siit0   
::/0                          ::            UDA   256    0        0 eth0    
::/0                          ::            UDA   256    0        0 eth1    
::/0                          ::            UDA   256    0        0 siit0   

На IPv6-only узеле нужно присвоить IPv4-translated IPv6 адрес сетевому интерфейсу:
[grn@findus grn]$ ifconfig fxp0 inet6 ::ffff:0:c2ba:5e0a prefixlen 96
[grn@findus grn]$ ifconfig
fxp0: flags=8843 mtu 1500
        inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
        inet6 fe80::260:94ff:fe23:f5bd prefixlen 64 scopeid 0x1 
        inet6 ::ffff:0:c2ba:5e0a prefixlen 96 
        ether 00:60:94:23:f5:bd 
        media: Ethernet autoselect (10baseT/UTP)
        status: active
lo0: flags=8049 mtu 16384
        inet6 ::1 prefixlen 128 
        inet6 fe80::1 prefixlen 64 scopeid 0x2 
        inet 127.0.0.1 netmask 0xff000000 

и добавить запись в таблицу маршрутизации:
[grn@findus grn]$ sudo route add -inet6 ::ffff:ffff:0:0 -prefixlen 96 ::ffff:0:c2ba:5e09
add net ::ffff:ffff:0:0: gateway ::ffff:0:c2ba:5e09
[grn@findus grn]$ netstat -rnf inet6
Routing tables

Internet6:
Destination                       Gateway               Flags      Netif Expire
::/96                             ::1                   UGRSc       lo0
::1                               ::1                   UH          lo0
::ffff:0.0.0.0/96                 ::1                   UGRSc       lo0
::ffff:0:0:0/96                   link#1                UC         fxp0
::ffff:0:c2ba:5e09                link#1                UHLW       fxp0
::ffff:0:c2ba:5e0a                0:60:94:23:f5:bd      UHL         lo0
::ffff:ffff:0:0/96                ::ffff:0:c2ba:5e09    UGSc       fxp0
fe80::/10                         ::1                   UGRSc       lo0
fe80::%fxp0/64                    link#1                UC         fxp0
fe80::260:94ff:fe23:f5bd%fxp0     0:60:94:23:f5:bd      UHL         lo0
fe80::%lo0/64                     fe80::1%lo0           Uc          lo0
fe80::1%lo0                       link#2                UHL         lo0
ff01::%fxp0/32                    link#1                UC         fxp0
ff01::%lo0/32                     ::1                   UC          lo0
ff02::/16                         ::1                   UGRS        lo0
ff02::%fxp0/32                    link#1                UC         fxp0
ff02::%lo0/32                     ::1                   UC          lo0

На IPv4 узеле нужно добавить запись в таблицу маршрутизации:
[grn@rabbit grn]$ route add 194.186.94.8 -netmask 255.255.255.248 194.67.37.213
[grn@rabbit grn]$ netstat -rnf inet
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            194.67.37.193      UGSc        4       11   fxp0
127.0.0.1          127.0.0.1          UH          1     4497    lo0
194.67.37          link#1             UC         11        0   fxp0
194.186.94.8/29    194.67.37.213      UGSc        1      198   fxp0
# Проблема 2 #
Теперь, казалось бы, стенд готов к работе, но не тут-то было. Не очень корректная реализация Neighbor Discovery (ND) в USAGI Linux не позволяет получить IPv6-only узлу (findus) Neighbor Advertisement Message от узла с транслятором (crow). Для того чтобы стенд заработал мы применяем маленькую хитрость, вручную добавляем ND запись о MAC-адресе на узле findus:
[grn@findus grn]$ ndp -s ::ffff:0:c2ba:5e09 0:20:af:38:da:2f
[grn@findus grn]$ ndp -a
Neighbor                             Linklayer Address  Netif Expire    S Flgs
::ffff:0:c2ba:5e09                   0:20:af:38:da:2f    fxp0 permanent R 
::ffff:0:c2ba:5e0a                   0:60:94:23:f5:bd    fxp0 permanent R 
fe80::260:94ff:fe23:f5bd%fxp0        0:60:94:23:f5:bd    fxp0 permanent R 
Кроме того в USAGI команда ndp работает только на просмотр, добавление на данный момент не реализовано.

Тесты

Проверим работу стенда самым простым способом, используя стандартные команды ping, ping6, telnet, ftp . И посмотрим прохождение пакетов через интерфес транслятора siit0 командой tcpdump .

1) ping: rabbit (194.67.37.215) -> findus (194.186.94.10)

[grn@rabbit public_html]$ ping 194.186.94.10
PING 194.186.94.10 (194.186.94.10): 56 data bytes
64 bytes from 194.186.94.10: icmp_seq=0 ttl=62 time=1.473 ms
64 bytes from 194.186.94.10: icmp_seq=1 ttl=62 time=1.224 ms
64 bytes from 194.186.94.10: icmp_seq=2 ttl=62 time=1.220 ms
64 bytes from 194.186.94.10: icmp_seq=3 ttl=62 time=1.206 ms
64 bytes from 194.186.94.10: icmp_seq=4 ttl=62 time=1.221 ms
^C
--- 194.186.94.10 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 1.206/1.269/1.473/0.102 ms

[grn@crow siit]$ sudo tcpdump -n -i siit0
tcpdump: listening on siit0
14:40:56.626646 194.67.37.215 > 194.186.94.10: icmp: echo request
14:40:56.626691 ::ffff:ffff:c243:25d7 > ::ffff:0:c2ba:5e0a: frag (0|64) icmp6: echo request
14:40:56.627556 ::ffff:0:c2ba:5e0a > ::ffff:ffff:c243:25d7: icmp6: echo reply
14:40:56.627582 194.186.94.10 > 194.67.37.215: icmp: echo reply
14:40:57.634563 194.67.37.215 > 194.186.94.10: icmp: echo request
14:40:57.634606 ::ffff:ffff:c243:25d7 > ::ffff:0:c2ba:5e0a: frag (0|64) icmp6: echo request
14:40:57.635298 ::ffff:0:c2ba:5e0a > ::ffff:ffff:c243:25d7: icmp6: echo reply
14:40:57.635326 194.186.94.10 > 194.67.37.215: icmp: echo reply
14:40:58.644740 194.67.37.215 > 194.186.94.10: icmp: echo request
14:40:58.644785 ::ffff:ffff:c243:25d7 > ::ffff:0:c2ba:5e0a: frag (0|64) icmp6: echo request
14:40:58.645476 ::ffff:0:c2ba:5e0a > ::ffff:ffff:c243:25d7: icmp6: echo reply
14:40:58.645502 194.186.94.10 > 194.67.37.215: icmp: echo reply
14:40:59.654916 194.67.37.215 > 194.186.94.10: icmp: echo request
14:40:59.654958 ::ffff:ffff:c243:25d7 > ::ffff:0:c2ba:5e0a: frag (0|64) icmp6: echo request
14:40:59.655645 ::ffff:0:c2ba:5e0a > ::ffff:ffff:c243:25d7: icmp6: echo reply
14:40:59.655672 194.186.94.10 > 194.67.37.215: icmp: echo reply
14:41:00.665100 194.67.37.215 > 194.186.94.10: icmp: echo request
14:41:00.665143 ::ffff:ffff:c243:25d7 > ::ffff:0:c2ba:5e0a: frag (0|64) icmp6: echo request
14:41:00.665831 ::ffff:0:c2ba:5e0a > ::ffff:ffff:c243:25d7: icmp6: echo reply
14:41:00.665874 194.186.94.10 > 194.67.37.215: icmp: echo reply
2) ping6: findus (::ffff:0:c2ba:5e0a) -> rabbit (::ffff:ffff:c243:25d7)
[grn@findus grn]$ ping6 ::ffff:ffff:c243:25d7
PING6(56=40+8+8 bytes) ::ffff:0:c2ba:5e0a --> ::ffff:ffff:c243:25d7
16 bytes from ::ffff:ffff:c243:25d7, icmp_seq=0 hlim=63 time=1.474 ms
16 bytes from ::ffff:ffff:c243:25d7, icmp_seq=1 hlim=63 time=1.218 ms
16 bytes from ::ffff:ffff:c243:25d7, icmp_seq=2 hlim=63 time=1.217 ms
16 bytes from ::ffff:ffff:c243:25d7, icmp_seq=3 hlim=63 time=1.216 ms
^C
--- ::ffff:ffff:c243:25d7 ping6 statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 1.216/1.281/1.474 ms

[grn@crow siit]$ sudo tcpdump -n -i siit0
tcpdump: listening on siit0
14:45:22.464251 ::ffff:0:c2ba:5e0a > ::ffff:ffff:c243:25d7: icmp6: echo request
14:45:22.464286 194.186.94.10 > 194.67.37.215: icmp: echo request
14:45:22.464606 194.67.37.215 > 194.186.94.10: icmp: echo reply
14:45:22.464634 ::ffff:ffff:c243:25d7 > ::ffff:0:c2ba:5e0a: frag (0|16) icmp6: echo reply
14:45:23.472398 ::ffff:0:c2ba:5e0a > ::ffff:ffff:c243:25d7: icmp6: echo request
14:45:23.472438 194.186.94.10 > 194.67.37.215: icmp: echo request
14:45:23.472776 194.67.37.215 > 194.186.94.10: icmp: echo reply
14:45:23.472806 ::ffff:ffff:c243:25d7 > ::ffff:0:c2ba:5e0a: frag (0|16) icmp6: echo reply
14:45:24.462482 ::ffff:0:c2ba:5e0a > ::ffff:ffff:c243:25d7: icmp6: echo request
14:45:24.462523 194.186.94.10 > 194.67.37.215: icmp: echo request
14:45:24.462860 194.67.37.215 > 194.186.94.10: icmp: echo reply
14:45:24.462889 ::ffff:ffff:c243:25d7 > ::ffff:0:c2ba:5e0a: frag (0|16) icmp6: echo reply
14:45:25.462569 ::ffff:0:c2ba:5e0a > ::ffff:ffff:c243:25d7: icmp6: echo request
14:45:25.462610 194.186.94.10 > 194.67.37.215: icmp: echo request
14:45:25.462951 194.67.37.215 > 194.186.94.10: icmp: echo reply
14:45:25.462977 ::ffff:ffff:c243:25d7 > ::ffff:0:c2ba:5e0a: frag (0|16) icmp6: echo reply
3) telnet: rabbit (194.67.37.215) -> findus (194.186.94.10)
[grn@rabbit grn]$ telnet 194.186.94.10
Trying 194.186.94.10...
Connected to 194.186.94.10.
Escape character is '^]'.

FreeBSD/i386 (findus.ispras.ru) (ttyp1)

login: grn
Password:
Last login: Thu Jan 17 13:55:48 from 192.168.0.1
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
        The Regents of the University of California.  All rights reserved.

FreeBSD 4.4-RELEASE (KAME.GRN.20011122) #0: Fri Nov 23 17:43:41 MSK 2001

Welcome to FreeBSD!

[grn@findus grn]$ 
4) ftp: findus (::ffff:0:c2ba:5e0a) -> rabbit (::ffff:ffff:c243:25d7)
[grn@findus grn]$ ftp ::ffff:ffff:c243:25d7
Connected to ::ffff:ffff:c243:25d7.
220 rabbit.ispras.ru FTP server (Version 6.00LS) ready.
Name (::ffff:ffff:c243:25d7:grn): grn
331 Password required for grn.
Password:
230 User grn logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/grn" is current directory.
ftp> cd src
ftp> get cvs-1.11.1p.tar.gz
local: cvs-1.11.1p.tar.gz remote: cvs-1.11.1p.tar.gz
229 Entering Extended Passive Mode (|||49182|)
150 Opening BINARY mode data connection for 'cvs-1.11.1p.tar.gz' (2143435 bytes).
100% |******************************************************************|  2093 KB    00:00 ETA
226 Transfer complete.
2143435 bytes received in 2.76 seconds (757.18 KB/s)
ftp>

Детальные тесты будут опубликованы позже.


Заключение

Реализация механизма бесконтекстной IP/ICMP трансляции SIIT является практической работой, позволяющей начать ввод в эксплуатацию сетей IPv6. Использование механизма SIIT позволит без больших затрат начать изучать и использовать новые возможности протокола IPv6, продолжая работать в основном в существующей инфраструктуре IPv4.


Список литературы

[RFC2765]
            Stateless IP/ICMP Translation Algorithm (SIIT) (RFC 2765), E. Nordmark,
            February 2000
[RFC791]
            Internet Protocol (RFC 791), J. Postel, Sep-01-1981
[RFC792]
            Internet Control Message Protocol (RFC 791), J. Postel, Sep-01-1981.
[RFC950]
            Internet Standard Subnetting Procedure (RFC 950), J.C. Mogul, J. Postel, Aug-01-1985
[RFC1191]
            Path MTU discovery (RFC 1191), J.C. Mogul, S.E. Deering, Nov-01-1990
[RFC2460]
            Internet Protocol, Version 6 (IPv6) Specification (RFC 2460), S. Deering,
            R. Hinden, December 1998
[RFC2373]
            IP Version 6 Addressing Architecture (RFC 2373), R. Hinden, S. Deering, July 1998
[RFC2463]
            Internet Control Message Protocol (ICMPv6) for the Internet Protocol
            Version 6 (IPv6) Specification (RFC 2463), A. Conta, S. Deering, December 1998
[RFC1981]
            Path MTU Discovery for IP version 6 (RFC 1981), J. McCann, S. Deering,
            J. Mogul, August 1996
[INTR-TRAN]
            An overview of the Introduction of IPv6 in the Internet
            (draft-ietf-ngtrans-introduction-to-ipv6-transition-07.txt), July 2001
[ТРАНСЛ]
            Обеспечение совместимости протоколов IPv4 и IPv6: бесконтекстный IP/ICMP
            транслятор в среде Linux, В.З.Шнитман, А.А.Ломака, 1999
[COMER]
            Internetworking with TCP/IP, Vol I, D.E.Comer, Prentice-Hall, 1995
[LINUX-IP]
            Linux IP Stacks в комментариях, С.Сэтчелл, Х.Клиффорд, DiaSoft, 2001
[LINUX-DRV]
            Linux device drivers, A.Rubini, O'REILLY, 1998


Ссылки

USAGI Project (http://www.linux-ipv6.org)
            USAGI Project: IPv6 for Linux
KAME Project (http://www.kame.net)
            KAME Project is a free IPv6 and IPsec (for both IPv4 and IPv6)
            stack for BSD variants to the world
IETF Ngtrans WG (http://www.ietf.org/html.charters/ngtrans-charter.html)
            IETF Next Generation Transition Working Group
6bone (http://www.6bone.net)
            Information related to the 6bone pilot network