林 徐,张继山
(安徽三联学院,安徽 合肥 230601)
互联网上远程终端唤醒技术与实现
林 徐,张继山
(安徽三联学院,安徽 合肥 230601)
本文介绍了远程唤醒的原理,并在局域网远程唤醒的基础上,将远程唤醒延伸至互联网环境下。通过对路由器和PC机的设置,实现包括手机在内的终端远程唤醒PC。
远程唤醒;魔术包;MAC地址;动态域名解析;路由
随着信息化应用的深入,个人往往需要将个人文件在互联网上他所使用的相互处于异地的终端上互传。因此,需要在互联网环境下远程开启冷机状态下的远程终端。
远程开机首先需要网卡支持远程唤醒(Wake On Lan WOL),远程唤醒的原理是在计算机处于关闭状态时,处于激活状态的网卡接收来自网络的符合特定的格式的数据包,如果收到数据包,就启动机器。远程唤醒的数据包是具有特定格式的UDP数据包,被称为“魔术包”(Magic Packet)。Magic Packet 是AMD公司的网络唤醒技术。数据报文的载荷部分共有102个字节,每六个字节为一组,共分成了17个组。其中,第1组为固定的“全F”即0xFFFFFFFFFFFF,第2-17组中的每个组都是远程机器网卡的MAC地址。
1.1 远程唤醒前的准备
远程唤醒的前提是,需要被唤醒的PC机已经作了以下的设置:
在CMOS中,设置“Wake On Lan”和“Wake On PCI Card”项的值为“Enable”;
(2)在网卡的属性设置中,保证“魔术封包唤醒”的值是“开启”;
(3)在电源管理里,勾选“只允许幻数据包唤醒计算机”。
1.2 使用UDP协议发送数据包
准备完成后,就可以向终端发送“魔术包”了。发送“魔术包”的方案有多种,目前,使用较多的是利用现成的网络唤醒软件(例如,AMD公司的Magic Packet)来发送此网络唤醒数据包。根据实际需要,也可以自己编程实现这一功能。本文采用C#实现这一功能,关键代码如下:
/// <param name="mac">MAC地址字符数组</param>public static void Wake (byte[] mac){UdpClient clnt= new UdpClient();clnt.Connect(IPAddress.Broadcast, 7);
byte[] pkt = new byte[17 * 6];
for (int i = 0; i < 6; i++) pkt[i] = 0xFF;
for (int i = 1; i <= 16; i++)for (int j = 0; j < 6; j++)pkt[i * 6 + j] = mac[j];
int rslt = clnt.Send(pkt, pkt.Length);}
由以上代码是在局域网同网段发送数据包,这个方法可以扩展到广域网。
在广域网中,需要被唤醒的终端往往是一台PC,这台PC通常被放置在一个子网内,因此,“魔术包”需要跨越层层路由,才能最终到达这台PC。然而,目前大多数的PC的IP地址都是动态的,这就意味着在广域网中无法用IP地址定位PC,因此需要在唤醒终端之前做一些准备。
2.1 开启DDNS客户端
DDNS(动态域名解析服务),被称为动态域名解析服务,是将动态IP地址映射到一个固定的域名解析服务上。每次连接网络的时候,客户端程序就会把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析。
利用DDNS的功能,可以在需要被唤醒的终端的网络出口网关上,或者在其内网的某个主机上开启DDNS客户端,这样可以保证在广域网中使用域名定位到需要唤醒的终端。
2.2 设置路由器的端口映射
端口映射就是将连通外网主机的一个网络端口映射到内网中一台提供相应服务的机器。通过在路由器上设置相应的端口映射,可以保证发送的的“魔术包”经过路由器后直达要被唤醒的终端。本文以思科路由器为例实现端口映射,关键配置命令如下:
ip nat inside source static tcp 192.168.0.100 7 202.99.111.2 7 extendable
如果使用的ADSL或动态IP,可以将上述的公网IP用WAN口名代替,例如:
ip nat inside source static tcp 192.168.0.100 7 interface Dialer100 7 extendable
2.3 设置路由器ARP协议绑定
ARP协议(Address Resolve Protocol),被称为地址解析协议,工作在第二层,即数据链路层,用于将IP地址转换为网络接口的硬件地址,即MAC地址。设置路由器的ARP绑定,可以在路由器动态分配IP地址的时候,将一个固定的IP地址分配给已经对应了的MAC地址。这样保证了从广域网接收的“魔术包”能够明确所要转发的目的地。以思科路由器为例,设置ARP绑定的关键配置命令如下:
router(config)# arp 202.99.111.2 0014.2ac3.d4bb arpa
2.4 广域网发送UDP包
由于发送端是处于广域网,所以在通过广域网,使用UDP协议发送“魔术包”之前,先用nslookup命令查询到需要唤醒的终端所在网关此时的动态域名所对应的IP地址,然后可以利用现成的第三方软件(例如,AMD公司的Magic Packet)来发送“魔术包”,也可以对上文代码稍加修改,实现广域网的远程唤醒,关键代码如下:
IPHostEntry host = Dns.GetHostByName(web); //web是动态域名字符串
UdpClient clnt = new UdpClient();
clnt.Connect(host.AddressList[0];, 7);//此处改广播发送为定向发送
上述代码完成的是先通过动态域名获取到IP地址,然后定向发送“魔术包”。
通过手机远程唤醒终端,实际是借助手机向需要唤醒的终端发送“魔术包”。发送“魔术包”之前的准备工作以及网络设置与上文所述相同。可以借助第三方的APP完成远程唤醒的任务,目前使用较多的有PC-Auto-Waker以及Wake-On-LAN Android版。也可以自己编程实现这一功能,关键代码如下:
byte[] mac = getMacBytes(Str_mac);
byte[] Bytes = new byte[6 + 16 * mac.length];
f
or (int i = 0; i < 6; i++) Bytes[i] = (byte) 0xff;
for (int i = 6; i < bytes.length; i += mac.length) System.arraycopy(mac, 0, bytes, i,mac.length);
InetAddress add = InetAddress.getByName(ipStr);
DatagramPacket pkt = new DatagramPacket(bytes, bytes.length, add, 7);
DatagramSocket skt = new DatagramSocket();
skt.send(pkt);
skt.close();
目前绝大多数的网卡都支持网络唤醒功能,只要在网络环境下,选择合适的发送端向需要唤醒的终端发送“魔术包”,就可以激活网卡的这一功能,进而达到远程开机的目的。
[1]张立成. 基于IP单播的远程唤醒研究及实现[J].软件导刊,2010(3):108-109.
[2]彭建业.基于NET的计算机远程唤醒技术及其实现[J].电脑编程技巧与维护,2012(14):86-87.
[3]王鹏冲.网络唤醒原理及其实现[J].茂名学院学报,2009,19(3):59-61.
Research and implementation of Internet remote wake-up
Lin Xu ZHANG Ji-shan
(Anhui Institute of Computer Engineering,Hefei Anhui 230601)
This paper introduces the principle of Remote Wake-Up, and based on remote wake on LAN, extends the remote wakeup to the Internet environment.
Remote Wake-Up; Magic Packets; MAC address; DDNS;Route
TP334.1
A
10.3969/j.issn.1672-7304.2016.05.025
1672–7304(2016)05–0051–02
2014年安徽省高等教育振兴计划教学改革与质量提升计划重大教学改革研究项目“基于校企合作的网络工程专业人才培养模式探索与实践”(项目编号:2014zdjy144)。
(责任编辑:廖建勇)
林徐(1972-),男,安徽合肥人,讲师,工程师,研究方向:软件工程。