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

Проблема с маршрутизацией в Linux

Для теста драйвера, над которым я работаю, мне нужно подключить 2 машины Linux через третью машину Linux, которая действует как маршрутизатор. Каждая машина имеет собственное сетевое устройство с 2 портами, так что один порт находится в подсети 11.x.x.x, а второй - в подсети 12.x.x.x. Сервисный порт, через который я подключаюсь удаленно, находится в подсети 10.x.x.x. Тест проводится только на проприетарных устройствах в 11 и 12 подсетях.

Иллюстрация конфигурации машины:

A (11.0.0.1) <-> B (11.0.0.2) || - C (11.0.0.3)

A (12.0.0.1) - || В (12.0.0.2) <-> С (12.0.0.3)

(Дословное описание иллюстрации: первый порт A подключен к первому порту B, второй порт B подключен ко второму порту C, а второй порт A и первый порт C отключены.)

Я настроил B (маршрутизатор) для пересылки IP-запросов. Затем я настроил A и C, используя ip route команда оболочки так:

А

ip route add "12.0.0.0/16" via 11.0.0.2

B

ip route add "11.0.0.0/16" via 12.0.0.2

Это работает. Пингую 12.0.0.3 из А с любым размером пакета, и это работает, и наоборот. Проблема в том, что мой TCP-код не работает должным образом между А и C. Он работает только с соседними машинами, например А+B и B+C.

Простой скрипт на Python, который отправляет "Hello World!" строка через TCP работает, но когда тот же сценарий отправляет сообщение размером более 1450 байт, ничего не проходит. Соединение установлено между двумя хостами, но информация не поступает. Здесь еще раз важно упомянуть, что ping с пакетами размером более 1450 байт работает.

Думаю, я, наверное, здесь что-то не так делаю с конфигурацией машины маршрутизации или неполной конфигурацией в ip route.

Что могло вызвать такую ​​проблему?

Просто идея, MTU (максимальная единица передачи) обычно составляет 1500 байт. Проверьте с помощью ifconfig. 1450 звучит очень близко к 1500 - заголовки IP + TCP. Если вы увеличите MTU на обоих интерфейсах на всех машинах, сможете ли вы передавать более крупные пакеты TCP?

ifconfig <device> mtu 2000

Я не знаю о том, что ping-пакеты выше 1450 байт работают.

  1. Убедитесь, что на маршрутизаторе нет брандмауэра (11.0.0.2 / 12.0.0.2). Используйте iptables -F.

  2. Убедитесь, что переадресация IP включена. Если вы просто измените /etc/sysctl.conf, потребуется перезагрузка. Используйте sysctl net.ipv4.ip_forward, чтобы узнать, включена ли переадресация ip или нет.

  3. Если вышеперечисленное не работает, запустите wirehark или хотя бы tcpdump на всех трех узлах, а затем запустите свою программу.

У вас есть сетевая фильтрация (например, iptables) на роутере?

Если вы выполняете фильтрацию по состоянию и разрешаете NEW, вы также должны разрешить RELATED и ESTABLISHED пакеты. В противном случае будет разрешен только первый пакет, который выглядит так, как у вас здесь.

Небольшое замечание: вы указываете вышеупомянутые сети как / 16, но обычно это / 8 сети, которые вы хотите соединить. Целевые хосты для тестирования на 11.0.. и 12.0.. и настроены ли маршрутизаторы для работы с правильными сетями?

Вау, я забыл об этом вопросе. С тех пор я сменил рабочее место.

Но ответ был прост - оказалось, что это не сработало из-за ошибки в драйвере, которую мы и тестировали. Как раз отказал такой базовый компонент в драйвере, что мы не думали, что описанная проблема может быть вызвана отказом в драйвере.

Спасибо за помощь :)