Wake-On-LAN hoạt động như thế nào
How do Wake-On-LAN works
Có nhiều tình huống mà bạn muốn bật máy tính từ một địa điểm ở xa. Ví dụ: quản trị viên hệ thống cần nâng cấp và sao lưu mọi máy khách trên mạng sau giờ làm việc và chế độ tiết kiệm năng lượng được bật để tiết kiệm năng lượng hoặc bạn có máy chủ kết xuất ngốn điện không được sử dụng 24/7. Bài đăng này sẽ tập trung vào việc triển khai kỹ thuật về cách thức hoạt động của Wake-on-LAN trong khi bài đăng sau sẽ trình bày cách kích hoạt nó trong BIOS và hệ điều hành.
Có nhiều trường hợp bạn muốn bật máy tính từ một vị trí ở xa. Ví dụ: quản trị viên hệ thống cần nâng cấp và sao lưu mọi máy khách trên mạng sau giờ làm việc và chế độ tiết kiệm năng lượng được bật để tiết kiệm năng lượng hoặc bạn có máy chủ kết xuất ngốn điện không được sử dụng 24/7.
Bài đăng này sẽ tập trung vào việc triển khai kỹ thuật về cách Đánh thức trên mạng LAN hoạt động trong khi bài đăng sau sẽ trình bày cách kích hoạt nó trong BIOS và hệ điều hành.
Wake on Lan là gì
Wake-On-Lan là giao thức mạng đánh thức máy tính hoặc máy chủ khi giao diện mạng nhận được Magic Packet. Giao diện ethernet với tính năng Wake-on-LAN được kích hoạt liên tục lắng nghe tất cả các khung phát sóng được gửi tới mạng và nếu nó phát hiện Magic Packet, tín hiệu khởi động sẽ được gửi đến BIOS để đánh thức máy tính.
Wake on Lan hoạt động như thế nào
Gói ma thuật được xây dựng theo chuỗi dữ liệu cụ thể. Trình tự đầu tiên có một luồng đồng bộ hóa được sử dụng để cho giao diện mạng biết rằng đây là điểm bắt đầu của một khung mới. Luồng đồng bộ hóa này được tạo thành từ 6 FF giây.
Sau luồng đồng bộ hóa, địa chỉ MAC của mục tiêu được gửi 16 lần mà không có bất kỳ dấu ngắt hoặc ký hiệu nào khác, đây là định dạng của tiêu chuẩn IEEE cho địa chỉ mac.
Một số phiên bản của Magic Gói cũng chứa trường mật khẩu ở cuối gói, trường này là tùy chọn nhưng sẽ bảo vệ máy tính không bị đánh thức bởi bất kỳ ai có quyền truy cập vào mạng. Tuy nhiên, không phải BIOS nào cũng hỗ trợ tính năng này. Bạn có thể đọc thêm về phần mật khẩu tại đây.
Với việc sử dụng Wireshark, chúng ta có thể xem ví dụ về hình thức của Magic Packet. Trong tab Wake-on-LAN trong gói mà chúng tôi đã chụp, chúng tôi có thể thấy cấu trúc gói. Ở đây chúng ta có thể thấy rằng đầu tiên nó bắt đầu bằng 6 FF và sau đó Địa chỉ MAC mục tiêu được lặp lại 16 lần.

Dưới đây là khối mã chứa dữ liệu thô của Magic Packet đã được gửi trên mạng. Mỗi địa chỉ MAC lặp lại không có dấu phân cách và không có dấu phân cách giữa luồng đồng bộ hóa và địa chỉ MAC.
ff ff ff ff ff ff 12 34 56 78 9a bc 12 34 56 78
9a bc 12 34 56 78 9a bc 12 34 56 78 9a bc 12 34
56 78 9a bc 12 34 56 78 9a bc 12 34 56 78 9a bc
12 34 56 78 9a bc 12 34 56 78 9a bc 12 34 56 78
9a bc 12 34 56 78 9a bc 12 34 56 78 9a bc 12 34
56 78 9a bc 12 34 56 78 9a bc 12 34 56 78 9a trước công nguyên
12 34 56 78 9a bc
Cách gửi gói Magic
Gói ma thuật không cần toàn bộ ngăn xếp mạng để hoạt động vì giao diện ethernet chỉ quét sau gói ma thuật. Do đó, gói ma thuật có thể được gửi tới mạng bằng bất kỳ mạng hoặc giao thức truyền tải nào, tuy nhiên, cách dễ nhất là gửi gói dưới dạng gói dữ liệu UDP.
Khi sử dụng UDP, gói ma thuật thường được gửi đến địa chỉ quảng bá. Địa chỉ quảng bá là một địa chỉ đặc biệt được sử dụng để quảng bá một gói tin tới toàn bộ mạng hoặc một phân đoạn của mạng. 255.255.255.255 là địa chỉ được sử dụng cho mạng IPv4.
Mạng IPv6 không có địa chỉ quảng bá mà thay vào đó sử dụng địa chỉ phát đa hướng. Cổng 9 là cổng được sử dụng nhiều nhất để gửi dữ liệu tới nhưng cổng này khác nhau giữa cổng 0, 7 và 9
Giới hạn của Wake On Lan
Wake-On-Lan có một số hạn chế, hạn chế lớn nhất là nó không thể đánh thức các máy tính không nằm trên cùng mạng hoặc cùng VLAN với thiết bị gửi gói ma thuật.
Có thể Wake on LAN không đánh thức máy tính nếu bạn chưa biết địa chỉ MAC, do đó bạn không thể gửi gói ma thuật đến địa chỉ IP để đánh thức máy tính. Máy tính mà bạn đang cố đánh thức cũng cần được kết nối bằng cáp ethernet vì không thể gửi gói ma thuật qua wifi.
Nếu bạn gửi một gói ma thuật đến máy tính thì không có gì đảm bảo rằng máy tính thực sự sẽ nhận được gói và thức dậy và bây giờ bạn cũng sẽ không nhận được gói ma thuật đó nếu máy tính thức dậy vì không có xác nhận nào rằng máy tính đã nhận được gói ma thuật chính xác.
Cách thực hiện tự triển khai ở Golang
Bây giờ chúng ta đã biết cách tạo gói ma thuật, chúng ta có thể triển khai phiên bản của riêng mình ở Golang để tạo một công cụ đánh thức máy tính hoặc máy chủ của chúng ta khi chúng ta không muốn đến chỗ chúng để bật chúng hoặc có một máy tính từ xa có Raspberry Pi được kết nối mạng.
Tạo gói ma thuật
Để tạo gói ma thuật, chúng ta cần tạo một chuỗi có 6 FF rồi lặp lại địa chỉ MAC 16 lần mà không có bất kỳ dấu ngắt hoặc bất kỳ dấu phân cách nào khác. Để bắt đầu, chúng ta tạo một hàm tạo gói ma thuật, hàm này sẽ được gọi là CreateMagicPacket().
Hàm sẽ lấy một chuỗi làm đối số, đối số này có tên MACaddress, hàm cũng sẽ cần trả về một phần của byte và Lỗi. Điều đầu tiên mà hàm cần làm là kiểm tra xem địa chỉ MAC được cung cấp có hợp lệ hay không, việc này có thể được thực hiện với thư viện regexp mà Golang cung cấp.
|
|
Lát biến chuỗi dấu phân cách được sử dụng sau này để tìm kiếm các dấu phân cách khác nhau có thể được sử dụng trong địa chỉ MAC.
reMAC được khai báo bằng biểu thức chính quy được sử dụng để xác định xem MACaddress có hợp lệ hay không Địa chỉ MAC. Tiếp theo, biến MAClà kết quả được tìm thấy khi sử dụng reMAC.find từ đối số MACAddress. Nếu biến MAC là nil thì chương trình sẽ trả về gói ma thuật có giá trị nil và lỗi cho biết rằng địa chỉ MAC được cung cấp là không hợp lệ.
|
|
Khi chúng tôi biết rằng địa chỉ MAC là hợp lệ, đã đến lúc xóa các dấu phân cách tồn tại trong địa chỉ MAC. Chúng tôi sẽ lặp lại địa chỉ MAC bằng cách sử dụng lát được khai báo trước đó có dấu phân cách được đặt tên và xóa mọi dấu phân cách mà nó tìm thấy.
|
|
Bây giờ chúng ta đã có địa chỉ MAC hợp lệ để sử dụng trong gói ma thuật, đã đến lúc lặp lại địa chỉ đó 16 lần, việc này được thực hiện với chuỗi gói và chức năng Lặp lại
|
|
Bước cuối cùng để tạo gói ma thuật là chèn luồng đồng bộ hóa lên phía trước và giải mã nó từ một chuỗi thành một lát byte.
Gửi gói ma thuật
Bây giờ lẽ ra chúng ta đã tạo một gói ma thuật, đã đến lúc gửi nó qua mạng tới máy tính mà bạn muốn thức dậy. Để gửi gói, thư viện net ở Golang sẽ được sử dụng. Gói mạng trước tiên sẽ xác thực địa chỉ IP đã cho rồi mở kết nối UDP để gửi gói.
Một hàm mới sẽ được sử dụng để gửi gói, hàm này sẽ được gọi là SendMagicPacket và nhận ba đối số. Đối số đầu tiên chúng ta cần là magicPacket được tạo trong hàm cuối cùng với loại []byte, đối số thứ hai là string cho địa chỉ IP mà gói cũng sẽ được gửi. Cuối cùng, cần có int cho port đích cho cổng đích.
Đầu vào addr để xem đó có phải là địa chỉ IP hợp lệ hay không, sau đó kết hợp với cổng thành một kết nối chuỗi.
|
|
Gói net có chức năng tiện dụng để kiểm tra xem IP có hợp lệ hay không, net.ParseIP. net.ParseIP sẽ được sử dụng để kiểm tra thay vì sử dụng biểu thức chính quy. Thao tác này sẽ đặt biến IP thành nil nếu đó không phải là địa chỉ IP hợp lệ.
Ở cuối đoạn mã, IP và cổng hợp lệ được kết hợp để tạo chuỗi kết nối. Chuỗi kết nối sẽ được sử dụng để tạo kết nối với mạng.
|
|
Với thư viện mạng, chúng ta có thể tạo kết nối với mạng bằng chức năng Dial. Chức năng này trước tiên lấy mạng mà nó đang kết nối và sau đó là địa chỉ của mạng mà bạn muốn kết nối. Vì Wake-on-LAN không có kết nối nên cách dễ nhất là sử dụng UDP vì không cần thiết lập kết nối với máy chủ trước khi gửi gói.
Sau mạng mà nó sẽ sử dụng, địa chỉ mà nó sẽ kết nối phải được cung cấp. Địa chỉ này đã được tạo trước đó trong tập lệnh bằng cách kết hợp địa chỉ với số cổng.
Golang có một từ khóa đặc biệt gọi là trì hoãn và nó chạy mã ở đây khi chức năng hoàn tất. defer conn.close() sẽ đóng kết nối với mạng khi hoàn tất.
|
|
Kết nối chưa được mở, để mở kết nối, biến conn được tạo trước đó sẽ được sử dụng để gửi điều kỳ diệu gói vào mạng. Biến conn có chức năng phụ Write sẽ được gọi để gửi gói tới mạng. Nếu chức năng Write không trả về lỗi thì gói ma thuật đã được gửi tới mạng.
Tuy nhiên, điều này không có nghĩa là gói ma thuật đã đánh thức máy tính hoặc máy chủ
Mã đầy đủ cho cả chức năng và phần mềm hoạt động đều có trên Github: GitHub - xaner4/Gawakeup: Golang Wake on LAN gói
Tài nguyên
- https://en.wikipedia.org/wiki/Wake-on-LAN
- https://wiki.wireshark.org/WakeOnLAN
- https://www.amd.com/system/files/TechDocs/20213.pdf
Xem thêm
Tác giả: swq115