1 服务端和客户端都先安装go
# 查看go版本,如果没有,安装go
go version
1.1 离线安装
arch # 查看内核版本,注x86_64,x64,AMD64基本上是同一个东西
go官网下载相应版本的tar包: https://golang.org/dl/
mkdir /usr/local/go
cd /usr/local/go # 将tar上传到此目录
tar -C /usr/local/ -xzf go1.17.8.linux-amd64.tar.gz # 解压上传的tar包
最后配置环境变量
vi /etc/profile
# 在最后一行添加
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
# 保存退出后source一下(vim 的使用方法可以自己搜索一下)
source /etc/profile
# 测试一下能看到版本号
go version
1.2 在线安装
mkdir /usr/local/go
cd /usr/local/go
wget https://dl.google.com/go/go1.17.8.linux-amd64.tar.gz
tar -C /usr/local/ -xzf go1.17.8.linux-amd64.tar.gz
最后配置环境变量
vi /etc/profile
# 在最后一行添加
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
# 保存退出后source一下(vim 的使用方法可以自己搜索一下)
source /etc/profile
# 测试一下能看到版本号
go version
2 搭建简单frp
首先需要一台云服务器作为服务端,云服务器的购买和使用请先自行百度。
服务端和客户端都需要安装go并下载frp解压。
frp项目地址: https://github.com/fatedier/frp
点击红框位置版本号,进去之后选择适合自己的版本。服务端和客户端都需要
mkdir /usr/local/frp
cd /usr/local/frp # 上传frp的tar包到你创建的路径
tar -zxvf frp_0.38.0_linux_amd64.tar.gz # 解压
# 进入该路径,需要关注frps、frpc、frps.ini、frpc.ini四个文件(服务端用frps,客户端用frpc)
cd frp_0.38.0_linux_amd64/
2.1 服务端配置frps.ini
云服务器记得开放7000(bind_port),7001(vhost_http_port)端口
vi frps.ini
[common]
bind_port = 7000
vhost_http_port = 7001
# 直接nohup启动
nohup ./frps -c ./frps.ini & > nohup.out | tail -f nohup.out
看到这样的日志,则表示服务端正常启动。如果失败,请检查配置文件
2.2 服务端配置frpc.ini
确保客户端telnet server_addr 7000/7001(bind_port/vhost_http_port)这两个端口能通。
vi frps.ini
[common]
server_addr = aaa.bbb.ccc.ddd
server_port = 7000
[web]
type = http
# 内网客户端的服务端口
local_port = 9999
# 服务端有域名,则在服务端配置subdomain,这个网上挺多的,就不写了。
# 没有域名就写云服务器的外网IP也是可以的。
custom_domains = aaa.bbb.ccc.ddd
# 测试启动
./frpc -c ./frpc.ini
看到这样的日志则表示客户端正常启动。如果失败,请检查配置文件或者telnet。
2.3 测试是否成功穿透内网
访问http://aaa.bbb.ccc.ddd:7001/xxx,内网服务地址能够访问。
3 更加正式的配置
3.1 服务端配置
[common]
# tcp代理端口
bind_port = 7000
# http代理端口
vhost_http_port = 7001
# 控制台相关
dashboard_port = 7002
dashboard_user = admin
dashboard_pwd = admin
# 连接池最大连接数
max_pool_count = 10
# 日志相关(由于要nohup启动,直接查看nohup.out,就不额外生成文件了)
#log_file = ./log/frps.log
#log_level = info
#log_max_days = 3
# 服务端和客户端连接的token
token = xwkQWERTYUIOP0987654321mnbvcxzDHSAUdsuadshfasu
直接nohup启动即可。正常启动日志和测试一样。
3.2 客户端配置
[common]
server_addr = aaa.bbb.ccc.ddd
server_port = 7000
# 需要跟服务端配置的一致
token = xwkQWERTYUIOP0987654321mnbvcxzDHSAUdsuadshfasu
user = xwk
[web]
type = http
local_port = 9999
custom_domains = aaa.bbb.ccc.ddd
直接nohup启动即可。正常启动日志和测试一样。
3.3 再次测试穿透服务
仍然访问http://aaa.bbb.ccc.ddd:7001/xxx,内网服务地址能够正常访问。
附:frp官方文档地址
frp官方github地址: https://github.com/fatedier/frp
其实就是项目的README.md,可以查看英文和中文文档。
另外,也可以看看这篇博客:
https://blog.csdn.net/u011447403/article/details/126270408
附:frp配置文件详解
frps.ini
[common] # 通用配置段
bind_addr = 0.0.0.0 # 绑定的IP地址,支持IPv6,不指定默认0.0.0.0;
bind_port = 7000 # 服务端口;
bind_udp_port = 7001 # 是否使用udp端口,不使用删除或注释本行;
kcp_bind_port = 7000 # 是否使用kcp协议,不使用删除或注释本行;
# proxy_bind_addr = 127.0.0.1 # 代理监听地址,默认和bind_addr相同;
# 虚拟主机
vhost_http_port = 80 # 是否启用虚拟主机,端口可以和bind_port相同;
vhost_https_port = 443
vhost_http_timeout = 60 # 后端虚拟主机响应超时时间,默认为60s;
# 开启frps仪表盘可以检查frp的状态和代理的统计信息。
dashboard_addr = 0.0.0.0 # frps仪表盘绑定的地址;
dashboard_port = 7500 # frps仪表盘绑定的端口;
dashboard_user = admin # 访问frps仪表盘的用户;
dashboard_pwd = admin # 密码;
assets_dir = ./static # 仪表盘页面文件目录,只适用于调试;
# 日志配置文件
log_file = ./frps.log # 日志文件,不指定日志信息默认输出到控制台;
log_level = info # 日志等级,可用等级“trace, debug, info, warn, error”;
log_max_days = 3 # 日志保存最大保存时间;
token = 12345678 # 客户端与服务端通信的身份验证令牌
heartbeat_timeout = 90 # 心跳检测超时时间,不建议修改默认配置,默认值为90;?
# 指定允许客户端使用的端口范围,未指定则没有限制;
allow_ports = 2000-3000,3001,3003,4000-50000
max_pool_count = 5 # 每个客户端连接服务端的最大连接数;
max_ports_per_client = 0 # 每个客户端最大可以使用的端口,0表示无限制
authentication_timeout = 900 # 客户端连接超时时间(秒),默认为900s;
subdomain_host = frps.com # 自定义子域名,需要在dns中将域名解析为泛域名;
tcp_mux = true # 是否使用tcp复用,默认为true;
# frp只对同意客户端的连接进行复用;
frpc.ini
[common] # 通用配置段
server_addr = 0.0.0.0 # server的IP地址;支持IPv6
server_port = 7000 # server的端口;
# 如果要通过http或socks5代理连接frps,可以在此处或在全局环境变量中设置代理,只支持tcp协议;
# http_proxy = http://user:passwd@192.168.1.128:8080
# http_proxy = socks5://user:passwd@192.168.1.128:1080
# 客户端日志
log_file = ./frpc.log # 指定日志文件;
log_level = info # 指定日志等级;
log_max_days = 3
token = 12345678 # 客户端与服务端通信的身份验证令牌
# 设置管理地址,用于通过http api控制frpc的动作,如重新加载;
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_passwd = admin
pool_count = 5 # 初始连接池的数量,默认为0;
tcp_mux = true # 是否启用tcp复用,默认为true;
user = your_name # frpc的用户名,用于区别不用frpc的代理;
login_fail_exit = true # 首次登录失败时退出程序,否则连续重新登录到frps;
protocol = tcp # 用于连接服务器的协议,支持tcp、kcp、websocket;
dns_server = 8.8.8.8 # 为frp 客户端指定一个单独的DNS服务器;
# start = ssh,dns # 要启用的代理的名字,默认为空表示所有代理;
# 心跳检查
# heartbeat_interval = 30 # 失败重试次数
# heartbeat_timeout = 90 # 超时时间
# 配置示例
[ssh] # 代理配置段名称,如果配置user=your_name,则显示为your_name.ssh;
type = tcp # 协议默认tcp,可选tcp,udp,http,https,stcp,xtcp;
local_ip = 127.0.0.1 # 本地地址
local_port = 22 # 本地端口
use_encryption = false # 是否加密服务端和客户端的通信信息,默认为不加密;
use_compression = false # 是否开启压缩,默认不开启;
remote_port = 6001 # 在服务器端开启的远程端口;
# 负载均衡配置
group = test_group # 负载均衡组名,会将同一组内的客户端进行负载;
group_key = 123456 # 负载均衡组密钥;
# web示例
[web01]
type = http # 使用http
local_ip = 127.0.0.1
local_port = 80
use_encryption = false
use_compression = true
http_user = admin # 访问web01页面启用认证,用户名admin
http_pwd = admin # 密码
subdomain = web01 # 子域名,需要服务端配置了subdomain_host参数;
custom_domains = web02.example.com # web01的域名,和subdomain二选一
locations = /,/pic # 指定用于路由的URL前缀;
host_header_rewrite = example.com # 配置http包头域名重写;
header_X-From-Where = frp # 添加包头信息X-From-Where: frp;