0%

内网穿透 FRP 安装配置使用

内网没有公网IP,但是又有需要提供内网机器上部署的应用或者服务器给外网访问,这个动作就是内网穿透。ngrok、frp 等工具就是用来干这个的。 frp 支持tcp、udp、http、https等协议类型,并且支持web服务器根据域名进行路由转发。

配置前准备

PS: 下载包时,要考虑服务端(公网服务器)、客户端(本地计算机)的系统及芯片。 比如服务端为 centos7 64 位, 客户端为 MacOs 。 那么服务端下载的是 frp_xx.xx.xx_linux_xxxx.tar.gz , 客户端下载的是 frp_xx.xx.xx_darwin_xxxxx.tar.gz

服务端配置

  • 服务器系统为 Centos7 AMD 64位
  • frp 存储目录为 /usr/local/etc/frp

安装

根据系统下载服务端文件 https://github.com/fatedier/frp/releases

1
2
3
4
5
6
7
8
# 目录可存放在自己想存放的位置
cd /usr/local/etc/
# 下载
wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_arm64.tar.gz
# 解压
tar -zxvf frp_0.37.0_linux_arm64.tar.gz
# 重命名
mv frp_0.37.0_linux_arm64 frp

修改配置文件

1
2
3
4
# 到 frp 存放目录
cd /usr/local/etc/frp
# 修改配置 frps.ini
vi frps.ini

frps.ini 配置修改,更多高阶配置参考frp 文档

1
2
3
4
5
6
7
[common]
# 客户端通信端口
bind_port = 7000
# 访问 web 端口
vhost_http_port = 6800
# 身份验证
token = 123456

防火墙开放端口

1
2
3
4
# 端口修改为您 frps.ini 设置的 bind_port 
firewall-cmd --zone=public --add-port=7000/tcp --permanent
# 重启防火墙
firewall-cmd --reload

启动

启动方式有 2 种,2 选 1 即可

  • 命令行直接启动(不推荐)
  • 配置到系统服务中

配置到系统服务中

1
2
3
4
# 复制服务到系统服务中。 注意切换到你的 frp 保存路径
cp /usr/local/etc/frp/systemd/frps.service /etc/systemd/system/frps.service
# 编辑 service
vi /etc/systemd/system/frps.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
# User=nobody, 如果要 frp 独占 80 端口需要注释掉。但大多数情况我相信大部分人都是用的 nginx 转发
User=nobody
Restart=on-failure
RestartSec=5s
# 此处切换为你的 frp 路径
ExecStart=/usr/local/etc/frp/frps -c /usr/local/etc/frp/frps.ini

[Install]
WantedBy=multi-user.target
1
2
3
4
# 开机启动
systemctl enable frps
# 启动 frp
systemctl start frps

控制台启动(不推荐)

不推荐控制台启动

  • 显示启动,关闭 bash 就停止了
  • 后台启动,不方便关闭。
  • 命令复杂,不容易记忆
1
2
3
4
# 显示启动,关闭 bash 窗口,程序就停止了
./frps -c ./frps.ini
# 后台启动,不便于关闭。关闭方法自行搜索
nohup ./frps -c ./frps.ini &

Nginx 转发配置

我使用的 https ,配置如下

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
server {
listen 80;
server_name frp.sample.com;
rewrite ^(.*) https://$server_name$1 permanent; # 转发 443
}

server {
listen 443 ssl;
server_name frp.sample.com; # 修改域名/二级域名

underscores_in_headers on; # 允许传递带_ 的参数 默认 off

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;

# ssl 证书
ssl_certificate /etc/letsencrypt/live/frp.sample.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/frp.sample.com/privkey.pem;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:6800; # 转发到frps.ini 配置的 vhost_http_port 端口上
}
}

客户端配置

  • 本地计算机系统为 MacOS 11.4 Inter 64位
  • frp 存储目录为 /User/alexliu/tools/frp

配置

根据系统下载服务端文件 https://github.com/fatedier/frp/releases

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
vi /User/alexliu/tools/frp/frpc.ini

# 配置文件配置如下

[common]
server_addr = xxx.xxx.xxx.xxx # 公网服务器ip,部署 frps 服务端主机 ip
server_port = 7000 # 与服务端bind_port一致

# 公网通过ssh访问本机
[ssh]
type = tcp # 连接协议
local_ip = xxx.xxx.xxx.xxx # 本地计算机ip
local_port = 22 # ssh默认端口号
remote_port = 6000 # 自定义的访问内部ssh端口号

# 公网访问本机web服务器以http方式
[web]
type = http # 根据本地 web 服务协议来,如果本地 web 服务是 ssl,就是 https
local_port = 8081 # web 服务端口
custom_domains = frp.sample.com # 公网访问域名

启动

1
2
./frpc -c ./frpc.ini            # 显示启动
nohup ./frpc -c ./frpc.ini & # 后台启动

其他配置

自定义二级域名

自定义二级域名,可以分发至多个 web服务

  • 服务端修改
1
2
3
4
5
6
[common]
bind_port = 7000
vhost_http_port = 6800
token = 123456
# 设置主域名
subdomain_host = frp.sample.com
  • 客户端配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[common]
server_addr = xxx.xxx.xxx
server_port = 7000
token = 123456

[web]
type = http
local_port = 80
# 设置子域名
subdomain = a

[web1]
type = http
local_port = 8080
# 设置子域名
subdomain = b

这时候 访问a.frp.sample.com访问 80 端口应用。 访问b.frp.sample.com访问8080端口应用。 nginx 转发需要改为泛域名 *.frp.sample.com ,如果是 https 需要申请泛域名证书

Dashboard

Dashboard 是可以通过浏览器查看 frp 的状态以及代理统计信息。

1
2
3
4
5
6
7
8
9
10
11
12
# 编辑 服务端 frps.ini
[common]
bind_port = 7000
vhost_http_port = 6800
token = 123456
# 设置主域名
subdomain_host = frp.sample.com

dashboard_port = 7500
# dashboard 用户名密码,默认都为 admin,为空则不需要
dashboard_user = admin
dashboard_pwd = admin

然后开放服务端端口 7500 , 使用 IP:Port 即可访问。如果需要 nginx 转发,配置好后,转发 7500 即可