frp:将内网机器通过公网 IP 连接起来
frp 是一个可用于内网穿透的高性能的反向代理应用,可以作为两个内网机器通过公网 IP 进行桥接的桥梁。通过其支持各种服务和传输协议,我们就可以实现一系列远程控制操作。(frp 的 Github 主页上也用结构图解释了具体的工作原理,感兴趣的话可以前往了解。)
实现下面所有操作的前提是:你需要拥有一台有公网 IP 的云服务器。而经过我的测试,即便是带宽仅为 1M 小水管的云服务器也可以支撑几乎后面的所有操作。我接下来的操作中,被控目标主机 PC 操作系统是: Windows 10 v2004,云服务器为 CentOS 7.8。控制端为 Windows 10 v 1909。
首先,我们需要对拥有公网的云服务器进行设置,根据云主机的系统版本从 frp 的 GitHub 中下载最新版本的运行包 ,对于 Linux 版本,我的策略是下载到本地,然后通过 7zip 完全解压,之后将其中的 frps 以及 frps.ini 这两个文件通过 SFTP 工具(比如 WinSCP 或者 Xftp )传输到目录 /etc下, 如’frp_0.58.1_linux_amd64.tar.gz’, 通过命令 tar -zxvf frp_0.58.1_linux_amd64.tar.gz 进行解压。
接着,使用 SSH 工具进入到该目录,通过 Vim 打开 frps.toml。
默认的监听端口是 7000。如果希望更换端口,可以按键盘上的 i 键开启编辑,将其中的 bind_port 中后面的端口改为你想要的端口,然后按 ESC 关闭编辑模式,最后输入:wq保存编辑。
注: dashhoard为可视化面板, 可配可不配. 在网络安全组中将 18076 端口设置为进站出站的放行策略
通过 xxx.xx.xxx.xx:18076进行访问, 可通过Proxies查看是否 服务器 和 被控制端电脑 是否正常连接.
我们需要开启 frp 的服务端,对于 Linux 主机,可以执行这一条命令来将其作为进程放到系统后台运行:
nohup /etc/frp_0.58.1_linux_amd64/frps -c /etc/frp_0.58.1_linux_amd64/frps.toml & &> /dev/null
执行后,我们可以通过 netstat -lnp|grep 7000看一下进程是否正常运行。
另附frp后台运行和停止操作
- 运行
nohup ./frps -c frps.ini >/dev/null 2>&1 &
或者客户端
nohup ./frpc -c ./frpc.ini >/dev/null 2>&1 &
- 停止
先找到这个进程
ps -aux|grep frp| grep -v grep
root 3600 0.1 0.1 110188 9484 pts/0 Sl 15:04 0:00 ./frpc -c ./frpc.ini
执行之后如果显示这样则成功了
然后kill -9 进程号
kill -9 3600
到这里,云端服务的操作基本上就完成了。如果你使用的云服务商的主机绑定了安全组,需要手动登录服务器的云控制台,在网络安全组中将 7000 端口设置为进站出站的放行策略
使用 frp 内网穿透实现 RDP 远程桌面
在针对 Windows 系统的远程控制中,兼容性最好的当然是 RDP 远程桌面——无需安装第三方软件,非常简单容易进行设置。微软也在其他系统平台上推出了微软远程桌面客户端,让你几乎能在所有的主流平台上实现远程控制 Windows 主机。
首先,我们需要设置一下被控 PC 端(也就是希望被远程控制的设备)在 从从 frp 的 GitHub 中下载最新版本的运行包 中下载对应的执行包,这里因为内网目标被控主机是 Windows 11,因此需要下载 Windows 版本。
解压缩之后, 使用编辑器对 frpc.toml 文件进行编辑。
frpc.toml 文件中主要分为两个部分,最上面[common]
是和云端服务器通信的部分,因此server_addr填写的是对应的云服务器的 ip 地址,而下面这个server_port则是刚才我们在服务端所设置的bind_port,两者需要保持一致。token也是同样的道理.
其中local_ip
指的是本机处于内网的 IP 地址,如果你是自己使用,只需要写 127.0.0.1 即可,而 local_port
指的是对应的服务端口,RDP 服务端口就是 3389。
至于 remote_port
就是远程用来映射的端口,最后根据原理,如果想通过远程桌面控制当前内网主机,其对应的地址就是:[server_port]:[remote_port]
(公网服务器 IP:映射的端口号)
如果你使用的云服务商的主机绑定了安全组,需要手动登录服务器的云控制台,在网络安全组中将 7002 端口设置为进站出站的放行策略
完成之后点击保存,接着我们需要对电脑的远程进行设置。右键点击「此电脑」-「属性」,找到「远程设置」,在「远程桌面」中勾选「允许远程连接到此计算机」,同时取消「仅允许运行使用网络级别身份验证的远程桌面的计算机连接」的勾选,然后点击「确定」。
最后,我们需要打开 Windows 防火墙给以上服务予以放行,在控制面板\所有控制面板项\Windows Defender 防火墙\允许的应用中点击「更改设置」,然后在下面找到「远程桌面」和「远程桌面(webSocket)」并分别勾选上「专用」和「公用」
之后我们文件所在的目录,按住键盘上的shift键后右键选择「在此处打开 Powershell 窗口」,执行以下命令来开启 frp 客户端:
.\frpc.exe -c frpc.toml
如果下面的终端输入显示有[RDPv] start proxy success
则表示实际上服务已经成功开启,使用控制端的「微软远程桌面」应该就可以实现远程控制了。
windos自启动
虽然这样实现了远程控制,但 frp 的客户端运行却需要一直在前台开启 Powershell 终端。其实,完全可以使用更加高效率的做法:将可执行文件打包成系统服务,然后让服务在后台自动运行。
windwos利用”任务计划程序”。在Frp同目录下新建一个”start.bat” 文件。接着,右键编辑这个 start.bat:
@echo off
:home
frpc -c frpc.toml
goto home
在windows管理工具里找到”计划任务程序”,添加”start.bat”文件的开机自启任务
Linux自启动
设置frp开机自启,创建service服务文件
sudo vim /etc/systemd/system/frpc.service
填入如下信息,ExecStart参数请自行替换路径
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Restart=on-failure
RestartSec=5
ExecStart=nohup /etc/frp_0.58.1_linux_amd64/frps -c /etc/frp_0.58.1_linux_amd64/frps.toml & &> /dev/null
[Install]
WantedBy=multi-user.target
刷新服务列表:
sudo systemctl daemon-reload
设置开机自启动
sudo systemctl enable frpc
关闭开机自启
sudo systemctl disable frpc
启动服务
sudo systemctl start frpc
停止服务
sudo systemctl stop frpc