frp实现内网穿透

一、frp的作用

frp的作用就是实现内网穿透,内网穿透就是允许内网的主机能够被外网的其他主机访问,内网穿透是反向代理技术中的一个中间环节技术。对于反向代理的更多理解可见另外一文《关于代理技术的理解》

  1. 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。说罢,也就是给外网提供内网主机的http 或 https 服务。

  2. 此外,还能利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

此处的讲解包括:

  1. 外网访问内网http 或 https 服务
  2. 外网访问内网ssh服务

二、准备说明

实现功能

(1)自定义绑定域名访问内网web服务

配置前准备

(1)公网服务器1台
(2)内网服务器1台
(3)公网服务器绑定域名1个
(4)内网服务器部署一个web服务
(5)内网服务器部署安装了ssh服务(如只做web服务,可以省略此步)

三、服务端

安装配置

1
2
3
4
5
6
#下载frp
wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz
#解压文件
tar -zxvf frp_0.44.0_linux_amd64.tar.gz
#进入解压目录
cd frp_0.44.0_linux_amd64

frpsfrps.ini这个两个是服务端文件,frpcfrpc.ini这两个是客户端文件

配置服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vi ./frps.ini
[common]
#与客户端绑定的进行通信的端口(必选)
bind_port = 7000
#访问客户端web服务http协议自定义的端口号,如果公网服务器已经搭建占用8080端口的web服务,请自行修改(可选)
vhost_http_port = 8080
#访问客户端web服务https协议自定义的端口号,如果公网服务器已经搭建占用443端口的web服务,请自行修改(可选)
vhost_https_port = 443

##frp认证配置(可选,客户端和服务端配置需要一致)
#认证方式(token)
authentication_method = token
#认证方式, 开启连接时校验
authenticate_new_work_conns = true
#token认证密码(可自定义)
token = admin@12345678

##frp服务端web控制台配置(可选,主要用于监控当前连接端口,访问地址:http://服务端IP:7001)
dashboard_port = 7001
dashboard_user = admin
dashboard_pwd = admin@12345678

按”i”键进行编辑,按esc退出编辑状态,输入:wq退出

防火墙配置

1
2
3
4
 #查看当前firewall防火墙服务是否开启
firewall-cmd --state
#查看当前firewall服务所有端口开放情况
firewall-cmd --list-all

如果防护墙处于关闭状态的话无需进行以下端口号的开放步骤,否则继续。

如果7000端口和8080端口已经开放并且没有进程占用端口的话,则无需进行以下端口号的开放步骤,否则继续。

1
2
3
4
5
firewall-cmd --permanent --add-port=7000/tcp	#开放frp服务端的监听端口
firewall-cmd --permanent --add-port=7001/tcp #开放frp服务端web控制台访问端口
firewall-cmd --permanent --add-port=8080/tcp #开放frp对客户端web服务访问的相关转发端口
firewall-cmd --zone=public --add-port=5000-5999/tcp --permanent #开放frp对客户端访问的相关转发端口区间(推荐内网穿透的远程端口设置在某个端口区间,目的是只要客户端后期添加端口在该端口区间范围时服务端不需要反复配置防火墙)
firewall-cmd --reload #重新加载防火墙配置

启动服务端

1
2
3
4
#临时启动
./frps -c ./frps.ini
#后台保持启动
nohup ./frps -c ./frps.ini &

四、客户端

安装配置

根据客户端操作系统的情况下载frp客户端

需要注意的是:客户端和服务端的版本号要一致。

frp服务端和客户端都是在一个包里,如果都是linux则下载相同版本的frp_版本号_linux_amd64.tar.gz即可,如果客户端是windows,那么下载frp_版本号_windows_amd64.zip

不同操作系统操作大同小异。下面以linux为例,假设已经下载并解析好。

1
vi ./frpc.ini #编辑frpc.ini配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[common]
#frp服务端的IP或域名(必选)
server_addr = 45.129.11.99
#frp服务端的监听端口(必选)
server_port = 7000
#启用TLS加密传输功能(可选,从v0.25.0版本开始frpc和frps之间支持通过TLS协议加密传输)
tls_enable = true

##frp认证配置(可选,客户端和服务端配置需要一致)
#认证方式(token)
authentication_method = token
#认证方式, 开启连接时校验
authenticate_new_work_conns = true
#token认证密码(可自定义)
token = admin@12345678

##frp客户端控制台(可选,可用于动态修改客户端配置,其中admin_addr可设置为客户端的一个指定IP地址,那么访问则需要通过这个IP地址进行访问,如果希望可以通过客户端的多个IP地址进行访问,则可以设置为0.0.0.0。访问地址为:http://IP:7002)
admin_addr = 0.0.0.0
admin_port = 7002
admin_user = admin
admin_pwd = admin@12345678

##自定义内网穿透端口映射配置(可选)
#http服务的内网穿透端口映射配置([ ]里的名称可自定义,表示服务名称)
[web]
#访问协议
type = tcp
#本地地址(同一内网下的任何主机地址都可以)
local_ip = 127.0.0.1
#local_ip = 192.168.222.131
#本地端口
local_port = 5000
#远程端口(要确保远程服务器防火墙开放对应端口)
remote_port = 5000

#http服务的内网穿透端口映射配置(访问协议为http时,可以进行更多的配置)
[web2]
type = http
local_ip = 127.0.0.1
local_port = 80
#type为http时可以不用设置remote_port,默认会统一使用服务端配置的vhost_http_port作为远程端口
#type为http时可自定义域名(访问公网服务器域名,需要解析域名到server_addr)
custom_domains = example.com

#ssh服务的内网穿透端口映射配置
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 5001

启动客户端

1
2
3
4
5
6
7
8
#临时启动
./frpc -c ./frpc.ini

#后台保持启动(仅Linux)
nohup ./frpc -c ./frpc.ini &

#重新加载配置(如修改配置文件)
./frpc reload

五、测试http和ssh

(1)http测试:

浏览器打开访问http://域名:8080/资源路径(如:http://example.com:8080/myproject/index.html

(2)ssh测试:

1
2
3
4
5
ssh [-p port] user@remote   #ssh远程连接服务器
#如:
ssh -p 5001 [email protected]
#或者
ssh -p 5001 [email protected]

六、配置详解

服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[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只对同意客户端的连接进行复用;

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
[common]                        # 通用配置段

server_addr = 0.0.0.0 # server的IP地址;支持IPv6
server_port = 7000 # server的端口;

# 如果要通过http或socks5代理连接frps,可以在此处或在全局环境变量中设置代理,只支持tcp协议;
# http_proxy = http://user:[email protected]:8080
# http_proxy = socks5://user:[email protected]:1080

# 客户端日志
log_file = ./frpc.log # 指定日志文件;
log_level = info # 指定日志等级;
log_max_days = 3


token = 12345678 # 客户端与服务端通信的身份验证令牌
tls_enable = true #从v0.25.0版本开始frpc和frps之间支持通过TLS协议加密传输。通过在frpc.ini的common中配置tls_ enable = true来启用此功能,安全性更高。
#为了端口复用,frp建立TLS连接的第一个字节为0x17。
#注意:启用此功能后除xtcp外,不需要再设置use. encryption。
# 设置管理地址,用于通过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;

七、参考

https://www.bookstack.cn/read/frp-0.36-zh/70fe76b44fdacf77.md

http://www.yangjinxiang.com/article/119.html



----------- 本文结束 -----------




如果你觉得我的文章对你有帮助,你可以打赏我哦~
0%