내 홈 네트워크 다이어그램은 다음과 같이 매우 간단합니다.
internet --> Optical modem --> router --> pc1 ,pc2
111.111.111.111--> 192.168.1.1 -->192.168.31.1 --> 192.168.31.144,192.168.31.173
ISP는 111.111.111.111
광 모뎀의 IP 주소를 192.168.1.1
, 라우터의 IP 주소를 192.168.31.1
, PC1의 IP 주소를 192.168.31.144
, PC2의 IP 주소를 192.168.31.173
, PC1의 MAC 주소를 이라고 가정합니다 xx.xx.xx.xx
.
내 라우터에서 작동 openwrt
하여 라우터에 포트 전달 규칙을 추가하고 방화벽을 켭니다.
forwarding rule
name protocl outer port inner IP address inner port
wakeonwan UDP 9 192.168.31.144 9
ssh TCP and UDP 10000 192.168.31.1 22
그리고 openwrt에서 IP 주소와 Mac을 바인딩합니다.
ip address mac interface
192.168.31.144 xx.xx.xx.xx ??
다음 옵션 중에서 어떤 인터페이스를 선택해야 합니까?
내 라우터에 Telnet을 연결합니다.
ssh [email protected] -p 10000
라우터에서 wol 명령을 실행하십시오.
/usr/bin/wol -i 192.168.31.255 xx.xx.xx.xx
pc1은 라우터에서 깨어날 수 있습니다!
다음 Python 코드를 사용하여 pc1을 종료하고 pc2에서 깨우십시오 wakeonlan.py
.
from wakeonlan import send_magic_packet
send_magic_packet('xx.xx.xx.xx')
pc2에서 이 명령을 실행하면 python3 wakeonlan.py
pc1을 성공적으로 깨울 수 있습니다.
원격으로 명령을 실행해도 python3 wakeonwan.py
(예: 회사 컴퓨터에서) 내 pc1을 깨우지 못합니다.
cat wakeonwan.py
mac = "xx.xx.xx.xx"
target_ip = "111.111.111.111"
from wakeonlan import send_magic_packet
send_magic_packet(mac, ip_address=target_ip,port=9)
오류가 발생하지 않습니다. pc1이 깨어나지 못하는 이유는 무엇입니까 wakeonwan.py
?
lib로 해보자-- paramiko
.
pip install paramiko
아이테 wakeonwan-paramiko.py
:
import paramiko
from contextlib import contextmanager
host = '111.111.111.111'
username = 'root'
password = 'password'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=username, password=password,port=10000)
stdin, stdout, stderr = ssh.exec_command("/usr/bin/wol -i 192.168.31.255 xx:xx:xx:xx")
ssh.close()
python3 wakeonwan-paramiko.py
외부 네트워크에서 내 집 컴퓨터를 깨울 수 있습니까? wakeonwan.py
원격 깨우기 컴퓨터를 프로그래밍하는 것이 더 쉽습니까?
어떻게 고치나요?
답변1
로컬 네트워크 외부에서 Wake-on-LAN 패킷을 보낼 때 까다로운 부분은 완전히 수동적인 PC1이 패킷을 수신할 수 있도록 라우터가 패킷을 로컬 네트워크로 보내도록 하는 것입니다.
매직패킷은 라우터의 외부 IP 주소로 전송되어유니캐스트 패킷. 라우터의 전달 규칙은 대상 PC의 자체 IP 주소를 내부 IP 주소로 지정합니다. 따라서 유니캐스트 트래픽을 전달하는 표준 절차에 따라 라우터는 먼저 대상 PC의 MAC 주소를 찾기 위해 ARP 요청을 보내지만... 대상 PC가 다운되었기 때문에 아무런 응답도 받지 못합니다. Wake-on-LAN 패킷을 기다리는 네트워크 인터페이스는 저전력 수신 전용 모드입니다. 일반적으로 ARP 요청에 응답할 수 없습니다.
ARP 요청이 실패하면 라우터는 "Host Unreachable"을 나타내는 ICMP 오류 패킷을 다시 보낼 수 있습니다. 그러나 Pythonwakeonlan 모듈에는 ICMP 메시지가 수신되지 않았다고 가정하더라도 이러한 오류 응답을 처리할 수 있는 능력이 없는 것 같습니다. 편집증으로 돌아가는 길은 방화벽에 의해 걸러졌습니다.
실제로 MAC 주소를 매직 패킷 페이로드에 포함시키는 것은 라우터가 이에 대해 알지도 관심도 없기 때문에 별로 도움이 되지 않습니다. 라우터에게 매직 패킷은 또 다른 TCP 또는 UDP 패킷일 뿐이며 정상적으로 처리됩니다.
매직 패킷이 브로드캐스트가 되려면 내부 네트워크의 브로드캐스트 주소로 전송하도록 전달 규칙을 구성해야 합니다. 이렇게 하면 라우터는 패킷을 내부 네트워크로 전달하기 전에 ARP 쿼리를 수행할 필요가 없습니다. 따라서 내부 네트워크의 넷마스크가 255.255.255.0인 경우 전달 규칙에서 내부 IP 주소로 192.168.31.255를 사용해야 합니다.
하지만...@AB가 의견에서 언급했듯이 Linux 기반 라우터는 일반적으로 유니캐스트를 브로드캐스트로 변환하는 것을 좋아하지 않으므로 이 접근 방식은 작동하지 않을 수 있습니다.
또 다른 해결책은 대상 PC의 정적 ARP 테이블 항목을 라우터의 ARP 테이블에 추가하여 ARP 조회가 필요하지 않고 패킷이 내부 네트워크로 전달되도록 하는 것입니다.
빠른 소스코드 검사로,네트워크 Python 모듈 깨우기SOCK_DGRAM을 사용하는 것 같습니다. 이는 UDP를 사용한다는 의미입니다. 따라서 전달 규칙을 "TCP 및 UDP"에서 "UDP 전용"으로 변경할 수 있어야 합니다.