Есть ли способ направлять локально сгенерированные пакеты через два интерфейса (INTER-CHANGEABLE), используя Netfilter Queue & Iptables? - PullRequest
0 голосов
/ 28 марта 2020

Я довольно новичок в linux и работе с сетями, и я делаю проект об использовании нескольких подключенных интерфейсов, которые имеет клиент, wlan0 или eth0, для взаимодействия с inte rnet. Аппаратное обеспечение, которое я использую, - Raspberry Pi 3B + с Raspbian, в то время как программное обеспечение, которое я использую: netfilter, netfilter_queue, ip route, ip rule и iptables для управления моими пакетами. Я использую функцию MARK для отслеживания своих пакетов через сетевой стек и внутренней маршрутизации.

Я работал над этим до того момента, когда в коде я могу напрямую сказать моему Raspberry Pi отправлять пакеты в ТОЛЬКО wlan0 или eth0. Тем не менее, когда я изменяю свой код, чтобы обеспечить упорядоченное переключение интерфейсов, то есть отправку нескольких пакетов из wlan0, а остальные из eth0, система не следует моему коду и, похоже, работает неправильно. Примечание: мой основной фокус - UDP-пакеты для предотвращения асинхронной маршрутизации.

Я реализовал следующий метод:

  1. Перехватчики Netfilter перехватывают и ставят в очередь локально сгенерированные UDP-пакеты
  2. Программа очереди имеет внутренний счетчик, и когда пришло время перевернуть исходящий интерфейс, она помечает пакет по-разному, чередуя два помеченных состояния для fwmark в ip rule
  3. Пересылаемый и помеченный пакет отправляется в мою пользовательскую таблицу маршрутизации, которая содержит только одно описание интерфейса
  4. Затем отправляется пакет, который должен быть отправлен через этот интерфейс / устройство. передается в таблицу nat в цепочке POSTROUTING, чтобы адрес источника SNAT соответствовал адресу источника интерфейса.
  5. Исходящий пакет отслеживается ловушкой Netfilter, чтобы проверить, изменился ли IP

Вышеуказанный метод работает только тогда, когда я отправляю ТОЛЬКО через wlan0 или eth0 (все пометки задано верно для любого wlan0 / eth0, ничего для другого), поэтому весьма запутанно, почему он не работает для разделения использования между wlan0 и eth0. Команды из шагов 3-5 приведены ниже

Шаг 3 - таблица искажения iptables (сразу после netfilter_queue):

iptables -t mangle -A OUTPUT -o wlan0 -m mark --mark 0x1 -j MARK --set-mark 0x10
iptables -t mangle -A OUTPUT -o eth0 -m mark --mark 0x1 -j MARK --set-mark 0x10
iptables -t mangle -A OUTPUT -o wlan0 -m mark --mark 0x2 -j MARK --set-mark 0x11
iptables -t mangle -A OUTPUT -o eth0 -m mark --mark 0x2 -j MARK --set-mark 0x11

Шаг 4 - правило ip:

ip rule add fwmark 0x10 table out1
ip rule add fwmark 0x11 table out2

* Настраиваемые таблицы маршрутизации out1 и out2 содержат отдельные интерфейсы, поэтому их можно маршрутизировать только через это устройство.

Шаг 5 - Таблица iptables nat:

iptables -t nat -A POSTROUTING -m mark --mark 0x10 -j SNAT --to-source 192.168.0.1
iptables -t nat -A POSTROUTING -m mark --mark 0x11 -j MARK --to-source 192.168.0.2

Я бы хотел отложить до опыт сообщества в этом вопросе. Возможно ли для решения сетевого уровня настроить исходящий интерфейс выбора для пакетов? Или что-то не так с моим методом и как я это реализовал? При необходимости я смогу предоставить больше кода и команд.

...