PHP를 이용한 매직패킷 전송 (WOL)

목차

     

    요즘에는 대부분의 공유기에서 WOL(Wake On Lan)을 지원하고 편하게 등록이나 관리가 가능하지만

     

    공유기 관리페이지에 로그인 -> WOL 메뉴 선택 -> PC 선택 -> 시작

     

    과 같이 사용시에는 여러 단계를 거쳐야 한다.

     

    보안상 아무나 접근하면 안되는 페이지이기 때문이다.

     

    PHP에서 직접 매직패킷을 전송하여 WOL이 가능하기 때문에 코드를 검색해봤다.

     

    여러가지 코드가 있는데 나는 아래 출처 사이트에서 아래 코드를 복사해와 약간 수정하였다. 

     

    원본과 다른점은 IP를 입력할 필요 없도록 수정한 것이다.

     

    WakeOnLan호출시 맥어드레스만 넣어주면 바로 동작하므로 보안방법이 필요한데 나같은 경우는 외부에서는 접근하지 못하도록 내부 전용 DNS를 등록하여 사용중이다.

     

    등록된 주소로 접속시 바로 PC가 켜진다.

     

    이외의 방법으로는 로그인을 적용한다거나 남들이 알지 못하는 포트로 포워딩하는 방법 등이 있을 수 있다.

     

    참고로 아래 코드를 사용하기 위해서는 sockets 확장을 설치해야 한다.

     

    <?php
    # Wake on LAN - (c) HotKey (at SPR dot AT), upgraded by Murzik <tomurzik@inbox.ru>
    flush();
    
    function WakeOnLan($mac)
    {
        $addr = '255.255.255.255';
        $addr_byte = explode(':', $mac);
        $hw_addr = '';
    
        for ($a=0; $a < 6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));
    
        $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
    
        for ($a = 1; $a <= 16; $a++) $msg .= $hw_addr;
    
        // send it to the broadcast address using UDP
        // SQL_BROADCAST option isn't help!!
        $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
        if ($s == false) {
            echo "Error creating socket!\n";
            echo "Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
        }
        else
        {
            // setting a broadcast option to socket:
            $opt_ret = socket_set_option($s, 1, 6, TRUE);
            if($opt_ret < 0)
            {
                echo "setsockopt() failed, error: " . strerror($opt_ret) . "\n";
            }
            $e = socket_sendto($s, $msg, strlen($msg), 0, $addr, 2050);
            socket_close($s);
            echo "Magic Packet sent (".$e.") to ".$addr.", MAC=".$mac;
        }
    }
    
    #WakeOnLan('yourIPorDomain.dyndns.org', 'your:MAC:address');
    #WakeOnLan('192.168.0.2', '00:30:84:2A:90:42');
    #WakeOnLan('192.168.1.2', '00:05:1C:10:04:05');
    //if you have switch or other routing devices in LAN, sendign to
    // the local IP isn't helps! you need send to the broadcast address like this:
    WakeOnLan('00:05:1C:10:04:05');
    
    ?>

     

     

     

     

    출처

     

    http://php.net/manual/en/ref.sockets.php

     

     

    댓글