Хабрачерновик: Кошки-мышки: Играем с протоколом IPv6
Отправка пакетов IPv6 через сети IPv4
Мы продолжаем тему «сырых» IP-пакетов, и выходим на версию 6 протокола.
Будем пинговать IPv6-Гуглосервер
ping 2A00:1450:4010:C00::69и посмотрим, что из этого выйдет.Вот расшифровка пакета, содержащего отправляемый нами ICMPv6-эхо-запрос, перехваченный сетевым монитором:
45 00 // Ver: 4 // HL: 20 // ToS: none
00 50 // Total-Length: 80
00 6D // ID: 109
00 00 // Flagsf: none
80 // TTL: 128
11 // Proto: UDP
EF FA // IPv4-Checksum
0A 45 60 43 // Src = 10.69.96.67
41 37 9E 76 // Dst = 65.55.158.118
CA 85 // SrcPort = 51845
0D D8 // DstPort = Teredo Servers (3544) Tunneling IPv6 over UDP through NATs
00 3C // Length = 60
43 07 // UDP-Checksum
60 00 00 00 // Versions: IPv6 // flags: 00-00000 (DSCP: 0, ECT: 0, CE: 0, FL: 0)
00 0C // PayloadLength: 12
3A // NextProtocol: ICMPv6, 58
15 // HopLimit: 21
20 01 00 00 41 37 9E 76 30 11 E0 04 2A A8 7F D4
// SourceAddress: 2001:0:4137:9E76:3011:E004:2AA8:7FD4
2A 00 14 50 40 10 0C 00 00 00 00 00 00 00 00 69
// DestinationAddress: 2A00:1450:4010:C00::69
80 // MessageType: Echo request
00 // Code: 0
08 79 // ICMPv6-Checksum
56 0D // Identifier: 22029
DC 27 // SequenceNumber: 56359
00 00 00 00 // EchoData: Binary Large Object (4 Bytes)Как видим (или не видим), запрос отправляется через Teredo псевдоинтерфейс.
Почему же черепашка не танцует?
К сожалению, одной лишь простой инкапсуляции IPv6-пакета в Teredo-UDP недостаточно. Перед этим, нужно еще сконфигурировать туннель. Более того, даже после конфигурации туннеля ответ придет не от самого Teredo-сервера (как можно было подумать), а через другой релейный шлюз (к которому еще и дыру в NAT'е предстоит пробить).Другими словами, чтобы отправить ICMPv6-запрос (и, соответственно, получить ответ) нужно проделать такие шаги:
0) определить IPv6-адрес получателя (например через DNS, запросив запись AAAA)
1) определить IPv4-адрес Teredo-сервера (тоже через DNS, запись типа A)
2) отправить Teredo-серверу UDP-запрос, включающий в себя запрос на обнаружение IPv6-маршрутизатора
3) получить ответ от Teredo-сервера (в котором будет содержаться анонс маршрутизатора и дополнительные данные конфигурации)
4) наконец-таки отправить Teredo-серверу наш инкапсулированный ICMPv6-эхо-запрос
5) получить в ответ от Teredo-сервера «пузырь» (пустышку-оригинатор) в котором будет содержаться информация, на какой релейный шлюз нужно отправлять специальный запрос-заколку (hearpin), чтобы пробить NAT к релею.
6) отправить «заколку-пустышку» релею
7) и, наконец, получить от релея долгожданный ICMPv6-эхо-ответ (или не получить, это уж как повезет).
8) ???
9) PROFIT!!!
И, даже, если корректный ответ будет-таки получен, то скорее всего программа ping.exe все равно напишет, что «Превышен интервал ожидания для запроса.»
Продолжение следует…