Update: 2024-06-10
由于安全等原因,公司对于 VPN 访问内网的权限也非常慎重。这就导致在公司外很难进行完整的内网访问。另外,当你的办公环境、大量办公相关的文件均在公司内网办公机器上时,在公司外你也想远程访问自己的办公机器。
一种简单的解决方案是,通过两个 QQ 设置自动接受远程控制进行。这种方式被许多人采用,但它有个弊端是桌面不能锁屏,否则就无法成功。这是非常不安全的,会带来电脑重要文件泄露的风险。
通过具有内网穿透能力的远程控制软件,可以访问到内网机器作为跳板来实现内网访问。然而,当前好用的商业远程控制软件在未购买的情况下,在企业内部基本都是禁止使用的,即使可以使用也会对企业带来被起诉的风险。
我们也可以搭建内网穿透工具实现远程访问的解决方案。FRP 即可帮助你实现该方案的一款工具。
提醒:在公司内网私自搭建穿透服务可能会收到公司安全部门的警告或追责,请先确认相关安全问题后再作决定。
1 什么是 FRP
来自官方文档的解释:
FRP 是一个可用于内网穿透的高性能的反向代理应用。借助中间服务代理转发,可以实现各种内网穿透功能。
我们这里只介绍使用 FRP 实现远程桌面配置的具体操作步骤。其中服务器为 CentOS 7
,客户端为 Window 10
,控制端随意,可以使用 window 的 mstsc 远程连接即可。
注意一个前提: 需要拥有一台有公网 IP 的服务器或 VPS,以用于部署服务端实现服务转发。
当然,你也可能可以借助家里的路由器,配置家庭电脑对外开放公网服务,由此将家庭电脑作为服务端(注意,理论上在国内这是非法的,对外开放公网服务需要备案)。
2 配置 FRP 实现在家远程桌面连接到公司的步骤参考
其基本架构就是:公司-服务器-家
模式。服务器是连接中转的桥梁。
2.1 FRP 服务端安装与配置
登陆服务器 SSH,然后安装 FRP:
# 下载 frp 0.58.1。注意下载的版本与服务器系统架构要相符。这里以 amd64 为例 wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz # 使用tar指令解压 tar -zxvf frp_0.58.1_linux_amd64.tar.gz # 解压安装到 /usr/local/frp 目录。这一步是可选的,安装到任意位置都行 mv frp_0.58.1_linux_amd64 /usr/local/frp # 进入 frp 目录 cd /usr/local/frp
修改服务器配置文件 frps.toml
:
vi frps.toml
配置内容参考:
[common] # 要绑定的端口,可自定义修改一下 bindPort = 7000 quicBindPort = 7001 kcpBindPort = 7000 # 公网服务访问的端口,可通过 http:[域名]:[端口] 形式访问 vhostHTTPPort = 7701 # 安全授权 token,防止端口被扫描到后可以被任意客户端连接 auth.token = "12345678" # 自定义日志保存路径 log.to = "/home/logs/frps.log" # 控制台的用户名 dashboardUser = lzwme # 控制台的密码 dashboardPwd = password # 控制台的端口 dashboardPort = 7750
在当前目录下输入如下命令启动服务端服务:
frps -c frps.toml
如果希望断开 ssh 后依然在后台运行,可以使用 screen
命令启动服务端:
screen frps -c frps.toml
当然,我们也可以设置 frps 服务开机自启动,方法参考如下。
创建后台启动服务文件:
vi /etc/systemd/system/frp.service
内容参考如下:
[Unit] Description=frps After=network.target [Service] ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml [Install] WantedBy=multi-user.target
相关操作命令参考:
# 启动测试 systemctl start frp.service # 查看启动状态 systemctl status frp.service # 开机自启 systemctl enable frp.service
当服务端启动后,可以通过 dashboardPort
的端口号访问控制台。如:http://1.2.3.4:7750
。
2.2 FRP 客户端安装与配置
2.2.1 客户端安装与配置 FRP
如果客户端是 linux 或 macOS,安装流程和服务端基本一样。如果是 windows,可以直接下载对应客户端:
macOS 的下载地址: https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_darwin_amd64.tar.gz
windows 的下载地址: https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_windows_amd64.zip
解压缩下载的文件,并进入文件夹。打开并编辑客户端配置文件 frpc.toml
。内容参考:
[common] # 服务器的 IP serverAddr = 1.2.3.4 # 服务器上设置的服务绑定端口(frps.toml 中的 bindPort) serverPort = 7000 # 安全授权 token,需与服务端设置一致 auth.token = 12345678 log.to = "/etc/frp/log/frpc.log" # 示例一:配置一个本地的 http 服务穿透 # 例如本地访问地址为: http://192.168.31.10:5678 # 公网穿透后以域名形式访问: http://tool.lzw.me:7701 [[proxies]] name = "tool" type = "http" # 本地 http 服务的端口号 localPort = 5678 customDomains = ["tool.lzw.me"] # 穿透一个本地端口号为 3001 的服务,公网以 test1.lzw.me:7701 访问 [[proxies]] name = "test1" type = "http" localPort = 3001 customDomains = ["test1.lzw.me"] [RDP] # 反向代理名称,可以随意设置 # RDP 是 TCP 协议的 type = tcp # 本机 IP localIp = 127.0.0.1 # 远程桌面的默认端口 localPort = 3389 # 外网访问的端口 remotePort = 7001 # 外网访问的域名,建议配置 # customDomains = frp.lzw.me # 如果是linux,可设置 ssh。在控制端就可以用 serverAddr:remotePort 作为 ssh 登陆地址 # [ssh] # type = tcp # localIp = 127.0.0.1 # localPort = 22 # remotePort = 2222 # 设置一个代理服务。在控制端就可以用 serverAddr:remotePort 作为代理地址 # [http_proxy] # type = tcp # remotePort = 6000 # plugin = http_proxy
在当前目录下打开 cmd
或 powershell
,输入如下命令启动客户端服务:
frpc -c frpc.toml
2.2.2 客户端开启远程桌面
望将客户端设置为允许被远程控制。方法为: 右击“此电脑”,选择“系统”——“远程设置”——“允许远程连接至此电脑”。
2.3 控制端远程连接客户端
在控制端电脑上搜索并打开“远程桌面连接”软件,输入 “服务器 IP:外网访问端口”。例如,按照以上服务端与客户端的示例配置,我们这里应该填入: 1.2.3.4:7001
。如果一切正常,会顺利弹出输入账号和密码的输入框。输入客户端电脑的用户名与密码即可进入其桌面。
通过以上步骤,即可实现在家远程桌面到公司工作机而实现远程办公了。
2.4 一些注意事项或提示
- 通过 FRP 使得原本被屏蔽的内网可以在公网访问,当你在享受便利的同时,也在享受额外带来的安全风险。所以一定要对 token 与密码设置、端口设置、配置文件安全等保持一定的谨慎。在不需要使用时尽量关闭相关服务通道。
- 能够随时连接到 FRP 客户端工作机的前提是其一直运行着。所以务必将工作机的自动休眠功能取消。
- More…
3 ARP 其他玩法参考
3.1 点对点内网穿透
点对点即 P2P 模式。frp 提供了一种新的代理类型 xtcp 用于应对在希望传输大量数据且流量不经过服务器的场景。
这种模式需要在被控端(公司)与控制端(家)都部署上 frpc 客户端。不过当前该模式成功率不高。
具体步骤参考如下。
- 服务端配置 frps.toml 中需额外配置一个 udp 端口用于支持该类型的客户端:
bindUdpPort = 7001
- 被控端(公司)的客户端配置,设置
type=xtcp
。参考:
# frpc.toml [common] serverAddr = x.x.x.x serverPort = 7000 # 配置远程连接 [p2p_rdp_lzw] type = xtcp localIp = 127.0.0.1 localPort = 3389 # 只有 sk 一致的用户才能访问到此服务 sk = abcdefg
- 控制端(家)配置并启动另外一个 frpc 客户端。配置参考:
# frpc.toml [common] serverAddr = x.x.x.x serverPort = 7000 [p2p_rdp_lzw_visitor] type = xtcp # xtcp 的访问者 role = visitor # 要访问的 xtcp 代理的名字 serverName = p2p_rdp_lzw sk = abcdefg # 绑定本地端口用于访问 ssh 服务 bindAddr = 127.0.0.1 bindPort = 6000
- 如一些顺利,则可顺利通过
127.0.0.1:6000
访问。
更多功能及配置方式、示例可参考官方文档: https://github.com/fatedier/frp/blob/master/README_zh.md
4 相关问题
4.1 服务端启动报错 Exec format error
/frpc: cannot execute binary file: Exec format error
这是下载错文件了,下载的 FRP 与操作系统处理器架构不匹配,需要重新下载正确的文件。
可以使用 arch
、uname -a
等命令查看系统架构。如:
$ arch # 输出 x86_64
FRP 版本与 Linux 系统处理器架构对比参考:
FRP类型 | 处理器架构 |
---|---|
386 | X86架构 |
amd64 | amd架构 |
arm | arm架构 |
arm64 | 64位arm架构 |
mips | mips架构 |
mips64 | 64位mips架构 |
mipsle | mipsle架构 |
mips64le | 64位mipsle架构 |
4.2 设置 FRP 以 Windows 系统服务方式实现开机启动
CMD 命令提示符下启动 FRP 虽然简单便捷,但一直启动着一个黑色的 cmd 界面看上去并不完美,更为重要的是,还会因无意中的关闭导致中断而没有任何办法。
NSSM 是一个可以将指定脚本或可执行程序注册为 Windows 系统服务的小巧而优秀的工具。同类型工具还有
winsw 和 easy-service 等。
我们这里介绍使用 NSSM 将 FRP 启动脚本注册为 Windows 系统服务的方法。
1、 下载:从官网下载 NSSM,地址为:https://nssm.cc/download。注意,window10 系统要下载 prerelease 版本。
2、 解压:解压下载的 zip 文件至本地目录,根据当前电脑系统类型选择 win32 位或 win64 位目录下的 nssm.exe 文件,打开 cmd 命令提示符进入到该文件所在目录。
3、 服务注册:在 cmd 命令行输入 nssm.exe install frpc
,在弹出的对话框中,path 处选择启动frpc的脚本,然后点击Install service
注册服务。
提示: 启动 frpc 的批处理脚本可以建立在 frpc 所在目录下,其内容为
frpc -c frpc.toml
4、 服务启动:执行 nssm.exe start frpc
通过以上操作后,即可以在本地计算机服务列表中看到 frpc 服务。打开本地服务程序的方法为:按键 Win+R
,输入 services.msc
。
nssm
其他命令参考:
// 创建一个服务名称为 servicename 的服务
nssm install [servicename]
// 启动创建的servername服务
nssm start [servicename]
// 停止创建的servername服务
nssm stop [servicename]
// 重新启动创建的servername服务
nssm restart [servicename]
// 删除创建的servername服务
nssm remove [servername]
学习了,刚刚弄配置,一次成功 !感谢~
太棒了, 感谢!
不错学习了