「linux」frp内网穿透配置

版本:frp_0.32.0_linux_amd64.tar

下载链接:https://pan.baidu.com/s/1y77sso0fvAX2tvsm3ac7Ew
提取码:jhce

文件存放路径: /usr/local/program //路径无所谓

1、准备工作

上传文件至 /usr/local/program

解压文件

重命名文件夹

删除客户端使用配置文件

1
2
3
tar -zxvf  frp_0.32.0_linux_amd64.tar.gz
mv frp_0.32.0_linux_amd64 frp_0.32.0
mv frpc frpc_full.ini frpc.ini /usr/temps

image-20200425170156928

2、修改服务端配置文件

官方说明地址: https://github.com/fatedier/frp/blob/master/README_zh.md

frps.ini内容:

1
2
3
4
# frps.ini
[common]
# 服务端用来监听的或者转发数据的端口
bind_port = 7000

3、启动服务端配置

1
./frps -c ./frps.ini

4、客户端配置 //映射的内网主机

客户端和服务端一样准备工作,

修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x:

注意,local_port(客户端侦听)和 remote_port(服务器端暴露)是用来出入 frp 系统的两端,server_port 则是服务器用来与客户端通讯的。

1
2
3
4
5
6
7
8
9
10
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

5、启动客户端配置

1
./frpc -c ./frpc.ini

6、其他可选配置

6.1 服务端网页监控启用

需要在 frps.ini 中指定 dashboard 服务使用的端口,即可开启此功能:

1
2
3
4
5
[common]
dashboard_port = 7500
# dashboard 用户名密码,默认都为 admin
dashboard_user = admin
dashboard_pwd = admin

打开浏览器通过 http://[server_addr]:7500 访问 dashboard 界面,用户名密码默认为 admin

6.2 客户端网页监控启动

需要在 frpc.ini 中指定 admin 服务使用的端口,即可开启此功能:

1
2
3
4
5
[common]
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

打开浏览器通过 http://127.0.0.1:7400 访问 Admin UI,用户名密码默认为 admin

如果想要在外网环境访问 Admin UI,将 7400 端口映射出去即可,但需要重视安全风险。

6.3 客户端身份验证

目前 frpc 和 frps 之间支持两种身份验证方式,tokenoidc

以下使用token验证方式:

配置token验证方式:

frps.ini[common] section 的 authentication_method 参数配置需要使用的验证方法。

1
2
3
4
5
6
7
#将会在每一个心跳包中附加上鉴权信息。
authenticate_heartbeats = true
#将会在每次建立新的工作连接时附加上鉴权信息。
authenticate_new_work_conns = true
#启用基于 token 的验证方式
authentication_method = token
token = 1234567

frpc.ini启用 token

1
2
#对应服务端token
token = 1234567
6.4 端口白名单- 端口安全

需要在 frps.ini 中添加客户端允许使用端口或端口组:这里的端口为服务器的端口

1
2
#端口白名单- 允许客户端可使用的端口        //服务器的端口 ; 未列出的客户端不能使用
allow_ports = 2222,2223-65535

allow_ports 可以配置允许使用的某个指定端口或者是一个范围内的所有端口,以 , 分隔,指定的范围以 - 分隔。

6.5 范围端口映射

在 frpc 的配置文件中可以指定映射多个端口,目前只支持 tcp 和 udp 的类型。

这一功能通过 range: 段落标记来实现,客户端会解析这个标记中的配置,将其拆分成多个 proxy,每一个 proxy 以数字为后缀命名。

例如要映射本地 6000-6005, 6007 这6个端口,主要配置如下:

1
2
3
4
5
6
# frpc.ini
[range:test_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 6000-6006,6007
remote_port = 6000-6006,6007

实际连接成功后会创建 8 个 proxy,命名为 test_tcp_0, test_tcp_1 ... test_tcp_7

6.6 日志记录

可在服务端及客户端配置:

1
2
3
4
5
6
# 设置日志路径
log_file = ./frps.log
# 日志模式trace, debug, info, warn, error
log_level = info
#最大记录日志数量
log_max_days = 3
6.7 开机自启动

后台应用

服务端

1
nohup /usr/local/program/frp_0.34.3/frps -c /usr/local/program/frp_0.34.3/frps.ini &

客户端:

1
nohup /usr/local/program/frp_0.32.0/frpc -c /usr/local/program/frp_0.32.0/frpc.ini &

服务端复制frp目录下systemd/frps.service至系统目录/etc/systemd/system/

1
cp systemd/frps.service /etc/systemd/system/

内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /usr/local/program/frp_0.32.0/frps.ini

[Install]
WantedBy=multi-user.target

启动&开机启动

1
2
systemctl start frps
systemctl enable frps

客户端复制frp目录下systemd/frpc.service至系统目录/etc/systemd/system/

1
cp systemd/frpc.service /etc/systemd/system/

内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Frp Client Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /usr/local/program/frp_0.32.0/frpc.ini
ExecReload=/usr/bin/frpc reload -c /usr/local/program/frp_0.32.0/frpc.ini

[Install]
WantedBy=multi-user.target

启动&开机启动

1
2
systemctl start frpc
systemctl enable frpc
6.8 底层通信可选 kcp 协议

服务器带宽允许的情况下可开启kcp协议, 可以以10%-20%的带宽的代价,换取平均延迟降低 30%-40%

底层通信协议支持选择 kcp 协议,在弱网环境下传输效率提升明显,但是会有一些额外的流量消耗。

开启 kcp 协议支持:

  1. 在 frps.ini 中启用 kcp 协议支持,指定一个 udp 端口用于接收客户端请求:
1
2
3
4
5
# frps.ini
[common]
bind_port = 7000
# kcp 绑定的是 udp 端口,可以和 bind_port 一样
kcp_bind_port = 7000
  1. 在 frpc.ini 指定需要使用的协议类型,目前只支持 tcp 和 kcp。其他代理配置不需要变更:
1
2
3
4
5
6
# frpc.ini
[common]
server_addr = x.x.x.x
# server_port 指定为 frps 的 kcp_bind_port
server_port = 7000
protocol = kcp
  1. 像之前一样使用 frp,需要注意开放相关机器上的 udp 的端口的访问权限。

拓展知识:

KCP介绍

1 简介

KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。

2 技术特性

TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而 KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。TCP信道是一条流速很慢,但每秒流量很大的大运河,而KCP是水流湍急的小激流。KCP有正常模式和快速模式两种,通过以下策略达到提高流速的结果:

RTO翻倍vs不翻倍:

TCP超时计算是RTOx2,这样连续丢三次包就变成RTOx8了,十分恐怖,而KCP启动快速模式后不x2,只是x1.5(实验证明1.5这个值相对比较好),提高了传输速度。

选择性重传 vs 全部重传:

TCP丢包时会全部重传从丢的那个包开始以后的数据,KCP是选择性重传,只重传真正丢失的数据包。

快速重传:

发送端发送了1,2,3,4,5几个包,然后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时,KCP知道2被跳过1次,收到ACK4时,知道2被跳过了2次,此时可以认为2号丢失,不用等超时,直接重传2号包,大大改善了丢包时的传输速度。

延迟ACK vs 非延迟ACK:

TCP为了充分利用带宽,延迟发送ACK(NODELAY都没用),这样超时计算会算出较大 RTT时间,延长了丢包时的判断过程。KCP的ACK是否延迟发送可以调节。

UNA vs ACK+UNA:

ARQ模型响应有两种,UNA(此编号前所有包已收到,如TCP)和ACK(该编号包已收到),光用UNA将导致全部重传,光用ACK则丢失成本太高,以往协议都是二选其一,而 KCP协议中,除去单独的 ACK包外,所有包都有UNA信息。

非退让流控:

KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。

作者:hexg1016
链接:https://www.jianshu.com/p/28d4b02e7eb4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

7、管理页面

服务器管理页面: http://remote主机:7500

客户端管理页面(只能在内网服务端使用): http://localhostIP:7400

二、其他配置

1、安全地暴露内网服务 //暂时不使用, 若存在数据安全或其他重要信息访问可使用

对于某些服务来说如果直接暴露于公网上将会存在安全隐患。

使用 stcp(secret tcp) 类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc。

以下示例将会创建一个只有自己能访问到的 ssh 服务代理。

frps 的部署步骤同上。

  1. 启动 frpc,转发内网的 ssh 服务,配置如下,不需要指定远程端口:
1
2
3
4
5
6
7
8
9
10
11
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh]
type = stcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
  1. 在要访问这个服务的机器上启动另外一个 frpc,配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 绑定本地端口用于访问 ssh 服务
bind_addr = 127.0.0.1
bind_port = 6000
  1. 通过 ssh 访问内网机器,假设用户名为 test:
1
ssh -oPort=6000 test@127.0.0.1

2、加密与压缩 //防火墙对流量对SSH流量启用了过滤, 可以使用这种方式

这两个功能默认是不开启的,需要在 frpc.ini 中通过配置来为指定的代理启用加密与压缩的功能,压缩算法使用 snappy:

1
2
3
4
5
6
7
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true

如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 ssh 协议等,通过设置 use_encryption = true,将 frpc 与 frps 之间的通信内容加密传输,将会有效防止流量被拦截。

如果传输的报文长度较长,通过设置 use_compression = true 对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 cpu 资源。

3、代理限速

目前支持在客户端的代理配置中设置代理级别的限速,限制单个 proxy 可以占用的带宽。

1
2
3
4
5
6
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
bandwidth_limit = 1MB

在代理配置中增加 bandwidth_limit 字段启用此功能,目前仅支持 MBKB 单位。

4、负载均衡 //为远程端口启用开启备用服务, 使用group 1个远端端口绑定多个客户端口

可以将多个相同类型的 proxy 加入到同一个 group 中,从而实现负载均衡的功能。

目前只支持 TCP 和 HTTP 类型的 proxy。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# frpc.ini
[test1]
type = tcp
local_port = 8080
remote_port = 80
group = web
group_key = 123

[test2]
type = tcp
local_port = 8081
remote_port = 80
group = web
group_key = 123

用户连接 frps 服务器的 80 端口,frps 会将接收到的用户连接随机分发给其中一个存活的 proxy。这样可以在一台 frpc 机器挂掉后仍然有其他节点能够提供服务。

TCP 类型代理要求 group_key 相同,做权限验证,且 remote_port 相同。

HTTP 类型代理要求 group_key, custom_domains 或 subdomain 和 locations 相同。

5、健康检查 //配合负载均衡使用, 频次检查端口是否在线

5、健康检查

通过给 proxy 加上健康检查的功能,可以在要反向代理的服务出现故障时,将这个服务从 frps 中摘除,搭配负载均衡的功能,可以用来实现高可用的架构,避免服务单点故障。

在每一个 proxy 的配置下加上 health_check_type = {type} 来启用健康检查功能。

type 目前可选 tcp 和 http。

tcp 只要能够建立连接则认为服务正常,http 会发送一个 http 请求,服务需要返回 2xx 的状态码才会被认为正常。

tcp 示例配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# frpc.ini
[test1]
type = tcp
local_port = 22
remote_port = 6000
# 启用健康检查,类型为 tcp
health_check_type = tcp
# 建立连接超时时间为 3 秒
health_check_timeout_s = 3
# 连续 3 次检查失败,此 proxy 会被摘除
health_check_max_failed = 3
# 每隔 10 秒进行一次健康检查
health_check_interval_s = 10

http 示例配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# frpc.ini
[web]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = test.yourdomain.com
# 启用健康检查,类型为 http
health_check_type = http
# 健康检查发送 http 请求的 url,后端服务需要返回 2xx 的 http 状态码
health_check_url = /status
health_check_interval_s = 10
health_check_max_failed = 3
health_check_timeout_s = 3

「linux」frp内网穿透配置
https://www.tohmm.cn/20200428/L-Linux-frp0.32.0内网穿透配置/
作者
H.mm
发布于
2020年4月28日
许可协议