Python으로 WOL 매직패킷 전송하기
사실 별거 없다... 파이썬 socket통신을 이용하면 될 뿐이기에...
1. WOL 패킷 생성코드
import socket, struct
def WOL(macAddr):
sep = macAddr[2]
macAddr = macAddr.replace(sep,'')
data = b'FFFFFFFFFFFF' + (macAddr * 16).encode()
send_data = b''
for i in range(0, len(data), 2):
send_data += struct.pack('B', int(data[i: i + 2], 16))
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(send_data, ('192.168.35.255',9))
WOL('11:22:33:44:55:66')
코드 설명
> sep = macAddr[2]
> macAddr = macAddr.replace(sep,'')
: MAC주소에서 ':' 을 제거합니다.
> data = b'FFFFFFFFFFFF' + (macAddr * 16).encode()
> send_data = b''
: data는 WOL 패킷에 전송할 데이터이며, send_data는 실제 전송을 위해서 인코딩된 값이 들어갑니다.
> for i in range(0, len(data), 2):
> send_data += struct.pack('B', int(data[i: i + 2], 16))
: struct.pack(format, value) 함수는 value에 해당하는 값을 원하는 포맷으로 반환합니다.
: 'B'는 unsigned char형태를 의미합니다. 와이어샤크에서 봤었듯이 전송할 데이터가 FF FF FF 와 같이 2byte 단위 데이터이기 때문에 2byte씩 끊어서 unsigned char형태로 변환해주는 작업을 해주었습니다.
: 포맷형식을 변환하여 사용도 가능하지만, 예를들어 unsigned int를 사용할 경우 8byte의 반환값을 갖기 때문에 range(0, len(data), 8)로 설정해줘야하며, 이 경우 전체 데이터의 길이가 8로 나누어 떯어지지 않으면 별도의 처리를 해야하는 문제가 있습니다.
> sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
: socket을 정의합니다. 전송할 WOL패킷은, UDP를 사용하기 때문에 SOCK_DGRAM을 사용합니다.
> sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
: socket의 옵션을 설정합니다. 망내에 Broadcasting 시킬 예정이기에 위와같이 설정해야합니다.
(아래와같이 망주소를 알 경우 안써도 되는거 같습니다.)
> sock.sendto(send_data, ('192.168.35.255',9))
: 변환된 데이터를 원하는 망(192.168.35.255)에 9번 포트로 전송합니다.
전송결과
위에 보이
는것처럼, 전송결과 WOL프로토콜로 인식되는 패킷을 송신하는 것을 볼 수 있었습니다.
패킷의 전송내용도 기존에 어플을 이용해서 보냈던것과 거의 큰 차이가 없습니다.
차이는 ID, Checksum, 그리고 flags에서 보이는데, ID는 패킷마다 독립적으로 부여되는 값이기에 다른것이 정상이며, Checksum 역시 패킷의 값에 의존하기 때문에 달라질 수 있습니다. (기능적 문제 X)
Flags에서 차이가 있었는데, 확인하보니 Don't Fragment에 대한 부분이 채크가 안된것을 볼 수 있었습니다.
하지만, 전송하는 데이터의 크기가 144byte기 때문에 정상적인 망에서 해당 패킷이 Fragment(단편화)가 될 일이 없음으로 전혀 문제가 없습니다.
이상입니다~
끝 ㅎㅎ
궁금한것 댓글로 주세요~
'이론 > 네트워크 이론' 카테고리의 다른 글
[네트워크 이론] 1. 네트워크의 종류 (0) | 2019.09.27 |
---|---|
[와이어샤크 DNS 패킷] WireShark DNS Packet (0) | 2019.07.24 |
[와이어샤크 HTTP Handshake] WireShark HTTP Packet Capture (3) | 2019.07.24 |
[네트워크 패킷] Python으로 WOL패킷 송신하기(1/2) (0) | 2019.05.14 |
[네트워크 이론] 회선교환과 패킷교환 (0) | 2019.03.21 |