frp内网穿透

发布时间 2023-05-03 01:18:42作者: eagle.supper

前言

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

frp工作原理

服务端运行,监听一个主端口,等待客户端的连接;- 客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;- 服务端fork新的进程监听客户端指定的端口;- 外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;- 客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。

想要配置frp穿透,首先必须先要有一台具有外网ip(即:可以外网访问)的服务器。如果没有,接下来的教程就不用看了。配置教程主要分为两个部分,一是服务器端(外网服务器)的配置;二是客户端(内网服务器)配置。

安装并配置frp服务器

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


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压缩包

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

解压后文件目录结构如下

$ 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路径中


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

[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了


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

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

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


[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 时创建软连接

设置开机启动


systemctl enable frps

启动停止frp server

# 启动服务
systemctl start frps

# 查看服务状态
systemctl status frps

# 停止服务
systemctl stop frps

安装并配置frp客户端

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

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


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压缩包

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

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


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


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 客户端了


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

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

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


[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 时创建软连接

测试穿透是否配置成功

在正式开始测试之前

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

# 放行外网连接服务器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访问内网服务的效果

ssh -p 6000 root@public_ip

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

参考文档

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