frp内网穿透

1. 前言

frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。frp 项目官网是 https://github.com/fatedier/frp

frp工作原理

服务端运行,监听一个主端口,等待客户端的连接;

客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;

服务端fork新的进程监听客户端指定的端口;

外网用户连接到服务器端指定的端口,服务端通过和客户端的连接将数据转发到客户端;

客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。

2. 前置条件

想要配置frp穿透,首先必须先要有一台具有外网ip(即:可以从因特网访问)的服务器。配置教程主要分为两个部分,一是服务器端(外网服务器)的配置;二是客户端(内网服务器)配置。

3. 安装并配置frp服务器

下载安装程序, 当前(2023/05/02)最新版本为0.48.0版本

1
2
3

wget -O /tmp/frp_0.48.0_linux_amd64.tar.gz https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz

解压frp压缩包

1
tar -zxvf /tmp/frp_0.48.0_linux_amd64.tar.gz -C /usr/local

解压后文件目录结构如下

1
2
3
4
5
6
7
8
9
10
$ tree /usr/local/frp_0.48.0_linux_amd64/
/usr/local/frp_0.48.0_linux_amd64/
├── frpc
├── frpc_full.ini
├── frpc.ini
├── frps
├── frps_full.ini
├── frps.ini
└── LICENSE

以frpc(c代表客户端client)开头的文件都是与frp客户端相关的可执行文件和配置, 如果只是配置frp服务器端可以将这些文件删除.

以frps开头的文件是frp服务端程序, 其中frps_full.ini里包含了frps完整的配置项, 而frps.ini是一个基础的配置, 未在配置文件中出现的选项都会使用默认值. 也即如果你完全精通了frp那么可以使用frps_full.ini逐项配置或调优, 如果你只是初入门frp, 建议使用frps.ini里面仅列出了用户必须修改或调整的选项.

同时创建两个软链接, 这样我们就不用将frps的安装目录添加到Path, 因为/usr/bin默认就在PATH路径中

1
2
3
4
5

ln -s /usr/local/frp_0.48.0_linux_amd64/frps /usr/bin/frps
mkdir -p /etc/frp
ln -s /usr/local/frp_0.48.0_linux_amd64/frps.ini /etc/frp/frps.ini

修改服务器端配置

vi frps.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
# 授权码,请改成更复杂的
token = 52010 # 这个token之后在客户端会用到

# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true

# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3

此时可以使用命令行启动frp server了

1
2
3

/usr/bin/frps -c /etc/frp/frps.ini

如果要设置为开机启动, 还需要自己准备service文件, 可以参考如下配置

vi /usr/lib/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 # frps 将会在 network.service 启动完毕之后再启动

[Service]
Type=simple # 不论进程是否启动成功,systemctl start 都执行成功
User=nobody # 设置进程在执行时使用的用户
Restart=on-failure # on-failure 表示仅在服务进程异常退出时重启
RestartSec=5s # 设置在重启服务前暂停多长时间
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini # 在启动该服务时需要执行的命令行

[Install]
WantedBy=multi-user.target # 用于 systemctl enable 时创建软连接

设置开机启动

1
2
3

systemctl enable frps

启动frp server

1
2
3
4
5
6
# 启动服务
systemctl start frps

# 查看服务状态
systemctl status frps

4. 安装并配置frp客户端

客户端安装在需要穿透内网的电脑上

安装过程与frp类似, 针对不同的操作系统有不同的安装包, 下载一个与想要穿透的主机操作系统匹配

1
2
3

wget -O /tmp/frp_0.48.0_linux_amd64.tar.gz https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz

解压frp压缩包

1
tar -zxvf /tmp/frp_0.48.0_linux_amd64.tar.gz -C /usr/local

同时创建两个软链接, 这样我们就不用将frpc的安装目录添加到Path环境变量, 因为/usr/bin默认就在PATH路径中

1
2
3
4
5

ln -s /usr/local/frp_0.48.0_linux_amd64/frpc /usr/bin/frpc
mkdir -p /etc/frp
ln -s /usr/local/frp_0.48.0_linux_amd64/frpc.ini /etc/frp/frpc.ini

修改客户端配置

vi /usr/local/frp_0.48.0_linux_amd64/frpc.ini

1
2
3
4
5
6
7
8
9
10
11

server_addr = your_public_ip # 公网ip
server_port = 8000 # frp服务器监听端口
token = 52010

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000 # 来自远程端口6000的tcp请求将被转发到此客户端的22端口

此时可以使用命令行启动frp 客户端了

1
2
3

/usr/bin/frpc -c /etc/frp/frpc.ini

如果要设置开机启动, 那么需要准备一个service文件并安装和启动它

vi /usr/lib/systemd/system/frpc.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

[Unit]
Description=Frp client Service # 服务描述
After=network.target # frps 将会在 network.service 启动完毕之后再启动

[Service]
Type=simple # 不论进程是否启动成功,systemctl start 都执行成功
User=nobody # 设置进程在执行时使用的用户
Restart=on-failure # on-failure 表示仅在服务进程异常退出时重启
RestartSec=5s # 设置在重启服务前暂停多长时间
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini # 在启动该服务时需要执行的命令行

[Install]
WantedBy=multi-user.target # 用于 systemctl enable 时创建软连接

5. 测试穿透是否配置成功

在正式开始测试之前

服务器端防火墙需要放行7000, 7500, 6000端口

1
2
3
4
5
6
7
8
9
# 放行外网连接服务器6000端口
sudo firewall-cmd --permanent --add-port=6000/tcp
# 放行frp 服务端口
sudo firewall-cmd --permanent --add-port=7000/tcp
# 放行frp dashboard端口
sudo firewall-cmd --permanent --add-port=7500/tcp
# 刷新防火墙配置
sudo firewall-cmd --reload

测试成功后的效果, 访问公网ip:6000端口会被导向内网的主机的ssh服务上
从而达到使用公网ip访问内网服务的效果

1
ssh -p 6000 root@public_ip

客户端防火墙需放行22端口

6. 相关阅读

frp内网穿透

更多网络相关请访问鹏叔的技术博客 - network

本文原文位于鹏叔的博客空间 - frp内网穿透, 若要获取最近更新, 请访问原文!

7. 参考文档

frp配置内网穿透教程(超详细
使用 systemd 管理 frp 服务

作者

鹏叔

发布于

2023-05-02

更新于

2024-07-10

许可协议

评论