阿里云轻量应用服务器配置frp内网穿透通过mac远控win10主机配置指南

 
Category: Linux-Shell

写在前面

之前一直是用向日葵或者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的定时任务与一些脚本的写法有所了解. 再就是关于远程桌面的一些缺点, 列出下面几条:

  1. 开启远程桌面之后会开启一个新的会话(session), 之前的主机桌面处于锁屏状态, 如果输入登录密码, 这时候就会导致远程连接失效, 也就是说同一时刻只有一方可以控制主机. 这点与向日葵不同, 向日葵支持两方(被控端和远控端)同时操作.
  2. 开机启动项方面还是Linux比较方便简单, 虽然用的是命令行, 但是配置起来很直观, 一行完事. 反观Windows这边, 需要先把命令写入C程序, (不知道还有没有别的办法, bat2exe感觉不安全), 然后写入开机启动服务.
  3. 不能同时占用一个端口, 例如两台Windows电脑, 同时占用同一端口就会出现无法访问的情况, 这时候可以设置多个监听的客户端端口.

ref