【实战经验】使用FRP搭建内网穿透教程
测试环境为:
ubutubu 22.04
一、特别说明
frp 是一个快速反向代理,通过具有公网IP的节点上部署frp服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,包括:
-
客户端服务端支持TCP、QUIC、KCP以及Websocket等多种协议。
-
采用TCP连接流式复用,在单个连接间承载更多请求,节省连接建立时间,降低请求延迟。
-
代理组间的负载均衡。
-
端口复用,多个服务通过同一个服务端端口暴露。
-
支持P2P通信,流量不经过服务器中转,充分利用带宽资源。
-
多个原生支持的客户端插件(静态文件查看,HTTPS/HTTP协议转换,HTTP、SOCK5代理等),便于独立使用frp客户端完成某些工作。
-
高度扩展性的服务端插件系统,易于结合自身需求进行功能扩展。
-
服务端和客户端UI界面。
二、安装frp
1.准备
一台公网服务器(配置要求不高,带宽大,网络稳定即可),作为服务端,如公网IP:47.23.42.13。
内网客户端(准备穿透出去的服务),如内网IP:192.168.1.11。
2.下载解压安装包
GitHub地址为:GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.,最新版本的客户端和服务端二进制文件在Release页面中。
找到自己合适的版本,下载。
#下载
wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz
#解压
tar -zxvf frp_0.58.1_linux_amd64.tar.gz
#进入目录
cd frp_0.58.1_linux_amd64
进入文件夹后,可以看到有5个文件,其中frpc为客户端程序,frpc.toml为客户端配置文件。frps为服务端程序,frps.toml为服务端配置文件。
root@ubuntu:~/frp_0.58.1_linux_amd64$ ls
frpc frpc.toml frps frps.toml LICENSE
需要将frpc拷贝至客户端,即内网服务器,或者在客户端直接下载也可以,客户端只需要使用frpc和frpc.toml文件即可。
3.服务端配置
配置文件修改
服务端配置时修改frps.toml文件,官方给出了完整的配置文件说明。
# IPv6的字面地址或主机名必须括起来。
# 在方括号中,如“[::1]:80”、“[ipv6-host]:http”或“[ipv6-host%zone]:80”
# 对于单个 "bindAddr" 字段,不需要方括号,例如 `bindAddr = "::"`。
bindAddr = "0.0.0.0"
# 隧道端口,服务端通过此端口与客户端通信
bindPort = 7000
# 用于KCP协议的UDP端口,可以与“bindPort”相同。
# 如果未设置,frps 中的 kcp 将被禁用。
kcpBindPort = 7000
# 每个代理中最大池数量。
transport.maxPoolCount = 5
# 如果你想支持虚拟主机,你必须设置用于监听的http端口(可选)
# 注意:http端口和https端口可以与bindPort相同。
# 由于备案原因,一般不使用80和443端口,可以自定义
vhostHTTPPort = 7001
vhostHTTPSPort = 7002
# frps后台
# dashboard is available only if webServer.port is set.
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"
# console or real logFile path like ./frps.log
log.to = "./frps.log"
# trace, debug, info, warn, error
log.level = "info"
log.maxDays = 3
# disable log colors when log.to is console, default is false
log.disablePrintColor = false
# 服务端和客户端使用token鉴权
auth.method = "token"
# 设置token值
auth.token = "12345678"
# 每个客户端可以使用的最大端口数,默认值为0表示没有限制。
maxPortsPerClient = 0
# 如果服务端主机进行了域名绑定,则填入对应域名,否则填入服务器的公网IP地址
subDomainHost = "47.23.42.13"
其他配置看官网的完整配置文件frp/conf/frps_full_example.toml at dev · fatedier/frp · GitHub。
启动服务端
./frps -c frps.toml
配置开机自启动
使用vim编辑器创建并编辑frps.service文件。
$ vim /etc/systemd/system/frps.service
写入内容
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径以及配置文件存储路径
ExecStart = /path/to/frps -c /path/to/frps.toml
[Install]
WantedBy = multi-user.target
使用
systemd
命令,管理
frps
# 启动frp
systemctl start frps
# 停止frp
systemctl stop frps
# 重启frp
systemctl restart frps
# 查看frp状态
systemctl status frps
配置开机启动
systemctl enable frps
4.客户端配置
修改frpc.toml
# 您的代理名称将更改为 {user}.{proxy}
user = "your_name"
# 服务端IP
serverAddr = "47.23.42.13"
# 服务端端口
serverPort = 7000
# 控制台或真实日志文件路径,如 ./frpc.log
log.to = "./frpc.log"
# trace, debug, info, warn, error
log.level = "info"
log.maxDays = 3
# disable log colors when log.to is console, default is false
log.disablePrintColor = false
# 鉴权方式为token
auth.method = "token"
# 服务端设置的token
auth.token = "12345678"
# 服务端后台
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"
webServer.pprofEnable = false
# 配置本地服务
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
# 本机需要映射的端口
localPort = 22
# 远程服务器映射的端口为6000
remotePort = 6001
# 映射web服务
[[proxies]]
name = "web01"
type = "http"
localIP = "127.0.0.1"
# 本地web服务端口
localPort = 80
启动客户端
./frpc -c frpc.toml
注意,服务端需要开启7000、6001、7001、7002等端口。
5.测试连接
这里测试ssh连接
root@ubuntu:~$ ssh root@47.23.42.13 -p 6001
连接登陆,即可登陆内网IP为192.168.1.12的主机。
6.p2p配置
做p2p配置时,需要公网服务器找到两个通信方的位置,然后使用UDP进行端到端通信。
服务端需要开启UDP端口,在frps.toml中添加一个配置。
quicBindPort = 7002
客户端1添加如下配置
[[proxies]]
name = "p2p_tcp"
type = "xtcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
# 如果不为空,则只有指定用户的访问者可以连接。 # 否则,同一用户的访问者可以连接。'*' 表示允许所有用户。
allowUsers = ["user1", "user2"]
客户端2添加如下配置
[[visitors]]
name = "p2p_tcp_visitor"
type = "xtcp"
# 如果未设置服务器用户,则默认为当前用户。
serverUser = "user1"
serverName = "p2p_tcp"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 9001
这样,客户端2在远程连接的使用使用localhost:9001就能点对点访问服务了。
本教程鸣谢 zlf同学,撰写
更多推荐

所有评论(0)