Chắc hẳn nhiều người cần kiểm tra xem gói tin magic packet đã chuyển đến máy tính cần WOL hay chưa. Dưới đây là đoạn code python đơn giản để mở một port ra internet và kiểm tra xem gói tin gửi đến port đó có phải là Magic Packet (Gói tin để WOL) hay là không. Gói tin magic packet chứa 6 byte FF và 16 lần địa chỉ MAC của máy tính cần WOL
1. Cài đặt môi trường python
Để chạy được python thì cần cài đặt python vào máy theo đường dẫn: Download Python | Python.org
2. Tạo mã mở port và kiểm tra gói tin bằng python
Mở python IDLE (Python 3.12 64-bit) tại menu start
IDLE (Python 3.12 64-bit)
Sau đó vào File ==> New
Dán đoạn code phía bên dưới vào và lưu file lại.
Sửa port (1234) được bôi vàng bên dưới. Và địa chỉ MAC của máy tính cần kiểm tra tín hiệu WOL.
Lưu ý WOL sử dụng UDP do đó sẽ listen cả UDP và TCP cho chắc chắn.
3. Cài đặt Port Forward cho Router (Tùy chọn)
Liên hệ nhà mạng để được hỗ trợ chuyển sang NAT (Thông báo tổng đài viên là nhà có camera cần xem camera từ bên ngoài, đề nghị mở NAT để xem cam).
4. Lưu ý khi cài đặt WOL
a. WOL trong LAN
Khi WOL trong LAN thì nên cài các app hỗ trợ broadcast.
Thường các APP sẽ gửi magic packet đến toàn bộ LAN nên WOL luôn hoạt động.
b. WOL từ internet (Wake on WAN)
Khi WOL từ internet, bạn cần phải cố định IP-MAC của máy tính vào trong bảng ARP ở phần bảo mật của Router hoặc trong DHCP reservation. Mục đích việc này là mình cài Port Forward thì router sẽ chuyển tiếp gói tin đi theo Port cài sẵn và Router sẽ biết Port nào đó thuộc về IP đó là có địa chỉ MAC đó để chuyển gói tin đi.
Ví dụ: Cài đặt WOL cho IP: 192.168.0.198 thì làm như sau:
-- Đặt IP-MAC bind cho 192.168.0.198 <==> AA-BB-CC-DD-EE-FF
-- Cài đặt port forward: External Port 1234, Internal Port: 1234, LAN IP: 192.168.0.198 sau đó lưu lại.
(Giải thích: khi có một tín hiệu mạng tới cổng 1234 từ bên ngoài thì router sẽ chuyển tới cổng 1234 nội bộ trong LAN. Tín hiệu này khác WOL trong LAN do không thể chuyển tới Broadcast trong LAN được. Nếu không cài đặt IP-MAC bind thì router sẽ không nhớ được sẽ chuyển tới địa chỉ MAC nào do khi tắt sẽ không còn duy trì IP trong bảng ARP của router nên router không biết chuyển đi đâu. Do đó phải cài IP-MAC bind để router chuyển đúng tới IP có địa chỉ MAC đó).
Sau khi chạy code python bên dưới sẽ hiện bảng thông báo cho phép tường lửa và bắt đầu lắng nghe (listen) trên cổng đã thiết lập (ví dụ cổng 1234). Nếu gửi WOL thành công tới đich thì tên thông báo của cửa sổ python sẽ hiện Magic packet received from {addr} via UDP nếu đúng là Magic packet
hoặc là Data received via UDP is not a magic packet nếu không phải Magic packet
Chúc bạn thành công cài đặt WOL
#Đoạn mã python tạo 1 port và lắng nghe xem gói tin gửi tới có phải Magic packet hay không.
import socket
import threading
PORT = 1234
# Kiểm tra magic packet pattern: 6 bytes of FF + 16 repetitions of the MAC address
def is_magic_packet(data, mac_address):
mac_bytes = bytes.fromhex(mac_address.replace(":", "").replace("-", ""))
magic_packet = b'\xff' * 6 + mac_bytes * 16
return magic_packet in data
def listen_for_udp_magic_packet(mac_address, port=PORT):
# Create UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', port))
print(f"Listening on UDP port {port} for magic packet...\n")
try:
while True:
# Receive UDP data
data, addr = sock.recvfrom(1024)
print(f"Received UDP data from {addr}")
# Check if the data is a magic packet
if is_magic_packet(data, mac_address):
mac_bytes = data[6:102]
mac_addresses = []
for i in range(0, len(mac_bytes), 6):
mac = mac_bytes[i:i+6]
mac_address = ':'.join(f'{byte:02x}' for byte in mac)
mac_addresses.append(mac_address)
print(f"Magic packet received from {addr} via UDP")
else:
print("Data received via UDP is not a magic packet")
except KeyboardInterrupt:
print("Stopping UDP listener.")
finally:
sock.close()
def listen_for_tcp_connections(port=PORT):
# Create TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', port))
sock.listen(5)
print(f"Listening on TCP port {port} for connections...")
try:
while True:
conn, addr = sock.accept()
print(f"TCP connection established with {addr}")
# Receive TCP data
data = conn.recv(1024)
print(f"Received TCP data: {data} from {addr}")
conn.close()
except KeyboardInterrupt:
print("Stopping TCP listener.")
finally:
sock.close()
# Thay đổi MAC của máy tính hiện tại
mac_address = "AA-BB-CC-DD-EE-FF"
# Create separate threads for UDP and TCP listeners
udp_thread = threading.Thread(target=listen_for_udp_magic_packet, args=(mac_address,))
tcp_thread = threading.Thread(target=listen_for_tcp_connections)
udp_thread.start()
tcp_thread.start()
udp_thread.join()
tcp_thread.join()
Post a Comment