当出现特定 TCP 流量时执行任务的脚本(Raspberry Pi OS Bookworm)

当出现特定 TCP 流量时执行任务的脚本(Raspberry Pi OS Bookworm)

我在家里的厨房中使用 Raspberry Pi 作为 Wifi 桥接器,为只有以太网的设备提供网络连接。
我使用了威尔·哈利的指南,效果很好。该部分已解决,但我还希望该设备能够无缝唤醒我的 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

最初,该脚本会不断唤醒我的 NAS,因为 tcpdump 正在查找 NAS IP 的 ARP 请求,这些请求是在客户端设备关闭时发生的,并且它们仅发生在 Pi 上。我花了一段时间才发现这一点。此外,tcpdump 将端口 21 写入“ftp”,因此当我添加端口 21 来过滤脚本时,它会停止工作。在 tcpdump 原始输出中看到 ftp 是纯文本后,我像这样添加了它。

真是太感谢你了!

答案2

一种可能的方法是监控通过 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 是否做出反应;如果没有:etherwake已启动。

然后我们会等待一段时间$timeout再重新开始,以防止 ping 淹没 NAS。应该$timeout是在 NAS 进入睡眠状态之前的超时时间附近。您可能想尝试一下。

您可以要求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

(免责声明:未经测试)

相关内容