18
июнь
2021
Протокол CoAP для "Интернета вещей" - изучение трафика
11:35

Протокол CoAP для "Интернета вещей" - изучение трафика

18 июнь 2021 11:35

С помощью WireShark удалось захватить два пакета нового сетевого протокола CoAP.

Contrained Application Protocol (стандарт RFC 7252) предназначен для "Интернета вещей" и действует на основе UDP. Этот простой протокол позволяет общаться машинам между собой (M2M - machine to machine).

Первый пакет - запрос устройства к серверу 188.34.167.226:
Frame 13: 103 bytes on wire (824 bits), 103 bytes captured (824 bits) on interface 0
Ethernet II, Src: Keenetic_0f:40:ef (50:ff:20:0f:40:ef), Dst: router.lan (c4:ad:34:45:6a:fb)
Internet Protocol Version 4, Src: 192.168.0.73 (192.168.0.73), Dst: static.226.167.34.188.clients.your-server.de (188.34.167.226)
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
Total Length: 89
Identification: 0xfaca (64202)
Flags: 0x4000, Don't fragment
Time to live: 64
Protocol: UDP (17)
Header checksum: 0x1ad3 [validation disabled]
[Header checksum status: Unverified]
Source: 192.168.0.73 (192.168.0.73)
Destination: static.226.167.34.188.clients.your-server.de (188.34.167.226)
User Datagram Protocol, Src Port: 56911 (56911), Dst Port: coap (5683)
Source Port: 56911 (56911)
Destination Port: coap (5683)
Length: 69
Checksum: 0x8392 [unverified]
[Checksum Status: Unverified]
[Stream index: 1]
Constrained Application Protocol, Confirmable, POST, MID:41783
01.. .... = Version: 1
..00 .... = Type: Confirmable (0)
.... 1000 = Token Length: 8
Code: POST (2)
Message ID: 41783
Token: 398d7e264ddd9768
Opt Name: #1: Uri-Path: a
Opt Name: #2: Uri-Query: cid=4cef9cfe-af0c-11e8-8f23-df6cd39224ef
Opt Name: #3: Uri-Query: r=ru
[Response In: 59]
[Uri-Path: /a]

Второй пакет - ответ сервера

Frame 59: 75 bytes on wire (600 bits), 75 bytes captured (600 bits) on interface 0
Ethernet II, Src: router.lan (c4:ad:34:45:6a:fb), Dst: Keenetic_0f:40:ef (50:ff:20:0f:40:ef)
Internet Protocol Version 4, Src: static.226.167.34.188.clients.your-server.de (188.34.167.226), Dst: 192.168.0.73 (192.168.0.73)
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x40 (DSCP: CS2, ECN: Not-ECT)
Total Length: 61
Identification: 0xa920 (43296)
Flags: 0x4000, Don't fragment
Time to live: 52
Protocol: UDP (17)
Header checksum: 0x7859 [validation disabled]
[Header checksum status: Unverified]
Source: static.226.167.34.188.clients.your-server.de (188.34.167.226)
Destination: 192.168.0.73 (192.168.0.73)
User Datagram Protocol, Src Port: coap (5683), Dst Port: 56911 (56911)
Source Port: coap (5683)
Destination Port: 56911 (56911)
Length: 41
Checksum: 0x38a3 [unverified]
[Checksum Status: Unverified]
[Stream index: 1]
Constrained Application Protocol, Acknowledgement, 2.04 Changed, MID:41783
01.. .... = Version: 1
..10 .... = Type: Acknowledgement (2)
.... 1000 = Token Length: 8
Code: 2.04 Changed (68)
Message ID: 41783
Token: 398d7e264ddd9768
End of options marker: 255
[Request In: 13]
[Response Time: 0.049948917 seconds]
[Uri-Path: /a]
Payload: Payload Content-Format: application/octet-stream (no Content-Format), Length: 2
Data (20 bytes)
Data: 3138382e3133342e38362e3232363a3536393131
[Length: 20]

Анализ пакетов CoAP:
Порт назначения - 5683, протокол UDP.
В первом передается указатель (Uri-Query: cid=) во втором возвращается значение (Data).
Сервер static.226.167.34.188.clients.your-server.de (188.34.167.226)
Длина пакета запроса 89 байт, ответ состоит из 41 байта.

Как можно видеть, в данном случае ответ содержит строку в виде набор шестнадцатеричных чисел без пробелов:
31 38 38 2e 31 33 34 2e 38 36 2e 32 32 36 3a 35 36 39 31 31
(Эти цифровые данные, могут содержать, например, команды управления для конечного устройства или наоборот, телеметрию для сервера - битовые поля о включенных/выключенных кнопках устройства, информацию о температуре, напряжении, уровне тонера, количестве напечатанных страниц).

Что такое протокол "Интернета вещей" CoAP

Протокол CoAP представляет собой упрощённый http протокол, работающий через udp.
В отличие от http протокола, который строго текстовый, CoAP может передавать в запросе и ответе и бинарные данные тоже.

Поскольку UDP не гарантирует доставку, реализован контроль приема.

С целью экономии ресурсов канала передачи, в протоколе CoAP очень часто используются "Piggy-backed" ответ. (В логистике в сфере грузоперевозок данный термин "piggyback" означает попутная доставка груза). Здесь в вместе с квитанцией о приеме сразу отправляется результат обработки запроса.

Для передачи текста в запросах и ответах используется кодировка UTF-8. Если в качестве запроса или полезной нагрузки используется строка, то её длина не превышает 270 байт. Что сделано для маломощных устройств (с малым объемом ОЗУ). Но некоторые теги могут повторяться по нескольку раз, чтобы передать всю необходимую информацию.

Безопасность: ответ должен соответствовать запросу ("Request/Response Matching").
В piggy-backed ответе токен ответа должен соответствовать токену запроса.

Запрос:
request

Ответ:
response

Отмечу, что время между запросом и ответом небольшое - всего 50 миллисекунд.

Описание полей запроса и ответа

Опции делятся на две группы "критичные" и "факультативные". Разница в том, как обрабатываются нераспознанные параметры конечной точкой:

  • факультативные параметры, если их значение не распознано конечной точкой, ДОЛЖНЫ молча игнорироваться.
  • нераспознанные параметры класса "критичные" в корректно составленном запроса, ДОЛЖНЫ вызывать ошибку "Bad Option". Этот ответ должен включать в себя пригодное для чтения человеком сообщение об ошибке.
  • все нераспознанные "критические" сообщения в ответе ДОЛЖНЫ быть отвергнуты с сообщением о перезапуске
  • факультативные параметры в ответе сервера, не распознанные клиентом, ДОЛЖНЫ молча игнорироваться.

Следует отличать критичные и факультативные сообщение от "обязательных". Никакая опция в CoAP не является обязательной. Все эти правила придуманы для обработки нераспознанных (или нереализованных) запросов и ответов.

No. Критич­ность Имя Формат Длина, байт Описание
1 ДА Content-Type uint 0-2 Тип формата сообщения
0 - text/plain; charset=utf-8
40 - application/link-format
41 - application/xml
42 - application/octet-stream
47 - application/exi
50 = application/json
2 нет Max-Age uint 0-4 60 секунд по умолчанию - максимальное время ответа в секундах от 0 до 2^32-1
3 ДА Proxy-Uri string 1-270 Запрос к proxy, а не к серверу. Содержит URI для запроса к proxy, Proxy-Uri можно рассматривать как запрос к кешу.
4 нет ETag скрытый 1-8 Дополнительный "ярлык" для проверки безопасности. Ответ будет возвращен, только если проверка Etag сервером прошла успешно. При успешной проверке, сервер обязан выслать ответ.
5 ДА Uri-Host string 1-270 Интернет-хост - сервер обслуживающий запросы.
6 Location-Path string 1-270 Аналогичен Uri-Path, но может быть указан в запросе несколько раз
7 ДА Uri-Port uint 0-2 Интернет-порт на сервере
8 Location-Query string 1-270 Аналогичен Uri-Query, но может указан в запросе несколько раз
9 ДА Uri-Path string 1-270 Интернет - абсолютный путь на сервере к ресурсу
11 ДА Token скрытый 1-8 Токен безопасности (в ответе и запросе Token должны совпадать)
12 нет Accept uint 0-2 Типы данных, воспринимаемых клиентом, см. Content-Type
13 ДА If-Match скрытый 0-8 Предварительные условия. Ответ поступит только если выполнено условие (совместно с тэгом ETag) - используется для конкурентных запросов на обновление данных от нескольких клиентов во избежание перезаписи данных
15 ДА Uri-Query string 1-270 Название ресурса назначения на сервере назначения. Может содержать любые символы кроме "." и "..". Не используется кодирование (русских) букв при помощи %. Подразумеваются только символы UTF-8.
21 ДА If-None-Match нет 0 Обратное условие If-Match. Ответ поступит только если условие не выполнено. См. If-Match - логика работы обратная.

Выводы:

  1. Изучение пакетов Интернета вещей с помощью WireShark открывает лишь наружную часть протокола (можно узнать IP адрес сервера, запрошенный URI ресурс и ответ - данные в закодированном или ином нечитаемом для человека виде).

  2. Запрос и данные хотя и был декодированы, невозможно понять внутреннюю логику приложения: узнать, для чего предназначено устройство, и кто владелец домена, куда произошла отправка данных.

  3. Пакеты, которые я перехватил, очень короткие - приблизительно 40-89 байт длиной. Пакеты идут группами: запрос-ответ.

  4. Период времени между передачами (пакетов и групп) в стандарте CoAP может быть весьма значительным - от нескольких минут до многих месяцев и даже лет.

Защита CoAP при помощи DTLS

Если необходима повышенная безопасность и защита содержимого от чтения и изменения во время передачи, вместе с CoAP может использоваться DTLS - реализация TLS поверх UDP. При использовании DTLS обеспечивается защита соединений и протоколов, а также самих данных.


Источники:

Ссылки:



Похожие публикации