Frp 内网穿透

发表于 2022-11-21

前言

Frp 是一个用于内网穿透的高性能反向代理应用。可以将内网服务从指定的公网节点(一台有公网 IP 的服务器)暴露出来。

特点

  • 优点
    • 多协议支持,例如:TCP、KCP 以及 Websocket 等
    • 端口复用,多个服务共一个公网节点(服务端)端口
    • 服务端和客户端 UI 页面
  • 不足
    • 需要拥有公网 IP,用于部署 Frp 服务端,因此并不适用轻度用户

下载 Frp 应用

  • 官网地址:https://frps.cn/
  • Frp GitHub 地址:https://github.com/fatedier/frp
  • 将 Frp 的压缩包解压得到 Frp 应用程序
  • 应用程序的文件说明(只说当前关心的)
    • frpc # 客户端程序
    • frpc.ini # 客户端程序配置文件
    • frps # 服务端程序
    • frps.ini # 服务端程序配置文件

搭建 Frp 服务端

Frp 服务端配置

修改 frps.ini 文件,配置 Frp 的相关服务端配置

[common]
# Frp 监听的端口,用作服务端和客户端通信
bind_port = 7000
# 授权码,客户端配置时需要和服务端一致
token = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# 服务端通过此端口接监听和接收公网用户的 http 请求
vhost_http_port = 7001

# Frp 提供了一个控制台,可以通过这个端口访问到控制台。可查看 Frp 当前有多少代理连接以及对应的状态
dashboard_port = 7002
# Frp 管理后台用户名和密码
dashboard_user = username
dashboard_pwd = password

启动 Frp 服务端

使用 nohup 以后台的形式启动,如果需要开机启动可以自行配置,不在这里赘述。

# -c 配置文件
nohup ./frps -c frps.ini >frp.out 2>&1 &

需要在防火墙开放配置文件中所配置的端口,让服务能被客户端访问。

firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --zone=public --add-port=7001/tcp --permanent
firewall-cmd --zone=public --add-port=7002/udp --permanent

firewall-cmd --reload

通过 dashboard_port 指定的端口即可访问 Frp 控制台

控制面板

搭建 Frp 客户端

Frp 客户端配置

修改 frpc.ini 文件,配置 Frp 的相关客户端配置

[common]
# 部署 Frp 服务端的公网服务器的 ip
server_addr = xxx.xxx.xxx.xxx
# 和服务端的 bind_port 保持一致
server_port = 7000
# 与服务器 frps.ini 的 token 一致
token = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[http-demo]
type = http
# local_ip 代表你想要暴露给外网的本地服务的 IP 地址
local_ip = xxx.xxx.xxx.xxx
# local_port 代表你想要暴露给外网的本地服务的端口
local_port = 80
# 自定义域名:当 Frp 服务端接收到该域名的请求时,会根据 local_ip 和 local_port 做相应的代理转发
custom_domains = gitlab.demo.com

启动 Frp 客户端

使用 nohup 以后台的形式启动,如果需要开机启动可以自行配置,不在这里赘述。

# -c 配置文件
nohup ./frpc -c frpc.ini >frp.out 2>&1 &

多说几句

说一下我选择 Frp 的原因。

我自己有运行 GitLab 等相对消耗资源的服务,如果采用云服务器部署对我来说是昂贵的。因为我的使用程度并不高,仅限于平常个人使用。则且涉及到的服务需要消耗大约 32G 运行内存,500G 磁盘空间的资源,上云对我来说是不合理的。

Frp 可以用最少的公网资源让我使用上我的所有内网资源。我自己有一台闲置的台式机配置的服务器,通过公网节点(大约 2G 运行内存,2M 带宽)足以调用我的整台机器的资源。