Невозможно получить UDP-пакеты с локального адреса канала
У меня есть программа, которая пытается связаться со встроенным устройством через UDP. Встроенное устройство имеет только локальный адрес связи (169.254.); хост Linux имеет нормальный (DHCP, RFC1918) адрес, управляемый NetworkManager в Ubuntu Natty. Это локальное соединение настроено на "использование этого соединения только для ресурсов в локальной сети". Моя программа отправляет широковещательный пакет на один сокет, а затем ожидает на одноадресном сокете (связан с локальным адресом, не подключен ()ed) для входящего пакета маяка
Иногда я обнаруживаю, что программа Linux не получает пакеты с локального адреса ссылки встроенного устройства. Wireshark показывает, что они поступают на входящий интерфейс и правильно сформированы, но они не получены. Пакеты, отправленные локально как с локального адреса RFC1918, так и на него, также принимаются, как и пакеты с других хостов RFC1918 в той же сети.
Я также обнаружил, что после перезагрузки это состояние обычно самопроизвольно исправляется; Я могу снова получать пакеты с локальных адресов. Иногда это также самопроизвольно исправляется после некоторого ожидания.
Есть какие-то неясные настройки маршрута или что-то, что может привести к потере входящих пакетов? Исходящие пакеты работают нормально (вероятно, потому что я пропускаю маршрутизацию при отправке пакетов).
Соотнося последний случай самопроизвольного восстановления, я нахожу это в журналах:
Jul 13 20:58:01 hakase NetworkManager[933]: <info> (eth0): DHCPv4 state changed preinit -> reboot
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Activation (eth0) Stage 4 of 5 (IP4 Configure Get) scheduled...
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Activation (eth0) Stage 4 of 5 (IP4 Configure Get) started...
Jul 13 20:58:01 hakase NetworkManager[933]: <info> address 192.168.0.148
Jul 13 20:58:01 hakase NetworkManager[933]: <info> prefix 24 (255.255.255.0)
Jul 13 20:58:01 hakase NetworkManager[933]: <info> gateway 192.168.0.1
Jul 13 20:58:01 hakase NetworkManager[933]: <info> nameserver '192.168.0.1'
Jul 13 20:58:01 hakase NetworkManager[933]: <info> domain name 'mshome.net'
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Scheduling stage 5
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Activation (eth0) Stage 5 of 5 (IP Configure Commit) scheduled...
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Done scheduling stage 5
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Activation (eth0) Stage 4 of 5 (IP4 Configure Get) complete.
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Activation (eth0) Stage 5 of 5 (IP Configure Commit) started...
Jul 13 20:58:01 hakase avahi-daemon[862]: Joining mDNS multicast group on interface eth0.IPv4 with address 192.168.0.148.
Jul 13 20:58:01 hakase avahi-daemon[862]: New relevant interface eth0.IPv4 for mDNS.
Jul 13 20:58:01 hakase avahi-daemon[862]: Registering new address record for 192.168.0.148 on eth0.IPv4.
Jul 13 20:58:02 hakase NetworkManager[933]: <info> Policy set 'Auto dfn3' (wlan0) as default for IPv4 routing and DNS.
Jul 13 20:58:02 hakase NetworkManager[933]: <info> (eth0): device state change: 7 -> 8 (reason 0)
Jul 13 20:58:02 hakase NetworkManager[933]: <info> Activation (eth0) successful, device activated.
Jul 13 20:58:02 hakase NetworkManager[933]: <info> Activation (eth0) Stage 5 of 5 (IP Configure Commit) complete.
Jul 13 20:58:03 hakase postfix/master[1245]: reload -- version 2.8.2, configuration /etc/postfix
[these next two lines are likely associated with the wireshark session I have running]
Jul 13 20:58:09 hakase kernel: [37294.962058] device eth0 left promiscuous mode
Jul 13 20:58:10 hakase kernel: [37295.323279] device eth0 entered promiscuous mode
Jul 13 20:58:11 hakase ntpdate[23459]: adjust time server 91.189.94.4 offset -0.024960 sec
Jul 13 21:02:40 hakase dhclient: DHCPREQUEST of 192.168.0.148 on eth0 to 192.168.0.1 port 67
Jul 13 21:02:40 hakase dhclient: DHCPACK of 192.168.0.148 from 192.168.0.1
Jul 13 21:02:40 hakase dhclient: bound to 192.168.0.148 -- renewal in 248 seconds.
Jul 13 21:02:40 hakase NetworkManager[933]: <info> (eth0): DHCPv4 state changed reboot -> renew
Jul 13 21:02:40 hakase NetworkManager[933]: <info> address 192.168.0.148
Jul 13 21:02:40 hakase NetworkManager[933]: <info> prefix 24 (255.255.255.0)
Jul 13 21:02:40 hakase NetworkManager[933]: <info> gateway 192.168.0.1
Jul 13 21:02:40 hakase NetworkManager[933]: <info> nameserver '192.168.0.1'
Jul 13 21:02:40 hakase NetworkManager[933]: <info> domain name 'mshome.net'
[at approximately one second later the connection to the link-local device was established]
Может ли это состояние перезагрузки каким-то образом быть связано с проблемой?
4 ответа
Статически назначьте локальный адрес на хосте Linux и посмотрите, исчезнет ли это. Убери DHCP из картинки. В худшем случае вы не получите эффект "самопроизвольного восстановления", когда он перестанет работать, но, по крайней мере, вы можете исключить беспокойство по поводу DHCP из своего списка.
И, если хотите, попробуйте назначить адрес 169.254/16 дополнительно и посмотрите, поможет ли это.
Там много запутанной информации, и единственный вопрос, который я вижу: "Есть ли какая-то неясная настройка маршрута или что-то, что может привести к потере входящих пакетов?"
Какой у тебя настоящий вопрос? Я отвечу на вопрос: "Я пытаюсь связаться с 169.254.100.15 из 192.168.1.101. Почему я не могу связаться с ним?"
Связь через сокет работает через TCP, верно?
Чтобы два хоста в разных подсетях могли общаться друг с другом, их необходимо маршрутизировать.
Локальные адреса ссылок (169.254.0.0/16) никогда не маршрутизируются ( http://en.wikipedia.org/wiki/Link-local_address).
Вы не можете говорить по адресу 169.254.0.0/16 из любой другой подсети. Ни как, ни как. Не сейчас, никогда.
Дополнительно: я просто подумал, что вы можете рассмотреть возможность использования обратной связи и адресации пакетов к интерфейсу.
Попробуйте запустить avahi-autoipd
чтобы ваша машина присваивала свой адрес 169.254/16, вы должны иметь возможность общаться с другими хостами в 169.254/16 в вашей локальной сети.
Что меня поразило в ваших выходных данных, так это обновление вашего IP за 248 секунд.
Итак, ваши проблемы начинаются после этих 248 секунд?
В этом случае dhcp-клиент может сделать некоторые нежелательные изменения конфигурации, когда возобновится обновление.
Есть ли причина для этого очень короткого периода времени?