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服务端控制台(可选,主要用于监控当前连接端口,访问地址:http://服务端ip:17500)
dashboard_port = 17500
dashboard_user = admin
dashboard_pwd = admin

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

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

防火墙配置

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

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

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

1
2
3
firewall-cmd --permanent --add-port=7000/tcp  #开启与客户端绑定的进行通信的端口
firewall-cmd --permanent --add-port=8080/tcp #开启访问客户端web服务自定义的端口号
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
[common]
#公网服务器ip(必选)
server_addr = 144.34.145.10
#与服务端bind_port一致(必选)
server_port = 7000
#启用TLS加密传输功能(可选,从v0.25.0版本开始frpc和frps之间支持通过TLS协议加密传输)
tls_enable = true

##认证配置(可选,客户端和服务端配置需要一致,客户端请求到服务端时需要认证通过才能连接)
#认证方式, token
authentication_method = token
#认证方式, 开启连接时校验
authenticate_new_work_conns = true
#token,可自定义
token = test12345678

##frp客户端端控制台(可选,可用于动态修改客户端配置,访问地址:http://127.0.0.1:7400)
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

##自定义端口映射(可选)
#服务名称([ ]里的名称可自定义),公网访问内部web服务器以http方式
[web]
#访问协议
type = http
#内网服务器ip,同一内网下的任何主机都可以
local_ip = 127.0.0.1
#内网web服务的端口号
local_port = 80
#type为http时可自定义域名(访问公网服务器域名,需要解析域名到server_addr)
custom_domains = qcmoke.top

#公网通过ssh访问内网主机
[ssh]
type = tcp
#内网服务器ip(同一内网下的任何主机都可以)
#local_ip = 127.0.0.1
local_ip = 192.168.222.131
#内网端口
local_port = 22
#外网端口(公网服务器开放的处理ssh转发的端口,要确保服务器防火墙对应端口开放)
remote_port = 7001

通过以下命令给服务器开放7001端口

1
2
firewall-cmd --permanent --add-port=7001/tcp
firewall-cmd --reload

所绑定的公网服务器域名,一级、二级域名都可以,绑定多个域名时用英文“,”分开

启动客户端

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

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

Windows操作系统完成以上类似配置后直接双击运行frpc.exe即可。

如果需要通过ssh访问内网端,则内网端主机还要安装ssh服务,这里的ssh以ubuntu为例:

  • SSH服务端安装

    (1) ubuntu关闭防火墙sudo ufw disable或者放行ssh默认的22端口(关闭防火墙不同linux发行版可能不同)

    (2)查看是否安装ssh, ls /etc/ssh/

    (3)安装openssh-serversudo apt-get install openssh-server

    (4)还没结束,执行sudo vim /etc/ssh/sshd_config编辑sshd_config配置文件,找到 PermitRootLogin并将其值修改为 yes

    (5)执行/etc/init.d/ssh restart重启ssh服务以生效

五、测试http和ssh

  • http:

    浏览器打开访问http://域名:8080/资源路径,如:http://qcmoke.top:8080/myproject/index.html

  • ssh:

    1
    2
    3
    4
    5
    ssh [-p port] user@remote   #ssh远程连接服务器
    #如:
    ssh -p 7001 root@144.34.145.10
    #或者
    ssh -p 7001 root@qcmoke.top

    1546544526817

六、配置详解

服务端

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: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 # 客户端与服务端通信的身份验证令牌
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%