frp基本信息
frp全名Fast Reverse Proxy,是用于提供内网穿透服务的工具,主要用于解决一些内网服务没有公网ip但是却需要提供外网访问的问题。使用frp你可以将内网中的TCP、UDP、HTTP、HTTPS等协议类型的服务发布到公网,并且支持Web服务根据域名进行路由转发。
frp已经将项目开源至github,跳转地址:
github项目介绍地址(frp) 获取frp文件
背景:
因为有在外面访问家里 NAS 的需求,家里是移动的宽带,没有公网IP,所以需要用内网穿透技术来实现通过其他公网 IP 来访问家里的 NAS 设备的需求。正巧朋友那里有一台有公网IP的NAS,和朋友商量后决定借他的NAS给我做个内网穿透。
准备工作:
- 一台有公网 IP 的服务器 <服务端>。(VPS、云主机,我选择的NAS)
- NAS <客户端>。群晖 DS 3617
搭建起来其实很简单:
1.下载frp文件 2.设置frp配置文件 3.启动frp服务
首先下载frp文件 https://github.com/fatedier/frp/releases 根据自己的系统选择就好,服务端是一台有公网IP的NAS,客户端是一台没有公网IP的NAS,而且都是x86的架构就选择了
frp_0.21.0_linux_386.tar.gz
下载后解压缩,只留下frps、frps.ini、frpc、frpc.ini四个文件就够用了,其他文件可以直接删掉。
接下来就是设置配置文件,下图是我的配置,仅供参考:
frp 服务端详细配置说明
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
bind_addr |
string |
服务端监听地址 |
0.0.0.0 |
|
|
bind_port |
int |
服务端监听端口 |
7000 |
|
接收 frpc 的连接 |
bind_udp_port |
int |
服务端监听 UDP 端口 |
0 |
|
用于辅助创建 P2P 连接 |
kcp_bind_port |
int |
服务端监听 KCP 协议端口 |
0 |
|
用于接收采用 KCP 连接的 frpc |
proxy_bind_addr |
string |
代理监听地址 |
同 bind_addr |
|
可以使代理监听在不同的网卡地址 |
log_file |
string |
日志文件地址 |
./frps.log |
|
如果设置为 console,会将日志打印在标准输出中 |
log_level |
string |
日志等级 |
info |
trace, debug, info, warn, error |
|
log_max_days |
int |
日志文件保留天数 |
3 |
|
|
disable_log_color |
bool |
禁用标准输出中的日志颜色 |
false |
|
|
detailed_errors_to_client |
bool |
服务端返回详细错误信息给客户端 |
true |
|
|
heart_beat_timeout |
int |
服务端和客户端心跳连接的超时时间 |
90 |
|
单位:秒 |
user_conn_timeout |
int |
用户建立连接后等待客户端响应的超时时间 |
10 |
|
单位:秒 |
udp_packet_size |
int |
代理 UDP 服务时支持的最大包长度 |
1500 |
|
服务端和客户端的值需要一致 |
tls_cert_file |
string |
TLS 服务端证书文件路径 |
|
|
|
tls_key_file |
string |
TLS 服务端密钥文件路径 |
|
|
|
tls_trusted_ca_file |
string |
TLS CA 证书路径 |
|
|
|
权限验证
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
authentication_method |
string |
鉴权方式 |
token |
token, oidc |
|
authenticate_heartbeats |
bool |
开启心跳消息鉴权 |
false |
|
|
authenticate_new_work_conns |
bool |
开启建立工作连接的鉴权 |
false |
|
|
token |
string |
鉴权使用的 token 值 |
|
|
客户端需要设置一样的值才能鉴权通过 |
oidc_issuer |
string |
oidc_issuer |
|
|
|
oidc_audience |
string |
oidc_audience |
|
|
|
oidc_skip_expiry_check |
bool |
oidc_skip_expiry_check |
|
|
|
oidc_skip_issuer_check |
bool |
oidc_skip_issuer_check |
|
|
|
管理配置
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
allow_ports |
string |
允许代理绑定的服务端端口 |
|
|
格式为 1000-2000,2001,3000-4000 |
max_pool_count |
int |
最大连接池大小 |
5 |
|
|
max_ports_per_client |
int |
限制单个客户端最大同时存在的代理数 |
0 |
|
0 表示没有限制 |
tls_only |
bool |
只接受启用了 TLS 的客户端连接 |
false |
|
|
Dashboard, 监控
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
dashboard_addr |
string |
启用 Dashboard 监听的本地地址 |
0.0.0.0 |
|
|
dashboard_port |
int |
启用 Dashboard 监听的本地端口 |
0 |
|
|
dashboard_user |
string |
HTTP BasicAuth 用户名 |
|
|
|
dashboard_pwd |
string |
HTTP BasicAuth 密码 |
|
|
|
enable_prometheus |
bool |
是否提供 Prometheus 监控接口 |
false |
|
需要同时启用了 Dashboard 才会生效 |
asserts_dir |
string |
静态资源目录 |
|
|
Dashboard 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源 |
HTTP & HTTPS
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
vhost_http_port |
int |
为 HTTP 类型代理监听的端口 |
0 |
|
启用后才支持 HTTP 类型的代理,默认不启用 |
vhost_https_port |
int |
为 HTTPS 类型代理监听的端口 |
0 |
|
启用后才支持 HTTPS 类型的代理,默认不启用 |
vhost_http_timeout |
int |
HTTP 类型代理在服务端的 ResponseHeader 超时时间 |
60 |
|
|
subdomain_host |
string |
二级域名后缀 |
|
|
|
custom_404_page |
string |
自定义 404 错误页面地址 |
|
|
|
TCPMUX
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
tcpmux_httpconnect_port |
int |
为 TCPMUX 类型代理监听的端口 |
0 |
|
启用后才支持 TCPMUX 类型的代理,默认不启用 |
frp 客户端的详细配置说明
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
server_addr |
string |
连接服务端的地址 |
0.0.0.0 |
|
|
server_port |
int |
连接服务端的端口 |
7000 |
|
|
http_proxy |
string |
连接服务端使用的代理地址 |
|
|
格式为 {protocol}://user:passwd@192.168.1.128:8080 protocol 目前支持 http、socks5、ntlm |
log_file |
string |
日志文件地址 |
./frpc.log |
|
如果设置为 console,会将日志打印在标准输出中 |
log_level |
string |
日志等级 |
info |
trace, debug, info, warn, error |
|
log_max_days |
int |
日志文件保留天数 |
3 |
|
|
disable_log_color |
bool |
禁用标准输出中的日志颜色 |
false |
|
|
pool_count |
int |
连接池大小 |
0 |
|
|
user |
string |
用户名 |
|
|
设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突 |
dns_server |
string |
使用 DNS 服务器地址 |
|
|
默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址 |
login_fail_exit |
bool |
第一次登陆失败后是否退出 |
true |
|
|
protocol |
string |
连接服务端的通信协议 |
tcp |
tcp, kcp, websocket |
|
tls_enable |
bool |
启用 TLS 协议加密连接 |
false |
|
|
tls_cert_file |
string |
TLS 客户端证书文件路径 |
|
|
|
tls_key_file |
string |
TLS 客户端密钥文件路径 |
|
|
|
tls_trusted_ca_file |
string |
TLS CA 证书路径 |
|
|
|
tls_server_name |
string |
TLS Server 名称 |
|
|
为空则使用 server_addr |
heartbeat_interval |
int |
向服务端发送心跳包的间隔时间 |
30 |
|
|
heartbeat_timeout |
int |
和服务端心跳的超时时间 |
90 |
|
|
udp_packet_size |
int |
代理 UDP 服务时支持的最大包长度 |
1500 |
|
服务端和客户端的值需要一致 |
start |
string |
指定启用部分代理 |
|
|
当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用 |
权限验证
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
authentication_method |
string |
鉴权方式 |
token |
token, oidc |
需要和服务端一致 |
authenticate_heartbeats |
bool |
开启心跳消息鉴权 |
false |
|
需要和服务端一致 |
authenticate_new_work_conns |
bool |
开启建立工作连接的鉴权 |
false |
|
需要和服务端一致 |
token |
string |
鉴权使用的 token 值 |
|
|
需要和服务端设置一样的值才能鉴权通过 |
oidc_client_id |
string |
oidc_client_id |
|
|
|
oidc_client_secret |
string |
oidc_client_secret |
|
|
|
oidc_audience |
string |
oidc_audience |
|
|
|
oidc_token_endpoint_url |
string |
oidc_token_endpoint_url |
|
|
|
UI
参数 |
类型 |
说明 |
默认值 |
可选值 |
备注 |
admin_addr |
string |
启用 AdminUI 监听的本地地址 |
0.0.0.0 |
|
|
admin_port |
int |
启用 AdminUI 监听的本地端口 |
0 |
|
|
admin_user |
string |
HTTP BasicAuth 用户名 |
|
|
|
admin_pwd |
string |
HTTP BasicAuth 密码 |
|
|
|
asserts_dir |
string |
静态资源目录 |
frps.ini是服务端的配置文件、frpc.ini是客户端的配置文件
frps.ini配置内容:
[common]
bind_addr = 0.0.0.0
#默认就好不用修改
bind_port = 6000
#这个端口随意,你可以改成您喜欢的任意端口(与服务端需要保持一致)
Privilege_token = 123456
#这个相当于密匙,需要记住(你可以改成你自己容易记住的),客户端会用到。
vhost_http_port = 880
#我的80端口被封了所以用880代替(记住这个端,使用web穿透会用到)
vhost_http_port = 443
#我的443端口可以用
#880和443是web访问用的
dashboard_port = 90 #web管理端口
dashboard_user = admin #web访问帐号
dashboard_pwd = admin #web访问密码
subdomain_host = xxxxxxxx.i234.me
#域名(可以是一级域名,也可以是二级域名)
frpc.ini配置内容:
[common]
server_addr = xxx.i234.me #连接服务端的地址
server_port = 6000 #连接服务端的端口
Privilege_token = 123456 #鉴权使用的 token 值,需要和服务端设置一样的值才能鉴权通过
user = beijing #用户名
[web]
type = http #指定代理类型
local_port = 5000
subdomain = DSM #自定义二级域名链接前缀,访问地址是 DSM.xxx.i234.me:880(不要问880是哪里的端口,前边有自己找一下)
[TCP]
type = TCP #指定代理类型
local_ip = 127.0.0.1
local_port = 5000 #客户端端口
remote = 5000 #服务端端口
上边是我的配置文件,请不要全部搬走,要根据你的实际情况修改。
设置好配置文件,分别将frps、frps.ini,frpc、frpc.ini放入NAS的home文件夹
先将frps、frps.ini上传到服务端的NAS的admin账户的home文件夹,将路径记下来。
再将frpc、frpc.ini上传到客户端的NAS的admin账户的home文件夹,将路径记下来
最后一步,启动服务。
1.启动服务端frps
启动之前先在服务端的路由器上转发下端口,将需要用到的端口转发到服务端的NAS上!!!!!
ssh登录测试下是否能正常启动
打开putty
→ admin账户登录
→ sudo -i →输入密码
→ cd /volume1/homes/admin/frps
→ ./frps -c ./frps.ini
然后看到start frps success 表示启动成功。
关掉putty,打开DSM管理页面,控制面板 → 计划任务 → 新增 → 触发的任务 → 用户自定义脚本
任务设置 → 用户自定义的脚本 → 输入下面的命令(你的路径不一定和我的一样)
cd /volume1/homes/admin/frps
./frps -c ./frps.ini
右键选中新建的计划任务 → 运行 。
OK!frp服务端设置完成,打开192.168.xx.x:90或者域名xxx.i234.me:90(不要问我90端口号是干啥的,上边的frps.ini配置里边有)
2.接下来启动客户端
ssh登录测试下是否能正常启动
打开putty
→ admin账户登录
→ sudo -i
→输入密码
→ cd /volume1/homes/admin/frpc
→ ./frpc -c ./frpc.ini
然后看到start frps success 表示启动成功。
关掉putty,打开DSM管理页面,控制面板 → 计划任务 → 新增 → 触发的任务 → 用户自定义脚本
任务设置 → 用户自定义的脚本 → 输入下面的命令(你的路径不一定和我的一样)
cd /volume1/homes/admin/frpc
./frpc -c ./frpc.ini
OK!frp客户端设置完成,打开xxxxxx.i234.me:90(不要问我90端口号是干啥的,上边的frps.ini配置里边有)看到HTTP有两个服务在线了。
现在可以使用xxx.i234.me:5000访问客户端的nas
备注:
关于Linux下操作:
修改配置完frps.ini、frpc.ini文件后,启动 frps:./frps-c ./frps.ini,这样执行完frps是运行了,但是在前台运行,无法执行其它程序的操作。可以在
服务器设置frps服务端开机启动,修改vi /etc/rc.local ,在最后面加上:/usr/local/frps/frps -c/usr/local/frps/frps.ini -L /usr/local/frps/frps.log,加在exit 0前面,这样就可以开机自动运行,但这样这个程序还是在前台运行,造成无法执行其它程序的操作。SSH登录后怎么解决?修改vi /etc/rc.local ,在最后面加上:/usr/local/frps/frps -c /usr/local/frps/frps.ini -L /usr/local/frps/frps.log,在最后加上 &,使其变成这样:/usr/local/frps/frps -c /usr/local/frps/frps.ini -L /usr/local/frps/frps.log &
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。