利用路由器端口转发实现远程桌面和远程唤醒

远程桌面是比较常用的工具,我们熟知的windows自带的远程桌面3389,由于公网的ipv4地址越来越紧缺,几乎只能在局域网使用。目前更常用的一般是商用的teamviewer、向日葵、anydisk等等。这些软件各有千秋,但teamviewer无疑是其中的佼佼者。

但是,

最近teamviewer被某丁代理了,免费用户限制特别多,动不动就要付费才能使用。于是这两天晚上回去没事折腾了一下其它方案。下面就把整个折腾过程记录下来,希望对各位同志有所帮助。

目标和需求

  • 1、实现远程控制。这是基本要求,因为办公时经常用到家里电脑的资源,而且不只是资料,最好是可以运行一些软件。尤其有些时候需要偶尔跑一跑程序,调试运行起来后就不想管他了,这种情况远程控制就比较实用了。这种需求很容易满足,可以用其它远程桌面工具替代teamviewer。

  • 2 实现远程唤醒。因为穷,电脑不能一直开着,电费交不起。所以需要受控设备平时处于关机或休眠状态,有需要的时候再开,也就是支持远程唤醒,让电脑随时可以开关机,真正实现远程的完全控制。teamviewer是支持远程唤醒的,如果你的teamviewer用起来没问题,设置方法在这里。而anydisk仅支持局域网内的唤醒,而且经过我的实验似乎局域网内也不太好用。所以要想办法解决这个问题。

实现方案

  • 方案一 利用智能插座+ bios电源接通自动开机+远程桌面工具。

这种方式其实很实用,但是要填硬件了。小米智能插座49块大洋也还可以接受,但是主板是否支持来电开机以及成功率如何我都没有试过,这种方案是我查资料时才想到的。如果有相同需求又不想折腾的同学可以试试这种方案。

  • 方案二 利用wake of lan(WOL)功能+路由器唤醒+花生壳内网穿透+anydisk

最先想到的就是这种方案。电脑想要通过网络唤醒必须要给网卡发送一个信号,我们在远程想要发送这个信号就需要知道家里网络的ip地址,但是现在家里的网几乎都是没有公网ip的,想直接给接到网线的电脑发送唤醒指令不太现实。所以我想到了路由器,可以用路由器在局域网内给电脑lan口发送唤醒指令,而且路由器本身就是需要长期运行的,功耗很低。我用的路由器是n年前大名鼎鼎的斐讯k1,之所以出名不是因为品牌多好,而是因为它是白送的,当然现在已经凉了。我的k1刷的padavan固件,是具有唤醒功能的。所以我只需要实现远程登录我的路由器,然后在路由器上实现远程唤醒,电脑唤醒以后就可以用anydisk等工具远程连接了。这种方案不需要新加硬件,很多新路由器都支持这种功能,或者可以通过刷openwrt、padavan、梅林、华硕等固件实现这种功能。不想折腾的直接买一个类似的智能路由也可以,价格几十块到几百块不等。

花生壳是动态域名解析和内网穿透的比较出名的提供商,可以为路由器建立一个域名,从而实现远程访问路由器。智能路由器的固件或软件商店中一般都有花生壳的客户端。以Padavan为例:登录路由器->扩展功能->花生壳内网版,点击启用,打开管理页面,会跳转到花生壳官网登录界面,刷新路由器界面,会出现SN号,在花生壳登录界面上账号输入SN号,密码admin,绑定账号,这样就实现了花生壳账号和路由器客户端的绑定。

绑定后进入花生壳管理后台,在内网穿透选项栏中添加映射。外网域名选择系统分配给你的,免费用户选择动态端口,内网主机设置成路由器登录地址,端口设置成80。完成效果如下图所示

添加成功后,现在应该是可以用花生壳后台生成的访问地址来访问你的路由器登录界面了。需要把访问地址里的tcp://换成http://,即形如http://xxx.xxx.xxx:12345的地址。某些路由器如果不能登录,可能还需要打开一下从外网访问。

至此已经可以从外网访问到路由器控制页面了。按照我们的思路,当电脑关机或睡眠时,通过路由器唤醒电脑。Padavan的唤醒路由选项在高级设置->内部网络->网络唤醒,点击被控主机唤醒。

当然唤醒电脑需要主板bios和网卡的支持和相应的设置。具体方法可以参考一下这篇文章。电脑唤醒以后就可以用anydisk等远程控制工具进行连接控制了。

方案2是我开始想到的比较直观的做法。但是花生壳给的免费域名和端口非常难记,每次需要登录路由器 还是觉得有些麻烦了 , 不能直接转发端口到主机(也有可能是我设置的问题),而且路由器暴露在外网难免有些安全隐患。

  • 方案三 WOL+路由器frp内网穿透+3389远程桌面

这是我目前正在用的方案,使用体验很不错。padavan固件上有ngrok和frp穿透工具,经过了解ngrok和frp都可以实现内网穿透并端口转发到被控主机,满足我们的需求,试用一下发现frp配置较为简单,而且padavan固件上ngrok默认配置选项使用的网上免费的ngrok服务器,本质上和花生壳内网穿透差不多,frp可以默认配置自建服务器,免费的公共frp服务器也更多,因此选用frp工具。

frp内网穿透的原理如下所示,找一个具有公网ip的主机当做frps服务器,它作为连接我们被控主机和控制主机的桥梁,当你想访问被控主机时,先给frps服务器发送数据,被frps转发到frpc客户端路由器,frpc客户端可以直接实现端口转发,将访问3389端口的数据转发到我们的被控主机。

这个frps服务器可以是公共的,当然也可以是自建的。公共的较为简单,直接登陆免费服务器网站,申请账号在后台配置即可,具体教程可以参考这里。因为我原来就有一台国内服务器一直工作良好,所以我采用的自建服务器,这篇文章主要讲自建服务器的情况。

frps服务器的安装和配置

如果各位同学没有云服务器,需要的话可以去阿里云、腾讯云、百度云等平台租用一台。学生优惠一般首年在100大洋以内。如果没这个预算就干脆用公共frp服务器,配置方法和自建服务器差不多,把地址改一下就好。在拥有一台服务器后,用ssh工具登陆到自己的服务器,进行以下操作。

下载frps服务端,并解压

wget https://github.com/fatedier/frp/releases/download/v0.16.1/frp_0.16.1_linux_amd64.tar.gz tar zxvf frp_0.16.1_linux_amd64.tar.gz cd frp_0.16.1_linux_amd64

修改配置文件,编辑frps.ini,按照以下方式更改

[common] #绑定端口 bind_port = 7000 #http端口,如果主机上有http服务就不要用80端口,随便给一个或者不用http就删掉。 vhost_http_port = 8080 #特权模式 privilege_mode = true #加入privilege_token 可以增加安全性,这样不是所有客户端都可以连接。 privilege_token = 51treenewbee.cn

随后可以运行frps服务器

./frps -c ./frps.ini

注意:1、frp的版本,0.16.1以后的版本和之前的版本不兼容。我选择的客户端和服务端都是0.16.1版本,其它版本在这里下载;2、服务器防火墙对应端口要打开,包括后面要配置的客户端远程端口。

客户端配置

padavan 固件是有frpc客户端的,在扩展功能->花生壳内网映射->frp这个位置。点击启用frp内网穿透、启用frpc客户端,版本选择和服务器相兼容的。然后frp_script中配置frpc脚本。

#==========客户端配置:========== [common] #填写服务器地址,可以是ip也可以是域名 server_addr = 51treenewbee.cn server_port = 7000 #privilege_token 要和服务端一致 privilege_token = 51treenewbee.cn [rdp] privilege_mode = true #这里是远程主机的端口,将来用远程桌面连接的时候就是地址+这个端口 remote_port = 3389 type = tcp #填写内网受控主机的地址 local_ip = 192.168.2.12 #本地端口就是远程桌面的端口3389 local_port = 3389 #换成自己的域名,也可以是2级域名。 custom_domains =51treenewbee.cn

#如果需要配置路由器远程登录控制, 在上面的 frpc 配置文件后面还要加上以下配置 [web] privilege_mode = true type = http local_ip = 127.0.0.1 #本地http端口 local_port = 80 #路由器访问域名 custom_domains =web.51treenewbee.cn

配置完成后用应用页面设置,从路由器的log中就能看到是否连接成功了,同时在服务器端 的运行窗口也能看到是否连接成功。如果一切顺利的话就会连接成功了。这时候可以尝试连接一下远程桌面。在受控主机上要配置好远程桌面,右键我的电脑->属性->远程设置勾选以下选项

正常情况下应该可以连接了,windows+r打开运行输入mstsc.exe回车,进入系统自带的远程桌面工具。地址填写我们客户端配置的 custom_domains,就可以连接到远程主机了, 账号密码就是我们正常登陆windows时的账号密码。但是,有的网络环境为了安全,屏蔽了3389端口。我就遇到了这种情况,手机端的 Microsoft remote disktop client 可以连接受控主机,而电脑上的远程桌面就是连接不上,后来想到了是端口被屏蔽了。解决办法很简单,将frc客户端上的remote_port端口更换成一个不敏感的端口,并在frc服务器上打开对应的端口。比如改成23333,这时候我们远程桌面访问的地址就变成了xxx.xxx.xxx:23333。

测试一下,手机和电脑都连接成功。

在调试过程中遇到一些问题,可以尝试用windows客户端来测试,或者将客户端拷贝到在路由器中测试也可以。我开始直接用padavan自带的frpc客户端连接不上,开启ssh直接将frpc客户端拷贝过去,在shell中运行调试通后发现是padavan固件的问题,升级固件后解决了。

服务端和客户端都正常后,可以用supervisor或screen实现后台运行。我们在用远程桌面就可以了。

试验一下,用anydisk远程唤醒,不管用。用3389远程桌面,休眠状态直接唤醒登陆,然后再用anydisk也没问题了。实测速度很快,当然这和你的服务器也有关系,正常情况下不传文件1M带宽已经足够流畅的控制了。手机上的microsoft remote disktop client软件也完全可以随时控制电脑。是不是很实用呢?

See Also