특정 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에 대한 핑 응답이 지속적으로 깨우려고 시도하는 것을 방지하기 위해 실패한 경우에만 스크립트를 실행해야 합니까?

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

한 가지 가능한 접근 방식은 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가 핑으로 가득 차는 것을 방지하기 위해 다시 시작하기 전에 잠시 기다립니다 . $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

(면책조항: 테스트되지 않음)

관련 정보