Вопрос или проблема
Используя Ubuntu 14
У меня есть машина с Linux, где есть два интерфейса:
eth1: 172.16.20.1
ppp0: 192.168.0.2
ppp0 подключен к устройству, у которого есть интерфейс PPP (192.168.0.1) и WAN интерфейс (172.16.20.2). Я могу подтвердить, что это устройство может достичь 172.16.20.1
Проблема, с которой я сталкиваюсь, заключается в том, что если я отправляю пакет с помощью Python на той же машине:
client.py
import socket
cl = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
cl.sendto("Hello", ("172.16.20.1", 5005))
server.py
import socket
srv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
srv.bind(("", 5005))
while True:
data, addr = srv.recvfrom(2048)
print("Сообщение: ", data)
скрипт работает нормально, но я не вижу пакет в Wireshark, выходящий из eth1 (я вижу его только когда выбираю захват на интерфейсе lo). Я предполагаю, что ОС определила, что пакет предназначен для одного из локальных интерфейсов, и не отправляет его через созданный сокет 192.168.0.2.
Когда я добавляю следующие правила, чтобы предотвратить это:
sudo ip route del table local 172.16.20.1 dev eth1
sudo ip route add table local 172.16.20.1 dev ppp0
sudo ip route flush cache
Что происходит:
- Теперь я могу видеть пакеты в Wireshark, приходящие на eth1, источник — это адрес WAN (172.16.20.2)
- Я не вижу никакого вывода от server.py после перезапуска программы.
Игнорируя интерфейс ppp0 и используя два интерфейса ethx:
Если я пытаюсь запустить программу на двух отдельных машинах (клиент и сервер) без применения правил, я могу видеть пакеты, приходящие на eth1 в Wireshark, и вывод на server.py. Если я пытаюсь запустить программу на двух отдельных машинах И применяю вышеуказанные правила для соединения ppp0 (я его не удалял), я больше не вижу никакого вывода от server.py, но все еще вижу пакеты, приходящие в Wireshark. Мои знания о стеке TCP/IP не очень хороши, но похоже, что канальный уровень больше не пересылает данные на уровень приложений?
похоже, что канальный уровень больше не пересылает данные на уровень приложений
Канальный уровень не является проблемой; он не затрагивается вашей конфигурацией. Дело касается сетевого уровня (IP).
Таблица local
— это способ ядра определить, может ли пакет быть доставлен локально. Вы удаляете IP-адрес, пакет маршрутизируется или отбрасывается.
Я полагаю, это работает только потому, что MAC-адрес находится в кэше ARP другой системы. Я бы ожидал, что принимающая система не ответит на ARP-запросы, если адрес отсутствует в локальной таблице.
Убедитесь, что контрольные суммы UDP и IP4 полученных пакетов правильные. Включите вычисление контрольной суммы в Wireshark и проверьте захват.
В моем случае, изначально, я не могу видеть и захватывать локальный трафик.
После расследования, коренной причиной является то, что я захватывал сетевой трафик на неправильном сетевом интерфейсе.
Например, я захватываю трафик сетевого интерфейса eth0
вместо трафика сетевого интерфейса loopback
.
Таким образом, чтобы видеть и захватывать локальный сетевой трафик, вы должны выбрать loopback
или any
, который захватывает трафик для всех доступных сетевых интерфейсов.
Ответ или решение
Когда вы сталкиваетесь с проблемой недоступности пакетов на сокете приложения, которые были захвачены в Wireshark, важно учитывать несколько факторов, касающихся конфигурации сети и маршрутизации, работающих на вашей системе.
Контекст проблемы
На вашей машине с Ubuntu 14 есть две сетевые интерфейсы: eth1
с IP-адресом 172.16.20.1
и ppp0
с IP-адресом 192.168.0.2
. Интерфейс ppp0
подключен к устройству с PPP-интерфейсом 192.168.0.1
и WAN-интерфейсом 172.16.20.2
, который может достигать 172.16.20.1
.
Когда вы запускаете клиентский скрипт на Python и отправляете сообщение на 172.16.20.1
, серверный скрипт успешно принимает это сообщение. Однако, вы не видите пакеты в Wireshark, если не выбираете интерфейс lo
(локальный интерфейс).
Причины проблемы
На низком уровне, когда пакет отправляется на локальный адрес, ОС распознает, что это сообщение предназначено для локального хоста, и обрабатывает его непосредственно, минуя уровень сетевой подсистемы. Это объясняет, почему вы видите пакет только на lo
, а не на eth1
.
Когда вы изменяете маршруты с помощью команд:
sudo ip route del table local 172.16.20.1 dev eth1
sudo ip route add table local 172.16.20.1 dev ppp0
sudo ip route flush cache
вы фактически заставляете систему обрабатывать этот пакет через ppp0
. При этом, пакеты приходят на eth1
, но теперь сервер не получает сообщение, поскольку маршрутизация была изменена.
Рекомендации по устранению неполадок
-
Проверка маршрутов:
Убедитесь, что таблицы маршрутов настроены правильно. Для проверки текущих маршрутов используйте команду:ip route show table local
-
Использование правильного интерфейса в Wireshark:
Обязательно выбирайте интерфейс, который соответствует вашим требованиям. Для захвата локального трафика также можно использовать интерфейсany
, который захватывает трафик со всех доступных сетевых интерфейсов. -
Проверка контрольных сумм:
Убедитесь, что получаемые пакеты имеют правильные контрольные суммы для UDP и IPv4. Включите проверку контрольных сумм в Wireshark и проверьте захваченные данные. -
Тестирование с удалёнными хостами:
Чтобы лучше понять, как работают маршруты, рассмотрите возможность тестирования скриптов на разных машинах. Это может выявить различия в поведении, которые могут помочь вам определить проблему в маршрутизации. -
Просмотр журналов и отладка:
Используйте системные журналы и утилиты отладки для мониторинга сетевых событий. Это может дать вам лучшие представления о том, что происходит на уровне ядра.
Заключение
Ваша проблема заключается в особенностях обработки локального трафика в сети Linux, которые могут препятствовать его отображению на ожидаемом интерфейсе. Поняв, как именно работает маршрутизация в вашей системе и корректно настроив её, вы сможете добиться необходимого поведения и видеть трафик в Wireshark. Всегда следите за тем, какой интерфейс вы используете для захвата трафика, и не забывайте проверять корректность сети и маршруизации.