部署Frp内网穿透

部署Frp内网穿透

前言

frp是一个用Go语言开发的、可用于内网穿透的高性能的反向代理应用,支持tcp, udp、http和https。可将一个部署在本机的web服务映射到外网。

frp作用

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
利用处于内网或防火墙后的机器没有外网IP,但是又需要对外网环境提供 http 或 https 服务。
对于 http 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
利用处于内网或防火墙后的机器,对外网环境提供 tcp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

frp架构

部署Frp

环境准备

1
2
3
4
5
6
7
8
# 通过指定域名访问部署于内网的 web 服务
# 内网服务器(客户端)
# 一台公网服务器(server)
# 准备域名一个(如果只做ssh就不用)
# 系统环境
1. Ubuntu 20.04
2. Frp 0.48.0
3. Nginx 1.20.2

服务端安装

由于Frp所用到版本包在GitHub上,GitHub项目地址https://github.com/fatedier/frp 由于某种原因国内无法下载,要下载包的话 可以通过作者的下载链接进行下载http://image.oaali.com/down/Other/frp_0.48.0_linux_amd64.tar.gz 下面开始安装

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
root@VM-0-15-ubuntu:/app# cd /app/soft/
root@VM-0-15-ubuntu:/app/soft# wget http://image.oaali.com/down/Other/frp_0.48.0_linux_amd64.tar.gz
# 解压压缩包
root@VM-0-15-ubuntu:/app/soft# tar xf frp_0.48.0_linux_amd64.tar.gz
# 重命名为frp
root@VM-0-15-ubuntu:/app/soft# mv frp_0.48.0_linux_amd64 frp
root@VM-0-15-ubuntu:/app/soft# ll
total 908460
drwxr-xr-x 7 root root 4096 Apr 21 10:56 ./
drwxr-xr-x 20 root root 4096 Apr 21 14:55 ../
drwxr-xr-x 2 1001 123 4096 Apr 21 11:21 frp/
-rw-r--r-- 1 root root 10664767 Mar 8 11:52 frp_0.48.0_linux_amd64.tar.gz
...
# 进入frp目录
root@VM-0-15-ubuntu:/app/soft# cd frp/
# 删除客户端的配置,这里是server端所以不需要
root@VM-0-15-ubuntu:/app/soft/frp# rm -rf frpc*
root@VM-0-15-ubuntu:/app/soft/frp# ls
frps frps_full.ini frps.ini LICENSE
# 修改配置文件
root@VM-0-15-ubuntu:/app/soft/frp# vim frps.ini
[common]
# frp监听的端口,用作服务端和客户端通信
bind_port = 7000
# 服务端通过此端口接监听和接收公网用户的http请求
vhost_http_port = 7080

# 开启dashboard,frp提供了一个控制台,可以通过这个端口访问到控制台。可查看frp当前有多少代理连接以及对应的状态
dashboard_port = 7500
# dashboard 用户名密码,默认都为 admin
dashboard_user = admin
dashboard_pwd = admin@123.com

# 日志存放路径
log_file = /app/soft/frp/frps.log
log_level = warn
log_max_days = 7

# 服务端的subdomain_host需要和客户端配置文件中的subdomain、local_port配合使用,
# 可通过{subdomain}.{subdomain_host} 的域名格式来访问自己本地的 web 服务。
# 假如服务端的subdomain_host为frp.xxxx.com,客户端某个配置组中的
# subdomain为web,local_port为8585,
# 则访问 web.frp.xxxx.com ,等同于访问本地的localhost:8585
subdomain_host = frp.xxxx.com

# 开启toke认证
authentication_method = token
authenticate_heartbeats = true
authenticate_new_work_conns = true
token = ylxxx.com

# 开启prometheus监控
enable_prometheus = true

# 开启tcp穿透端口范围
allow_ports = 20000-30000

用systemclt管理frps

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 使用systemctl来进行管理
root@VM-0-15-ubuntu:/app/soft/frp# vim /usr/lib/systemd/system/frps.service
[Unit]
Description=frps service

[Service]
ExecStart=/app/soft/frp/frps -c /app/soft/frp/frps.ini
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=frp-service
User=root

[Install]
WantedBy=multi-user.target
# 重新加载
root@VM-0-15-ubuntu:/app/soft/frp# systemctl daemon-reload
root@VM-0-15-ubuntu:/app/soft/frp# systemctl start frps

访问frp的dashboard界面

启动后可以根据配置文件里定义好的端口来访问访问方式为 ip+7500 即可,也可以使用nginx配置一个域名来访问都可以,提前是要把nginx配置好

配置nginx

安装nginx的话可以参考我之前的安装文档 https://www.dklwj.com/2023/03/Compile-and-install-Nginx.html

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
root@VM-0-15-ubuntu:/app/soft/frp# cd /app/nginx/conf/conf.d/     
root@VM-0-15-ubuntu:/app/nginx/conf/conf.d# vim frp_web.conf
server {
listen 80;
server_name *.frp.xxxx.com frp.yxxxx.com;

location / {
# 7080端口即为frp监听的http端口
proxy_pass http://127.0.0.1:7080;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

proxy_connect_timeout 7d;
proxy_send_timeout 7d;
proxy_read_timeout 7d;

}
# 防止爬虫抓取
if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot")
{
return 403;
}
}

客户端安装

1
2
3
4
5
6
7
8
9
10
11
12
13
# 下载frp压缩包
root@mongodb-server-25:/app# wget http://image.oaali.com/down/Other/frp_0.48.0_linux_amd64.tar.gz
root@mongodb-server-25:/app# ls
frp_0.48.0_linux_amd64.tar.gz mysql
root@mongodb-server-25:/app# tar xf frp_0.48.0_linux_amd64.tar.gz
root@mongodb-server-25:/app# ls
frp_0.48.0_linux_amd64 frp_0.48.0_linux_amd64.tar.gz mysql
root@mongodb-server-25:/app# mv frp_0.48.0_linux_amd64 frp
root@mongodb-server-25:/app# ls
frp frp_0.48.0_linux_amd64.tar.gz mysql
root@mongodb-server-25:/app# cd frp
# 在客户端端我们不需要服务端的可执行程序和配置,为了避免误操作,我们可以先删除掉所有服务端的的配置
root@mongodb-server-25:/app/frp# rm -rf frps*

编辑客户端配置文件

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
root@mongodb-server-25:/app/frp# vim frpc.ini
[common]
# 部署frp服务端的公网服务器的ip
server_addr = frps.lxx.xxxx.com
# 和服务端的bind_port保持一致
server_port = 7000

# 开启token认证
authentication_method = token
authenticate_heartbeats = true
authenticate_new_work_conns = true
token = yxxx.com

# 日志存放路径
log_file = /app/frp/frps.log
log_level = warn
log_max_days = 7

# 代理服务一 ,[]内的代理服务名称在全局范围内确保唯一,每个人的每个代理服务不能重名,
# 否则会影响正常使用。
[web-a]
type = http
# local_port代表你想要暴露给外网的本地web服务端口
local_port = 8585
# subdomain 在全局范围内要确保唯一,每个代理服务的subdomain不能重名,否则会影响正常使用。
# 客户端的subdomain需和服务端的subdomain_host配合使用
subdomain = web
use_encryption = true
use_compression = true

# 代理服务二 ,各项配置说明请参考配置组一
[web-b]
type = http
local_port = 8686
subdomain = bb
use_encryption = true
use_compression = true

使用systemctl管理frpc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@mongodb-server-25:/app/frp# vim /usr/lib/systemd/system/frpc.service 
[Unit]
Description=frp service

[Service]
ExecStart=/app/frp/frpc -c /app/frp/frpc.ini
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=frp-service
User=root

[Install]
WantedBy=multi-user.target

客户端部署web服务

在这里使用Nginx来搞一个静态页面能让外网访问到内网这台web服务器上

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
# 先创建好静态页面以及目录
root@mongodb-server-25:~# cd /var/www/
root@mongodb-server-25:/var/www# ls
html
root@mongodb-server-25:/var/www# cd html/
root@mongodb-server-25:/var/www/html# ls
index.nginx-debian.html
root@mongodb-server-25:/var/www/html# mkdir web
root@mongodb-server-25:/var/www/html# cd web/
root@mongodb-server-25:/var/www/html/web# ls
root@mongodb-server-25:/var/www/html/web# vim index.html
root@mongodb-server-25:/var/www/html/web# cat index.html
<h1>This is 8585 Port!</h1>
# 创建虚拟主机
root@mongodb-server-25:/etc/nginx/conf.d# vim web_a.conf
server {
listen 8585;
server_name 172.20.17.25;

location / {
root /var/www/html/web;
index index.html index.htm;
}
}
root@mongodb-server-25:/etc/nginx/conf.d# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@mongodb-server-25:/etc/nginx/conf.d# nginx -s reload
root@mongodb-server-25:/etc/nginx/conf.d# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 0.0.0.0:8585 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*

验证本地客户端服务

最终验证

通过域名访问内网中的web服务器资源


部署Frp内网穿透
https://www.dklwj.com/2023/04/Frp-private-network-penetration-install.html
作者
阿伟
发布于
2023年4月21日
许可协议