Назад | Перейти на главную страницу

Ubuntu передает многоадресные пакеты TTL 0

IP-пакеты с TTL 0 не должны покидать хост.

Но когда я запускаю приложение, которое многоадресно передает UDP-пакеты с TTL 0, я вижу, что пакеты с TTL 0 покидают хост на несколько секунд и возвращаются к нормальному поведению с TTL 0. Это, скорее всего, происходит после перезагрузки и первого запуска приложения.

Я подтвердил, что пакеты с TTL 0 покидают хост с tcpdump:

05:31:39.048304 IP (tos 0x0, id 14487, offset 0, flags [DF], proto UDP (17), length 1344)
    192.168.1.200.46968 > 239.0.0.1.1234: UDP, length 1316
05:31:39.049594 IP (tos 0x0, id 14488, offset 0, flags [DF], proto UDP (17), length 1344)
    192.168.1.200.46968 > 239.0.0.1.1234: UDP, length 1316
05:31:39.051601 IP (tos 0x0, id 14489, offset 0, flags [DF], proto UDP (17), length 1344)
    192.168.1.200.46968 > 239.0.0.1.1234: UDP, length 1316
05:31:39.053584 IP (tos 0x0, id 14490, offset 0, flags [DF], proto UDP (17), length 1344)
    192.168.1.200.46968 > 239.0.0.1.1234: UDP, length 1316

Как мы можем видеть ttl не отображается, что означает TTL 0, что подтверждается на странице руководства tcpdump: https://www.tcpdump.org/manpages/tcpdump.1.html (поиск ttl, в нем четко указано: ttl - время жизни; не сообщается, если он равен нулю).

Нет никаких iptables правила запущены.

uname -a: Linux mydevice 4.15.0-101-generic #102-Ubuntu SMP Mon May 11 10:07:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

lsb_release -a:

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:        18.04
Codename:       bionic

Что может быть причиной такого поведения и как я могу это решить?

Решение - присоединиться к группе многоадресной рассылки с

setsockopt(sockFd, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast<const char*>(&mcastJoinReq), sizeof(ip_mreq))

перед многоадресной рассылкой с sendto().

Мое предположение всегда заключалось в том, что мне не нужно присоединяться к многоадресной рассылке, когда мне нужно только отправлять многоадресную рассылку, т.е. я никогда не буду звонить recvfrom() получать многоадресную рассылку. Но независимо от того, только отправка / только получение, мы должны подключиться к многоадресной рассылке.