通过 FRP 使外网可以访问内网主机上的服务

文章目录
  1. 1、下载 frp
  2. 2、在云主机上启动 frps 服务
  3. 3、在本地主机上启动 frpc 服务
  4. 4、在本地主机上启动服务,验证外网访问

背景:云上的服务太贵了,1C1G 最小配置,1M 带宽的 ECS 主机一年近 700¥ 勉强能接受,一套最小配置的 kafka,一套最小配置的 elasticsearch 集群一个月就要近 2000¥,实在不是作为业余爱好能消费的起的。所以想这些服务就用家里的主机搭建,外部能访问即可。

解决方案:

  1. 购买云主机和公网 IP,部署 nginx 等不怎么消耗资源的接入服务。
  2. 在云主机上启动 frps 服务。
  3. 在家里的台式机上部署 kafka、elasticsearch、kibana、微服务等消耗资源的服务。
  4. 在家里的台式机上启动 frpc 服务,连接云主机上的 frps,对外提供台式机上部署的服务。
  5. 只要家里主机开启,即可通过第一步中购买的公网 IP(或者 DNS)来访问了。

具体步骤如下:

1、下载 frp

frp 在 github 官网上直接 下载 即可:

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

注意:
1、最新的 frp 0.47.0 的 release 列表中没有 windows 下的版本了。
2、但是实际路径依然存在,可以通过如下地址直接下载:https://github.com/fatedier/frp/releases/download/v0.47.0/frp_0.47.0_windows_amd64.zip

2、在云主机上启动 frps 服务

我的云主机是 centOS 系统,下载对应 OS 的 frp 后解压缩,编辑配置文件,然后启动服务端:

1
2
3
4
tar xf frp_0.47.0_linux_amd64.tar.gz
cd frp_0.47.0_linux_amd64
vi frps.ini
nohup ./frps -c frps.ini > /dev/null 2>&1 &

配置文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
[common]
bind_port = 7000 # 默认绑定的端口号
token = 12345678 # 增强安全的 token
# 默认启动的 dashboard 相关信息
dashboard_addr = 0.0.0.0
dashboard_port= 7500
dashboard_user = username
dashboard_pwd = password
# 日志配置
log_file = ./frps.log
log_level = info
log_max_days = 3

正常启动后,可以在日志文件中看到如下信息:

1
2
3
4
2023/02/12 13:52:10 [I] [root.go:206] frps uses config file: frps.ini
2023/02/12 13:52:10 [I] [service.go:200] frps tcp listen on 0.0.0.0:7000
2023/02/12 13:52:10 [I] [service.go:317] Dashboard listen on 0.0.0.0:7500
2023/02/12 13:52:10 [I] [root.go:215] frps started successfully

在浏览器中输入 http://你的公网IP或者域名:7500 ,可以看到 frp 的管理面 dashboard:

注意:
1、如果访问不通,请确定你的云主机上开启了正确的安全组策略。
2、可参考如下的教程: 阿里、华为、腾讯 云服务器端口配置教程汇总

3、在本地主机上启动 frpc 服务

我本地主机是 win10 系统,按第一步下载对应 OS 的 frp 包后解压缩,编辑配置文件,然后启动客户端:

  1. 解压缩下载的 zip 包:frp_0.47.0_windows_amd64.zip
  2. 进入解压缩目录,编辑 frpc.ini 文件,内容如下:
  3. 启动 frpc 服务:frpc -c 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 = xxx.xxx.xxx.xxx # 你的公网 IP 地址
server_port = 7000 # 之前配置的 frps 的端口
token = 12345678 # 之前配置的 frps 的 token

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 10000

[elastic] # 任意你需要添加代理的服务
type = tcp # 注意这里是 TCP
local_ip = 127.0.0.1
local_port = 9200
remote_port = 10001

[kibana]
type = tcp # 注意这里是 TCP
local_ip = 127.0.0.1
local_port = 5601
remote_port = 10002

可能的问题:

  1. 本地安装的防火墙、杀毒软件捣乱:我的 win10 系统上的 360 杀毒总是把下载的 frp 包当病毒给自动删除了
  2. 即使找回了删除的文件,运行时也被 360 阻断,执行 frpc 时总是提示:“拒绝访问。”,所以要么加入到白名单,要么执行时关掉杀毒软件
  3. 代理的服务如 elastic 或者 kibana 访问时都是 http 协议的,但是如果在配置时 type 配置成 http,启动时会报错,提示如下:failed to parse proxy elastic, err: custom_domains and subdomain should set at least one of them

4、在本地主机上启动服务,验证外网访问

将刚才配置在客户端配置中的服务启动,在 frps 的 dashboard -> proxies -> TCP 菜单上可以看到我们当前已经建立的 ssh、elasticsearch、kibana 这三个 端口、流量、状态等信息:

用手机访问如下地址验证了,确实可以从外部访问我本地搭建的这些服务了

  1. 访问 elasticsearch:http://我的域名:10001
  2. 访问 kibana:http://我的域名:10002

感觉一下省了大几千……