外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机(详细)

之前文章向大家介绍了 外网环境下基于FRP、VNC技术远程访问计算机,实现内网穿透 以及利用 WOL远程唤醒功能 基于FRP、VNC技术实现远程开机。此后,基于Linux主机udp广播特性,更进一步,针对局域网内有Linux主机(如树莓派)的用户,介绍了更为简便的方式实现远程开机!

然而,上述方式或多或少都需要直接或间接借助其他设备才能完成内网计算机的唤醒,今天将向大家介绍当前唤醒最优方案:非公网IP用户如何直接穿透家庭路由器,一键唤醒内网计算机,实现远程开机。

需要提前准备的材料:
  • 路由器一台(本文以华硕AU886路由器为例);
  • 固件包(本文以华硕梅林固件为例);
  • 一台公网服务器(作为FRPS,实现内网穿透);
  • U盘\移动硬盘(用于文件的传输和挂载,存储)
  • 支持WOL远程唤醒的计算机(只要不是古老的计算机,默认上述要求都已经满足,具体要求点此查看)

一、配置计算机(默认已开启,一般可以跳过这一步)

1.主板 BIOS

BIOS 里关于 WOL 网络唤醒的选项一般有 wake on lan;resume on lan;power on PME;power on by PCI-E device; Power on by Onboard LAN 等等,将其设为 Enabled 即可。

2.网卡驱动

”控制面板-网络和 Internet-网络和共享中心-本地连接-属性-配置“:

“高级”选项卡如下图设置:
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
“电源管理”选项卡如下图设置:
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

windows[8-10]需要禁用windows的快速启动功能, 因为快速启动会使得网卡在关机时候处于彻底关闭的状态, 控制面板>>电源选项>>修改关机按键的功能>>修改不可用选项, 启动模式从快速启动改为普通模式。

二、路由器刷梅林固件

以华硕AC88U为例:

  • 梅林固件下载:https://pan.baidu.com/s/1SvH6NS-WZNaAZJwRGmH37w
    提取码:so3g
  • 还原包下载:https://pan.baidu.com/s/1FiRYUTcAEW7VHrQg4aeZQQ
    提取码:y7fe

还原路由器至出厂值,进入 “系统管理–系统设置”,按图示开启ssh以及JFFS,重启路由器以初始化JFFS。

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

注意:重启后检查Format JFFS partition at next boot是否已经自动还原为”否“,如果没有,手动调成“否”,否则下次开机会再次还原配置。

三、路由器配置

  • 计算机与路由器之间插上网线,以固定MAC码。
  • ”内部网络–DHCP服务器–手动指定 IP 的 DHCP 列表“,建立IP-MAC地址的映射。
    【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
  • ARP绑定静态ip地址
    由于在华硕路由器内,没有这个设置,因此我们选择通过用ssh命令的形式做ARP绑定。
arp -s 192.168.1.103 F0:76:1C:E1:EA:D8

上述设置在路由器重启(包括断电后),ARP绑定将会丢失,如需永久有效并且开机自启,需要分别利用文件不会丢失的jffs目录以及scripts开机自启脚本,具体操作如下:

cd /jffs/scripts/vi arp-s.sh         #建立启动脚本arp-s.sh;  

写入:

#!/bin/sh          
sleep 30          
arp -s IP地址 MAC 地址
chmod 7777 arp-s.sh
  • ”tools–scripts添加脚本“,脚本类型:WANSTART;脚本地址:/jffs/scripts/arp-s.sh

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
现在从理论上看,在内网环境下已经能够通过路由器控制界面唤醒本地计算机

进入”网络工具–通过网络(LAN)唤醒“,按下图设置后,检验内网环境下是否能够通过输入目标MAC码并点击”唤醒“按钮唤醒计算机。
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
之后关闭计算机,用处于局域网内的其他设备登陆路由器后台,点击唤醒,可以看到计算机被唤醒。

四、配置路由器SSH唤醒命令

1.安装entware环境

由于梅林是基于Entware来安装插件的,因此需要安装entware环境。
插入U盘/移动硬盘(推荐EXT4文件系统,可以用“分区助手”格式化方式更改挂载盘文件系统类型)

梅林固件可以在插入磁盘的时候自动识别文件系统并挂载,不过考虑到有些固件可能还没有很完善,所以给出手动挂载的方法,供参考。

# 挂载
mkdir /mnt/sda1
mount -t ext4 /dev/sda1 /mnt/sda1/# 检查
df -hFilesystem                Size      Used Available Use% Mounted on
/dev/sda1               916.9G      2.0G    868.4G   0% /tmp/mnt/sda1
#安装entware环境
entware-setup.sh

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

常见安装失败原因:在固件中的“软件中心”安装了“虚拟内存”。

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
因为这会导致jffs里的post-mount.sh在安装时不能正确产生,并且“虚拟内存”应用貌似卸载脚本有问题,正常卸载后相关的脚本仍然在jffs,这会致使entware环境重启后opt路径无效。同时本来安装 entware-ng就会创建虚拟内存。

情况一:先安装了“软件中心-虚拟内存”,后安装entware环境,entware将无法正常安装

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

情况二:先安装entware环境,后安装了“软件中心-虚拟内存”,路由器重启后entware环境丢失

而在成功安装entware环境后我们可以看到opkg被配置完成。

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

2.安装wakeonlan和etherwake工具

opkg install wakeonlan
opkg install etherwake

查看etherwake命令格式:

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

内网环境下尝试使用 etherwake -b [MAC] 唤醒计算机
如: etherwake -b F0:76:1C:E1:EA:D8
也可 ether-wake -b F0:76:1C:E1:EA:D8

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
在按照上述步骤全部操作完毕后,如果发现仍然无法正常唤醒路由器,多半是由于魔术包没有发在正确的内网里。可以尝试前往:“外部网络-双线路”,开启双线路,选择负载均衡,即可解决问题。其原理目前猜测是路由器的特殊地位(既是网关也是设备)造成的,欢迎评论讨论,
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
至此,在内网环境下,我们实现了通过一条路由器SSH命令唤醒局域网内指定主机。

五、使用Frp内网穿透路由器22端口,实现外网环境ssh登陆

方法1:传统frpc包配置,在此不在赘述。

缺点:需要解决开机数据丢失的问题

方法2:在固件”软件中心“直接下载使用Frpc

缺点:由于路由器固件下载的Frpc版本固定,因此VPS上的Frps版本需要向Frpc版本看齐(一般就是要求最新版本的Frp),如果之前VPS上已经做过其他穿透,极大可能老的Frps和路由器上的最新Frpc版本不一致,如果没有多余闲置穿透服务器,需要重装Frps版本,在本次穿透完成后可能会花费大量时间更改其他穿透客户端的版本,需要注意。

1.Frps配置

  • 首先前往“软件中心”查看“Frpc”版本号,下载与之对应的Frps文件。点此下载

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

  • 其次配置文件:
tar -zxvf 文件名       #解压缩cd 文件名              #进入解压目录#修改frps.ini文件
sudo vim ./frps.ini
[common]
bind_addr = 0.0.0.0
bind_port = 7000
token = 设置你的token
vhost_http_port = 8080
vhost_https_port = 443
dashboard_port = 7500
tcp_mux = true
max_pool_count = 50
log_level = info
log_max_days = 1
kcp_bind_port = 7000

开放服务器相应端口!
开放服务器相应端口!
开放服务器相应端口!

#在文件目录下,临时启动命令,查看是否报错
./frps -c ./frps.ini

0.20版本privilege_token应写作token,否则会出现 uthorization failed 报错。

2.路由器Frpc配置

前往“软件中心”下载“Frpc”,进入配置:

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
尝试使用服务器IP的6100端口远程登陆路由器shell命令行,成功,至此路由器22端口已成功穿透,实现外网环境ssh登陆。
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

六、进阶——外网环境下手机 语音/一键 唤醒内网计算机(以IOS为例)

1. 下载 捷径 app(iphone用户需要ios12版本)

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

2. 将开机SSH命令写入APP(用户密码指路由器ssh登陆密码)

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

3. 加入Siri

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

一键点击或语音唤醒:

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

七、简便替代方案

对于不想追求上述全部功能,或者远程唤醒使用频率较低(可以容忍多步操作)的读者,也可以选择在完成前文一(配置计算机)二(路由器刷梅林固件)两步骤并建立IP-MAC地址的映射后,直接尝试内网穿透路由器后台页面。

(1)在frpc中添加http穿透。

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
注意事项:
1、服务名称:名称不能重复。
2、域名配置(也可以直接填写主机ip地址):使用http或https穿透服务时,所有的“远程主机端口”都会默认绑定到“vhost http port”,懂web服务的应该知道,如果多个http都用80端口,需要绑定域名或者分配端口来进行区分服务,如果不指定域名那么将访问默认的80服务,同样,填写的域名也不能和服务器上其他的冲突。

(2)外网访问后台手动唤醒

如在frpc端域名名配置/sk选项选择了填写域名,需要进行域名解析。

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

域名配置/sk选择填写域名:通过 域名:8080 形式访问
域名配置/sk选择填写主机IP地址:通过 IP:8080 形式访问
这里在外网环境下我通过访问 “http://r.顶级域名.com:8080” 的方式登陆路由器后台

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网
进入后台在侧栏进入“网络工具”——>“通过网络(LAN)唤醒”——>“选择需要唤醒的机器mac码”——>“唤醒”。

【内网穿透开机】外网环境下基于路由器广播,一键唤醒内网计算机实现远程开机-编程知识网

如果服务器上开启了nginx的web服务,那么在安装的时候“vhost http port”或“vhost https port”将不能使用80或443端口,如果习惯访问地址后面不添加端口,可以使用nginx反向代理的代码,修改下面的代码后就可以使用“http://你设置的域名”来访问frp了,其他的代码自行百度如何设置反向代理解决,下面给出NGINX的配置:

map $http_x_forwarded_for $clientRealip {"" $remote_addr;~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
}server {listen 80;server_name manage.frp.com;  #为frp的控制台绑定一个域名,这样你就可以用http://manage.frp.com访问你的控制台了location / {proxy_pass http://127.0.0.1:6443;  #此处的6443就是你安装frp时设置的dashboard_port端口proxy_set_header Host $host;proxy_set_header X-Real-IP $clientRealip;  # $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}server {listen 80;server_name *.frp.com; #将所有的frp.com子域名都绑定,这样就不用客户端填写一个你设置一个了,这样你可以用http://lisi-route.frp.com或http://zhangsan-route.frp.com访问你的穿透服务了。location / {proxy_pass http://127.0.0.1:7080; #此处的7080就是你安装frp时设置的vhost_http_port端口proxy_set_header Host $host;proxy_set_header X-Real-IP $clientRealip;  # $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}