
Я запускаю программу на Raspberry Pi, которая считывает данные с датчиков и отправляет их на сервер через UDP. Для отладки и мониторинга этих данных я перенаправил эти UDP-данные на свой ПК с помощью iptables на Raspberry Pi:
sudo iptables -t nat -A OUTPUT -p udp -d 192.168.178.10 --dport 4000 -j DNAT --to-destination 192.168.178.22:4000
Используемые IP-адреса:
192.168.178.10 - сервер,
192.168.178.22 - ПК, используемый для отладки.
Это работает хорошо. Однако данные попадают только на ПК, но не на сервер.
Поэтому я попытался скопировать и переслать данные UDP как на ПК, так и на сервер, используя что-то вроде этого:
sudo iptables -t mangle -A POSTROUTING -p udp -d 192.168.178.10 --dport 4000 -j TEE --gateway 192.168.178.22
Я использовал различные комбинации параметров, такие как mangle/nat, POSTROUTING/OUTPUT/PREROUTING и т. д.
Пока мне не удалось отправить данные в оба пункта назначения. Поскольку данные генерируются локально, я предположил, что -A OUTPUT должен работать. Но, видимо, я что-то упускаю...
Также я могу очистить правила iptables с помощью
sudo iptables -F
sudo iptables -X
Но правило все равно выполняется, и мне приходится перезагружать Raspberry Pi, чтобы начать с нуля.
Итак, есть два вопроса:
Как работает дублирование и пересылка локально сгенерированных данных?
Как эффективно очищаются правила?
Все найденные мной примеры применимы к входящему/исходящему трафику, но не к локально сгенерированным данным.
решение1
Теперь — случайно — я нашел решение:
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A OUTPUT -p udp -d 192.168.178.10 --dport 4000 -j DNAT --to-destination 192.168.178.22:4000
sudo iptables -t mangle -A POSTROUTING -p udp -d 192.168.178.22 --dport 4000 -j TEE --gateway 192.168.178.10
Это работает хорошо, однако кажется излишне сложным, поскольку я ожидал, что это можно сделать с помощью одного правила.
Может быть, у кого-то есть идеи, как это упростить.