frp配置内网穿透,实现Windows 远程桌面连接,访问内网数据库
Frp介绍
frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。
官网:https://gofrp.org/zh-cn/
原理
frp 主要由 客户端(frpc) 和 服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。
内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。
用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。
原理图:
配置教程
1.前提要求
首先必须先要有一台具有外网ip(即:可以外网访问)的服务器。如果没有,接下来的教程就不用看了。
2.下载frp
下载地址:https://github.com/fatedier/frp/releases
3.服务端安装
-
把下载好的frp程序压缩包上传到服务器,或者直接在服务器上执行下载命令:
wget https://github.com/fatedier/frp/releases/download/v0.56.0/frp_0.56.0_linux_amd64.tar.gz
-
下载完成后解压,修改目录名称,给执行权限
# 解压 tar -zxvf frp_0.56.0_linux_amd64.tar.gz # 修改目录名称,和权限 mv frp_0.56.0_linux_amd64 frp chown -R root:root frp
解压后的文件目录,frps是服务端执行文件,frpc是客户端执行文件,frps.toml是服务端配置文件:
-
编辑服务端配置文件frps.toml
#服务端监听端口 bindPort = 7000 #设置认证方式为token(可选) auth.method = token #设置token(可选) auth.token = a123456
完整配置文件请参考:https://gofrp.org/zh-cn/docs/reference/server-configures/
-
使用systemd启动服务
在 Linux 系统下,使用systemd 可以方便地控制 frp 服务端 frps 的启动和停止、配置后台运行和开启自启。
要使用 systemd 来控制 frps,需要先安装 systemd,然后在 /etc/systemd/system 目录下创建一个 frps.service 文件。- 如Linux服务端上没有安装 systemd,可以使用 yum 或 apt 等命令安装 systemd
# yum yum install systemd # apt apt install systemd
- 使用文本编辑器,如 vim 创建并编辑 frps.service 文件
vim /etc/systemd/system/frps.service
写入内容
[Unit] # 服务名称,可自定义 Description = frpserver After = network.target syslog.target Wants = network.target [Service] Type = simple Restart=always # 启动frps的命令,需修改为你的frps的安装路径 ExecStart = /home/frp/frps -c /home/frp/frps.toml [Install] WantedBy = multi-user.target
- 使用 systemd 命令,管理 frps
# 重新加载配置 systemctl daemon-reload # 启动frp systemctl start frps # 停止frp systemctl stop frps # 重启frp systemctl restart frps # 查看frp状态 systemctl status frps # 查看frp状态 systemctl enable frps
4.linux客户端
-
客户端要使用和服务端一样的版本,安装方式和服务端差不多,主要是配置文件不一样,客户端的配置文件是frpc.toml,配置文件示例:
[common] # 改成服务端的IP server_addr = xxx.xxx.xxx.xx # 改成服务端的bind_port端口 server_port = 7000 # token 认证,跟服务端一致 token=a123456 # 连接名称,所有客户端唯一 windows远程桌面配置,如果要配置ssh连接,修改local_port端口号为22就好 [rdp] type = tcp local_ip = 127.0.0.1 local_port = 3389 # 设置映射端口,也就是本地3389映射给服务器的3387端口 # 访问服务器的3387就是访问客户端的3389端口 remote_port = 3387 # msyql 映射配置 [mysql] type =tcp local_ip=127.0.0.1 local_port=3306 remote_port = 3309 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 # 设置映射端口,也就是22映射给7203 remote_port = 7202
-
跟服务端一样,创建一个系统服务文件,文件名称跟服务端区分(服务端是frps.service,客户端是frpc.service)
[Unit] # 服务名称,可自定义 Description = frpcerver After = network.target syslog.target Wants = network.target [Service] Type = simple Restart=always # 启动frps的命令,需修改为你的frps的安装路径 ExecStart = /home/frp/frpc -c /home/frp/frpc.toml [Install] WantedBy = multi-user.target
-
配置启动,停止和开启自启的方法和服务端的命令一样
5.windows客户端
-
windows客户端注意需要下载和服务端相同版本的frp,配置文件和Linux版本的一样
-
windows可以借助winsw来配置frp服务的启动、关闭和开机自启
-
下载winsw,下载地址:https://github.com/winsw/winsw/releases
-
复制下载的winsw.exe到frp目录下,然后创建winsw.xml配置文件
<service> <!-- 该服务的唯一标识 --> <id>frp</id> <!-- 该服务的名称 --> <name>frp内网穿透</name> <!-- 该服务的描述 --> <description>frpc开机自启</description> <!-- 要运行的程序路径 --> <executable>frpc.exe</executable> <!-- 携带的参数 --> <arguments>-c frpc.toml</arguments> <!-- 第一次启动失败 5秒重启 --> <onfailure action="restart" delay="5 sec"/> <!-- 第二次启动失败 10秒后重启 --> <onfailure action="restart" delay="10 sec"/> <!-- 日志模式 --> <logmode>append</logmode> <!-- 指定日志文件目录(相对于executable配置的路径) --> <logpath>logs</logpath> </service>
-
在当前目录打开cmd窗口,执行命令创建服务
# 安装服务 winsw.exe install # 启动服务 winsw.exe start # 卸载服务 winsw.exe uninstall # 停止服务 winsw.exe stop # 重启服务 winsw.exe restart #查看状态 winsw.exe status
-
安装服务后,在window的服务管理中可以看到frp服务,可以设置自启动
-
6.使用
-
Mysql连接,如本例中服务端IP为:xxx.xxx.xxx.xx,端口号为:3309
-
window远程,如本例中服务端IP为:xxx.xxx.xxx.xx,端口号为:3387
-
linux SSH连接,如本例中服务端IP为:xxx.xxx.xxx.xx,端口号为:7202
ssh root@xx.xxx.xx.xx -p 7202
7. 特别注意
如果服务端机器开启了防火墙,需要在防火墙放开服务器的7000端口和客户端配置里面remote_port配置的所有端口,如果是云服务,如阿里云、腾讯云,还需要在云服务器安全组放开这些端口,不然会连接不上。