写在前面
之前一直是用向日葵或者todesk进行远程访问主机的, 虽然很方便, 却也存在有广告, 需要登录, 延时高等问题.
在此之前也有了解过一些内网穿透+Windows Remote Desktop的策略, 但是当时技术不行, 也没有合适的服务器选择. 这次有了阿里云, 就能大干一场了.
技术栈: Ubuntu/Windows batch file/frp(server&client)
下面看方法, 部分参考1.
安装配置frp(云服务端)
安装
这里我依然选择了/opt
目录, 最后一行删除了客户端(因为这个是在云服务器上的配置, 不需要)
wget https://github.com/fatedier/frp/releases/download/v0.45.0/frp_0.45.0_linux_amd64.tar.gz
tar zxvf frp_0.45.0_linux_amd64.tar.gz
mv frp_0.45.0_linux_amd64 /opt/frp
rm -f frpc*
基本配置文件
vim /opt/frp/frps.ini
写入下面的内容:
[common]
bind_port = 7000
dashboard_port = 7500
# dashboard's username and password are both optional,if not set, default is admin.
dashboard_user = admin
dashboard_pwd = admin
第二行为服务器开启的端口, 第三行是服务器的前端控制界面(仪表盘)
最后的两行是控制界面的用户名和密码, 这里就默认了.
开启端口
跟之前的配置VNC端口类似, 这里直接copy了, 先在阿里云的控制面板添加:
(需要开启6000
, 7000
, 以及7500
端口)下面仅以7000
为例.
firewall-cmd --zone=public --add-port=7000/tcp --permanent
查看端口状态:
firewall-cmd --query-port=7000/tcp
netstat
查看服务器是否开启了任务监听对应端口:
sudo netstat -tunlp | grep 7000
这里应该显示如下:
tcp6 0 0 :::7000 :::* LISTEN 587/frps
查看防火墙的端口开放情况:
sudo iptables -L -n --line-numbers | grep 7000
若没有, 需要用下面的方法开启:
sudo iptables -I INPUT -ptcp --dport 7000 -j ACCEPT
最后刷新防火墙:
firewall-cmd --reload
端口部分就完成了.
配置守护进程与开机启动
然后对守护进程进行配置, 这里参考2.
先在/opt/frp/
目录下新建一个脚本文件, (vi startup_frp.sh
)写入:
#!/bin/bash
nohup bash -c '/opt/frp/frps -c /opt/frp/frps.ini' > /opt/frp/log.txt 2>&1 &
上面的命令是后台运行frps
服务.
这里有个小插曲: 关于使用了
nohup
命令之后, 行末尾还要不要加&
(ampersand)我一开始是没有加的, 后来发现不加的话在终端会话消亡之后命令仍在运行, 看到了一篇文章3之后我明白了, 还是要加的. 在
nohup
命令末尾加和不加&
, 其区别在于:
- 加的话: 直接进入后台运行
- 不加的话: 先在登录的终端会话中运行(前台运行), 当会话窗口关闭之后, 由
nohup
命令向内核发送子进程, 然后让执行的前台程序转为后台运行.
然后crontab -e
写入:
@reboot /opt/frp/startup_frp.sh
重启之后, 就可以看到frp
服务进程在运行了.
root 536 0.1 0.5 727044 20816 ? Sl 15:50 0:00 /opt/frp/frps -c /opt/frp/frps.ini
root 1695 0.0 0.0 9032 716 pts/0 S+ 15:53 0:00 grep --color=auto frp
被远控的Windows客户端安装与配置
安装
图形界面操作..
配置
编辑frpc.ini
文件:
[common]
server_addr = <公网IP>
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6000
这里要注意本地端口(local_port)的写法, 应该是Windows远程桌面的端口3389
, 其他除了公网IP需要修改外,都保持默认即可.
创建开机启动项
这里又是走了很多弯路, 一开始我想通过设置任务计划程序的方法, 但是屡屡失败, 总是无法正确启动客户端程序, 后来我通过设置开机启动服务的方法4搞定了, 由于不想用网络上的bat2exe, 这里我给出了一种取巧的方法:(C语言大法)
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("e:\\frp\\frpc.exe -c e:\\frp\\frpc.ini >> e:\\frp\\log.txt");
return 0;
}
编译一下:
gcc -o open_frp open_frp.c
然后通过cmd的管理员权限输入下面的命令, 来创建开机启动服务:
sc create open_frp binPath=e:\frp\open_frp.exe start=auto
如果创建错了的话可以删除服务:
sc delete open_frp
重启, 然后就可以连接了~
对于Win11, 同样的方法不能奏效, 可能是因为Win11的安全性机制, 这时候可以直接将
open_frp
程序的快捷方式(软链接)拖入shell:startup
文件夹内, 然后就可以在任务管理器中看到启动程序增加了open_frp
, 重启之后发现可以直接远控了.
连接(通过微软远程桌面)
这里也有个坑, 由于我之前一直通过在线账户登录Windows, 这就导致我没办法登录远程桌面, 因为在线账户的用户名是一段邮箱, 而远程桌面不支持, 换成本地账户登录之后, 问题就解决了… 这也是我之前一直没有解决的问题..
确认两端的服务都处于启动状态, Linux服务器用ps aux | grep frp
, Windows在任务管理器中就可以看到frpc
程序在运行了.
然后开启远程桌面, 填入主机名:<公网IP>:6000
, 之后创建链接之后输入用户名和密码即可连接, 完美~
小结
讲讲我配置这个内网穿透以及远程控制的心得体会, 配置起来虽然有一点难度, 但是还是乐在其中, 对Windows和Linux的定时任务与一些脚本的写法有所了解. 再就是关于远程桌面的一些缺点, 列出下面几条:
- 开启远程桌面之后会开启一个新的会话(session), 之前的主机桌面处于锁屏状态, 如果输入登录密码, 这时候就会导致远程连接失效, 也就是说同一时刻只有一方可以控制主机. 这点与向日葵不同, 向日葵支持两方(被控端和远控端)同时操作.
- 开机启动项方面还是Linux比较方便简单, 虽然用的是命令行, 但是配置起来很直观, 一行完事. 反观Windows这边, 需要先把命令写入C程序, (不知道还有没有别的办法, bat2exe感觉不安全), 然后写入开机启动服务.
- 不能同时占用一个端口, 例如两台Windows电脑, 同时占用同一端口就会出现无法访问的情况, 这时候可以设置多个监听的客户端端口.