Я довольно новичок в 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-пакеты для предотвращения асинхронной маршрутизации.
Я реализовал следующий метод:
- Перехватчики Netfilter перехватывают и ставят в очередь локально сгенерированные UDP-пакеты
- Программа очереди имеет внутренний счетчик, и когда пришло время перевернуть исходящий интерфейс, она помечает пакет по-разному, чередуя два помеченных состояния для fwmark в ip rule
- Пересылаемый и помеченный пакет отправляется в мою пользовательскую таблицу маршрутизации, которая содержит только одно описание интерфейса
- Затем отправляется пакет, который должен быть отправлен через этот интерфейс / устройство. передается в таблицу nat в цепочке POSTROUTING, чтобы адрес источника SNAT соответствовал адресу источника интерфейса.
- Исходящий пакет отслеживается ловушкой 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
Я бы хотел отложить до опыт сообщества в этом вопросе. Возможно ли для решения сетевого уровня настроить исходящий интерфейс выбора для пакетов? Или что-то не так с моим методом и как я это реализовал? При необходимости я смогу предоставить больше кода и команд.