特定のTCPトラフィックが発生したときにアクションを実行するスクリプト(Raspberry Pi OS Bookworm)

特定のTCPトラフィックが発生したときにアクションを実行するスクリプト(Raspberry Pi OS Bookworm)

私は家の台所にあるRaspberry PiをWi-Fiブリッジとして使用して、イーサネット専用デバイスへのネットワーク接続を提供します。
私はWill Haleyのガイドを使用し、それは素晴らしい仕事をしました。その部分は解決しましたが、デバイスがNASをスムーズに起動できるようにしたいのですが、クライアントデバイスではその機能を使用できません。

etherwake[NAS用のMACADDRESS]はうまく機能し、ターミナルを使用してRaspberry PiブリッジからNASを完全に目覚めさせることができるので、トリガーに基づいてそれを自動化したいと思います。

メディアアプリがクライアントデバイスにロードされたときにNAS(閉じている)に接続しようとすると、次のことが発生します。私はpktstat以下を表示しようとしました。

603.8 0% tcp 192.168.84.100:52787 <-> 192.168.84.2:21

192.168.84.2はNAS、.100はクライアントデバイスです。私はプライマリLAN FTPサーバーを使用して家の中でメディアを共有するので、ポート21を使用します。

そのTCPトラフィックを受信し、そのトラフィックがキャプチャされたときにセカンダリスクリプトを開始する永続スクリプト/サービスをどのように生成しますか(すでにWOLがあります)。
また、NASへのping応答が絶えず目覚めようとするのを防ぐために失敗した場合にのみスクリプトを実行する必要がありますか?

Piでこれを行うことができれば、誰かが台所でメディアプレーヤーをオンにするたびにNASがオフになっても目が覚めるでしょう。これは私たちの家族にとってとても良いです。

最近の電気価格は、不要なときにNASをオフにしてスリープ状態にするのが良いことを意味します。他のほとんどのデバイスにはWOL機能があるので、ここでは手動で作成してみました。

答え1

以下は、Ljm Dullaartの助けのおかげで問題を解決するソリューションです。

#!/bin/bash
interfacename=eth0
IPofNAS=192.168.84.2
MACADDRESSofNAS=AA:BB:CC:DD:EE:EE
timeout=300

while : ; do
    tcpdump -nt -i $interfacename -c1 dst $IPofNAS and port ftp
    if ! ping -c1 $IPofNAS ; then
        etherwake -i wlan0 $MACADDRESSofNAS
    fi
    sleep $timeout
done

最初は、tcpdumpがNAS IPに対するARPリクエストを探していたので、スクリプトは私のNASを目覚めさせました。これらの要求は、クライアントデバイスがオフになっているときに発生し、Piでのみ発生しました。これを発見するのに時間がかかりました。また、tcpdump はポート 21 を「ftp」に書き込むので、スクリプトをフィルタリングするためにポート 21 を追加すると動作が停止します。生のtcpdump出力でftpがプレーンテキストであることを確認した後、次のように追加しました。

とても感謝しています!

答え2

1つの可能なアプローチは、Piを通過してNASに移動するすべてのトラフィックを監視することです。トラフィックがある場合は、NASを目覚めさせてください。スクリプトでは次のようになります。

#!/bin/bash
interfacename=eth0
IPofNAS=192.168.84.2
MACADDRESSofNAS=00:11:22:etc
timeout=600

while : ; do
    tcpdump -nt -i $interfacename" -c1 dst $IPofNAS
    if ! ping -c1 $IPofNAS ; then
        etherwake $MACADDRESSofNAS
    fi
    sleep $timout
done

説明:NAS()に送信された単一のtcpdump -nt -i $interfacename -c1 dst $IPofNASパケットをダンプします。 DNS検証とタイムスタンプなし()。-c1dst $IPofNAS-nt

pingこれらのパケットが受信されると、NASが応答していることを確認するためにテストが行​​われます。それ以外の場合、etherwakeNAS が起動します。

$timeoutその後、NASがPingでいっぱいになるのを防ぐために、再起動する前にしばらく待ってください。$timeoutNASがスリープモードに移行するまでのタイムアウト時間でなければなりません。一度試してみることもできます。

systemdこのスクリプトの起動を要求できます。/etc/systemd/system/wolNAS.serviceコンテンツにする

[Unit]
Description=WOL of the NAS

[Service]
ExecStart=/bin/bash /usr/local/bin/the_script_above.sh

[Install]
WantedBy=multi-user.target

(免責事項:テストされていません)

関連情報