
我正在 Raspberry Pi 上運行一個程序,該程序從感測器讀取數據並通過 UDP 將該數據發送到伺服器。為了調試和監控這些數據,我使用 Raspberry Pi 上的 iptables 將 UDP 數據重定向到我的 PC:
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 - 用於偵錯的 PC。
這效果很好。然而,資料只到達PC,而不再到達伺服器。
所以我嘗試使用以下方式將 UDP 資料複製並轉發到 PC 和伺服器:
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
但規則仍然被執行,我必須重新啟動樹莓派才能從頭開始。
那麼有兩個問題:
本地產生的資料如何複製和轉發?
規則如何有效清理?
到目前為止我發現的範例都適用於傳入/傳出流量,但不適用於本地產生的資料。
答案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
這很有效,但是它似乎不必要地複雜,因為我預計這應該可以透過單一規則實現。
也許有人知道如何簡化它。