인터넷에서 내부 LAN에 있는 일부 컴퓨터를 깨워야 합니다.
구성 방법이 거의 없는 다소 폐쇄적인 라우터가 있습니다.
데몬이나 이와 유사한 것이 포함되지 않기 때문에 netfilter(iptables)를 사용하여 이 작업을 수행하고 싶지만 다른 솔루션도 작동합니다.
내 의견은 다음과 같습니다.
- 외부 컴퓨터는 내부적으로 올바른 MAC을 포함하는 공용 IP 주소로 WOL(Wake on LAN) 패킷을 보냅니다.
- 데이터를 Linux 상자로 리디렉션하기 위해 라우터(예: 1234)에서 올바른 포트가 열립니다.
- Linux 상자는 UDP 유니캐스트 패킷을 브로드캐스트 패킷으로 변환합니다(대상 주소가 255.255.255.255 또는 192.168.0.255로 수정된다는 점을 제외하면 내용은 정확히 동일합니다).
- 멀티캐스트 패킷이 각 네트워크 카드에 도착하고 필요한 컴퓨터가 이제 깨어납니다.
이에 대한 매우 간단한 netfilter 규칙은 다음과 같습니다.
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255
아쉽게도 netfilter는 브로드캐스트 변환을 무시하는 것 같습니다. 192.168.0.255 및 255.255.255.255는 정보를 제공하지 않습니다. 또한 192.168.0.0 및 0.0.0.0으로 테스트했으며
tcpdump를 사용하여 무슨 일이 일어나는지 확인했습니다
tcpdump -n dst port 1234
13:54:28.583556 IP www.xxx.yyy.zzz.43852 > 192.168.0.100.1234: UDP, length 102
. 다음과 같은 두 번째 줄이 있어야 합니다.
13:54:28.xxxxxx IP www.xxx.yyy.zzz.43852 > 192.168.0.255.1234: UDP, length 102
멀티캐스트가 아닌 주소로 리디렉션하면 모든 것이 잘 작동합니다. 2개의 예상 행이 있습니다. 그러나 분명히 이것은 WOL에서는 작동하지 않습니다.
netfilter에게 브로드캐스트 패킷을 보내도록 지시하는 방법이 있습니까?
내가 생각한 다른 방법들:
- iptables를 사용하여 필요한 패킷을 일치시키고 기록하고 데몬을 사용하여 로그 파일을 모니터링하고 브로드캐스트 패킷을 트리거합니다.
- iptables를 사용하여 필요한 패킷을 브로드캐스트 패킷을 트리거하는 로컬 데몬으로 리디렉션합니다(더 쉬움).
- socat 사용(어떻게?)
답변1
socat
킬러 유틸리티입니다. 초기화 스크립트 어딘가에 이것을 넣으십시오:
socat -u -T1 UDP-LISTEN:1234,fork,range=<ip address of source>/32 UDP-DATAGRAM:255.255.255.255:5678,broadcast
일부 사용자는 UDP-LISTEN에 문제가 있으므로 UDP-RECV를 사용하는 것이 더 나은 것 같습니다(경고: 무한 루프에서 브로드캐스트 패킷을 보낼 수 있음).
socat -u UDP-RECV:1234 UDP-DATAGRAM:255.255.255.255:5678,broadcast
fork
socat
다음 패킷을 계속 청취 할 수 있습니다 .T1
분기된 하위 프로세스의 수명을 1초로 제한합니다.range
socat
이 소스의 패킷 만 수신합니다 . 이것이 실행 중인 컴퓨터가 아닌 다른 컴퓨터라고 가정하면 무한 루프가 발생하는 자신의 브로드캐스트 패킷을 수신하지 않는socat
것이 도움이 됩니다 .socat
255.255.255.255
.192.168.0.255
현재 네트워크 구조에 대해 생각할 필요 없이 복사하여 붙여넣기만 하면 됩니다.참고: 이렇게 하면 모든 인터페이스에 브로드캐스트 패킷이 전송될 수 있습니다.
여러분과 마찬가지로 저도 WOL이 모든 포트에서 작동한다는 것을 알았습니다. 이것이 믿을만한 것인지 모르겠습니다. 많은 문서에서는 포트 0, 7, 9에 대해서만 설명합니다.
이를 통해 권한이 없는 포트를 사용할 수 있으므로 socat
사용자로 실행할 수 있습니다 nobody
.
이 답변에 기여해주신 @lgeorget @Hauke Laging 및 @Gregory MOUSSAT에게 감사드립니다.
답변2
정의에 따르면 브로드캐스트 트래픽의 대상은 로컬 컴퓨터입니다. 이는 패킷이 192.168.0.255로 DNATed되었음을 의미하며, 커널은 패킷을 보고 목적지가 라우터 자체라고 판단하므로 INPUT 체인에서 패킷을 볼 수 있습니다. 라우터(및 기타 장치)는 192.168.0.255 패킷이 자신을 위한 것으로 간주하고 더 이상 전달하지 않을 것입니다. 브로드캐스트 패킷은 설계된 대로 라우팅/전달되지 않습니다.
언급된 ARP 트릭에 대한 좋은 해결 방법이 있습니다. IP 주소를 "잃게" 됩니다. 이 예에서는 가상 장치를 사용할 것입니다 . 네트워크의 어떤 장치에도 192.168.0.254
할당하지 마십시오 .192.168.0.254
컴퓨터에 절대 사용하지 않을 IP 주소에 대해 LAN 인터페이스에 고정 ARP 항목을 만듭니다.
arp -i ethLAN --set 192.168.0.254 FF:FF:FF:FF:FF:FF
이 가상 IP 주소에 대한 WAN 인터페이스의 DNAT Wake-on-LAN UDP 트래픽:
iptables --table nat --append PREROUTING --in-interface ethWAN --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.254
이는 WOL 패킷에 적합합니다. 이 해결 방법은 Mikrotik 장치 및 openwrt 장치와 같은 Linux 커널 기반 제품에도 적용됩니다. 나는 Mikrotik 장치에서 이 트릭을 사용하여 전화기를 사용하여 내 컴퓨터를 원격으로 깨울 수 있습니다.
답변3
내가 찾은Serverfault에 관한 이 질문에 관하여.
그러나 나는 내 라우터를 통해 그러한 브로드캐스트 트래픽을 얻지 못했습니다. DNATted 패킷은 FORWARD 체인에도 도달하지 않습니다. 어쩌면 이것을 허용하지 않는 이상한 커널 옵션이 있을 수도 있습니다.
하지만 ARP의 아이디어는 흥미롭습니다. 나는 이것이 전달된 트래픽만 도달할 수 있도록 패킷이 해당 주소로 전송되는 것을 금지하는 OUTPUT의 규칙을 동반해야 한다고 생각합니다.
답변4
실제로 netfilter는 브로드캐스트를 수행할 수 없지만 라우팅 메커니즘이 이를 수행합니다.
그러나 기본적으로 전달된 모든 브로드캐스트를 삭제합니다.
최근 Linux 커널(버전 5.0 경)에서는 직접 UDP 브로드캐스트 전달이 가능해졌습니다.
bc_forwarding
브로드캐스트 네트워크 인터페이스 매개변수를 수정해야 합니다 .
sudo sysctl -w net.ipv4.conf.eth1.bc_forwarding=1
(참고: net.ipv4.conf 옵션인 것 같습니다.모두.bc_forwarding이 작동하지 않습니다)
따라서 지금은 5.0 + iptables 정도의 커널이면 충분합니다.