运维| frp原理和搭建穿透windows场景案例

frp原理和搭建穿透windows场景案例

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

frp 项目地址: https://github.com/fatedier/frp

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、QUIC、KCP 以及 Websocket 等多种协议。
  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间,降低请求延迟。
  • 代理组间的负载均衡。
  • 端口复用,多个服务通过同一个服务端端口暴露。
  • 支持 P2P 通信,流量不经过服务器中转,充分利用带宽资源。
  • 多个原生支持的客户端插件(静态文件查看,HTTPS/HTTP 协议转换,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
  • 高度扩展性的服务端插件系统,易于结合自身需求进行功能扩展。
  • 服务端和客户端 UI 页面。

frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。

由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。

frp 支持多种代理类型,以适应不同的使用场景。以下是一些常见的代理类型:

  • TCP:提供纯粹的 TCP 端口映射,使服务端能够根据不同的端口将请求路由到不同的内网服务。
  • UDP:提供纯粹的 UDP 端口映射,与 TCP 代理类似,但用于 UDP 流量。
  • HTTP:专为 HTTP 应用设计,支持修改 Host Header 和增加鉴权等额外功能。
  • HTTPS:类似于 HTTP 代理,但专门用于处理 HTTPS 流量。
  • STCP:提供安全的 TCP 内网代理,要求在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
  • SUDP:提供安全的 UDP 内网代理,与 STCP 类似,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
  • XTCP:点对点内网穿透代理,与 STCP 类似,但流量不需要经过服务器中转。
  • TCPMUX:支持服务端 TCP 端口的多路复用,允许通过同一端口访问不同的内网服务。

每种代理类型适用于不同的使用情境,您可以根据需求选择合适的代理类型来配置 frp。

搭建一个完整的frp服务链,我们需要

  • VPS一台(也可以是具有公网IP的实体机)
  • 访问目标设备(就是你最终要访问的设备)
  • 简单的Linux基础(会用cp等几个简单命令即可)

从官方GitHub的Release页面下载最新版的二进制文件

github版本: https://github.com/fatedier/frp/releases

截至目前最新版为:v0.61.0

linux版下载地址:https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz

text

cd /root
tar -xf frp_0.54.0_linux_amd64.tar.gz
mv frp_0.54.0_linux_amd64 frp
cd frp

text

vim frps.toml
#服务绑定的IP与端口
bindAddr = "0.0.0.0"
bindPort = 7000
#web dashboard配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"
#启用prometheus监控指标
enablePrometheus = true
#token权限验证,需与客户端配置一致
auth.method = "token"
auth.token = "123456"
#日志配置
log.to = "/data/frp/logs/frps.log"
log.level = "info"
log.maxDays = 3

text

mkdir -pv /data/frp/logs/
cp /root/frp/frps /data/frp 
cp /root/frp/frps.toml /data/frp 

text

#命令行方式启动
./frps -c ./frps.toml
#使用systemd方式启动
##准备启动文件
vim /etc/systemd/system/frps.service
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /data/frp/frps -c /data/frp/frps.toml

[Install]
WantedBy = multi-user.target

##启动服务
systemctl daemon-reload
systemctl start frps

下载 frp windows https://github.com/fatedier/frp/releases ,一般选择 windows_amd64

下载地址: https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_windows_amd64.zip

内网被访问机器,需要用frpc 二进制文件和 frpc.toml 配置文件

text

auth.token = "xxx"
serverAddr = "公网服务器IP"
serverPort = 7000
##代理ssh服务
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 2000
#代理windows 远程桌面 
[[proxies]]
name = "rdp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 33890

命令行启动

打开windows,powershell ,通过powershell终端启动

批处理启动

下面是俩个代码都可以,我们用其中一个代码,保存成frpc.bat 文件,就可以一键执行了

text

@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
REM
cd C:\frp
frpc -c frpc.toml
exit

text

  @echo off

    if not defined TAG (
        set TAG=1
        start wt -p "cmd" %0
        exit
    )

    :home
    .\frpc -c frpc.toml
    goto home

注册表开机启动

cmd 命令提示符下启动 FRP 虽然简单便捷,但一直启动着一个黑色的 cmd 界面看上去并不完美,更为重要的是,还会因无意中的关闭导致中断而没有任何办法。 NSSM 是一个可以将指定脚本或可执行程序注册为 Windows 系统服务的小巧而优秀的工具。同类型工具还有winsw 和 easy-service 等。 我们这里介绍使用 NSSM 将 FRP 启动脚本注册为 Windows 系统服务的方法。

  • 下载:从官网下载 NSSM,地址为:https://nssm.cc/download。注意,window10 系统要下载 prerelease 版本。
  • 解压:解压下载的 zip 文件至本地目录,根据当前电脑系统类型选择 win32 位或 win64 位目录下的 nssm.exe 文件,打开 cmd 命令提示符进入到该文件所在目录。
  • 服务注册:在 cmd 命令行输入 ./nssm.exe install frpc,回车,在弹出的对话框中,path 处选择启动frpc的脚本,然后点击Install service注册服务。 提示: 启动 frpc 的批处理脚本可以建立在客户端所在目录下。例如上图Path路径下选择的 start.bat文件,该文件是我自己建立的,新建一个文本文件,改后缀并命名为 start.bat,其内容仅为一行命令: ./frpc -c frpc.ini
  • 服务启动:通过以上操作后,即可以在本地计算机服务列表中看到 frpc 服务。打开本地服务程序的方法为:按键 Win+R,输入 services.msc。 可以自己设置启动类型,我这里设置成 手动 ,在不需要远程的时候都是关闭状态,在出差或者离开学校之前再启动就行

打开支持远程桌面链接

防火墙开放

这一步很关键,一般我们都会用云服务器,vps,比如阿里云,腾讯云,所以我们需要在虚拟机的安全组上 放行以上涉及的端口,frps和frpc俩边涉及的端口都需要开通的,非云主机请忽略,或本身防火墙firewall放行

  • 服务器端口: 7000 ,7500
  • 内网机器暴露端口: 2000,33890

我们可以通过登录 web 界面管理,查看是否注册登录,注册成功,会显示online状态

text

curl -fsSL get.docker.com -o get-docker.sh
curl -sSL https://get.daocloud.io/docker | sh
sudo sh get-docker.sh --mirror Aliyun

frps

text

docker run --restart=always --network host -d -v /etc/frp/frps.toml:/etc/frp/frps.toml --name frps snowdreamtech/frps

frps

text

docker run --restart=always --network host -d -v /etc/frp/frpc.toml:/etc/frp/frpc.toml --name frpc snowdreamtech/frpc

后面我们就可以通过外网IP+端口的形式来远程访问windows桌面了 但是这样子暴露端口是有风险的,容易被人爆破,所以后续我们可以 考虑用stcp功能(不需要暴漏端口),相对就比较安全了