Ryan Shang

生死看淡,不服就干

0%

使用FRP实现内网穿透

一、 背景

购买了树莓派4B,可以放在家里当作一个小型的服务器使用,因为想在外的时候也可以访问,就可以使用frp这个工具来实现内网穿透。之前也在给手机使用Linux Deploy时使用过,这次刚好记录下配置过程,实现通过公网访问树莓派的一些服务。

二、简介

1. frp是什么?

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

Github:https://github.com/fatedier/frp

2. 为什么使用 frp ?

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
  • 代理组间的负载均衡。
  • 端口复用,多个服务通过同一个服务端端口暴露。
  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
  • 服务端和客户端 UI 页面。

三、过程

1. 服务端frps

下载frp

1
wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz

解压到指定文件夹,并重命名文件夹

1
2
tar -C /home/ryan/ -xzf frp_0.36.2_linux_amd64.tar.gz
mv frp_0.36.2_linux_amd64 Frp

这样frp的文件存放的目录会在/home/ryan/Frp目录下

编辑配置文件/home/ryan/Frp/frps.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[common]
bind_addr = 0.0.0.0 # 访问地址,公网可访问
bind_port = 7070 # frps服务运行端口
vhost_http_port = 7080 # frps服务的http服务端口,配合nginx可以实现公网访问树莓派上部署的网站

dashboard_addr = 0.0.0.0 # 面板服务绑定的访问地址,公网可访问
dashboard_port = 7090 # 面板服务的端口
dashboard_user = admin # 面板服务的登录账号
dashboard_pwd = xxxxxxxxx # 面板服务的登录密码

log_file = /home/ryan/Frp/frps.log # 日志路径
log_level = info # 日志级别
log_max_days = 3 # 日志保留时长

authentication_method = token # 客户端和服务端通信的身份校验方法
token = 12345678 # 客户端和服务端使用token校验时候的token值

allow_ports = 7000-8000 # 允许使用的端口范围

然后在/etc/systemd/system下新建frps.service服务,用来实现控制服务的启动、关闭和随系统启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
# 服务名称,可自定义
Description = Frp Server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
User=ryan
Restart=on-failure
RestartSec=60s
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /home/ryan/Frp/frps -c /home/ryan/Frp/frps.ini

[Install]
WantedBy = multi-user.target

保存后,执行:

1
2
3
sudo systemctl daemon-reload # 重新加载systemd服务配置
sudo systemctl enable frps # frps服务开机自启动
sudo systemctl start frps # frps服务启动

这样服务端就配置好了。

2. 客户端frpc

下载frp

1
wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_arm64.tar.gz

解压到指定文件夹,并重命名文件夹

1
2
tar -C /home/ryan/ -xzf frp_0.36.2_linux_arm64.tar.gz
mv frp_0.36.2_linux_arm64 Frp

这样frp的文件存放的目录会在/home/ryan/Frp目录下

编辑配置文件/home/ryan/Frp/frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[common]
server_addr = 1.2.3.4
server_port = 7070

log_file = /home/ryan/Frp/frpc.log # 日志路径
log_level = info # 日志级别
log_max_days = 3 # 日志保留时长

token = 12345678 # 客户端和服务端校验时候的token值

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

[demo]
type = http
local_ip = 127.0.0.1
local_port = 80
subdomain = demo
custom_domains = demo.ryanshang.com

然后在/etc/systemd/system下新建frpc.service服务,用来实现控制服务的启动、关闭和随系统启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
# 服务名称,可自定义
Description = Frp Client
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
User=ryan
Restart=on-failure
RestartSec=60s
# 启动frps的命令,需修改为您的frpc的安装路径
ExecStart = /home/ryan/Frp/frpc -c /home/ryan/Frp/frpc.ini

[Install]
WantedBy = multi-user.target

保存后,执行:

1
2
3
sudo systemctl daemon-reload # 重新加载systemd服务配置
sudo systemctl enable frpc # frpc服务开机自启动
sudo systemctl start frpc # frpc服务启动

这样客户端就配置好了。

这时候可以使用ssh来在公网连接树莓派:

1
ssh ryan@ryanshang.com -p 7022

不过网站demo暂时还无法访问,需要对服务端和客户端的nginx进行额外配置

给服务端的nginx增加配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80;
server_name demo.ryanshang.com;
location / {
proxy_pass http://127.0.0.1:7080; # frps服务端中vhost_http_port配置的端口
proxy_redirect http://$host/ http://$http_host/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
location ~* \.(jpg|jpeg|gif|png|svg|css|scss|js|ico|xml|woff|woff2|ttf|otf|eot)$ {
proxy_pass http://127.0.0.1:7080;
proxy_redirect http://$host/ http://$http_host/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}

使用sudo nginx -s reload,重新加载nginx配置。

然后给客户端的nginx增加配置:

1
2
3
4
5
6
7
8
server {
listen 80;
server_name demo.ryanshang.com;
location / {
root /opt/Web/demo;
index index.html;
}
}

这样在公网就可以访问demo.ryanshang.com这个部署在树莓派上的站点了。