Featured image of post Fnos+Docker-compose+Nginx+frp实现内网穿透

Fnos+Docker-compose+Nginx+frp实现内网穿透

需求

先来说说场景,因在上海某三方租房平台,所以不太方便找网线运营商商索要公网 ip,但自己又需要外网访问Fnos nas中的文件和手机相册备份,只能是另辟蹊径找外网访问的方案了。

其实Fnos的中继也可以使用,但Fnos本就是为爱发电,我也顺便有自己的服务器和域名,则就减少他们的压力尽绵薄之力吧。 🐶

简单介绍

frp 工作原理

frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。

由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。

sequenceDiagram
  participant 用户端
  participant 客户端
  participant 服务端
  用户端->>服务端: 发送请求
  服务端->>客户端: 监听端口访问
内网代理 客户端->>服务端: 端口响应返回给服务端 服务端->>用户端: 响应请求

实现隧穿

这里只实现简单的 http|https 的穿透访问

搭建时候的注意点: 搭建的注意点主要是端口号

上面已经知道 frp 的工作为两个端,我们就分两个端分开配置与说明

公网服务端

首先就是服务端 docker-compose.yml 配置

frps compose 及说明

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 内网穿透
frps:
  container_name: frps
  image: snowdreamtech/frps
  volumes:
    - /docker/frps/frps.toml:/app/config/frps.toml
  ports:
    - "27000:27000"
    - "27001:27001"
  command: ["-c", "/app/config/frps.toml"]

这个文件使用了 snowdreamtech/frps docker 镜像默认不写版本号则为最新版本。

更多版本查看可以看 这里

command 表示 frps 在运行的时候追加的参数,其处理下来大约是这样的: /usr/bin/frpc -c /app/config/frps.toml
ports 表示在服务端 frpc 所使用的端口映射。(与下面的 toml 文件中配置相对应),如果你的公网服务器有别的配置,注意端口号不要冲突了。

frps.toml 配置及说明

1
2
3
4
bindPort = 27000
vhostHTTPPort = 27001

auth.token = "******"

bindPort: 是服务端的监听端口,默认使用的是 7000,我这里使用的是 27000
vhostHTTPPort: 是服务端对http类型代理的监听端口,如果需要配置http web页面就需要配置这个端口,我这里使用的是 27001
auth.token: 是做登录鉴权的,是一个字符串,与内网客户端配置成一样的就行了。

还有很多其它的配置可以看这里: https://gofrp.org/zh-cn/docs/reference/server-configures/

内网设备端

内网设备端与就是 nas 设备,fnos 系统所在

注意文件镜像名写服务端不同,一个是frps,一个是frpc

frpc compose 及说明

1
2
3
4
5
6
7
8
# 内网穿透
frpc:
  container_name: frpc
  image: snowdreamtech/frpc
  network_mode: host
  volumes:
    - ./frpc/frpc.toml:/app/config/frpc.toml
  command: ["-c", "/app/config/frpc.toml"]

内网设备这里,我使用的是 host 模式,也就是不需要在去映射 frpc 里使用的端口了,直接作用到宿主机上的。

大致配置与服务端是相同的,这个只是docker frpc运行来使用的,与 frpc 的运行时配置不同,运行时的端口与代码配置在 frpc.toml

frpc.toml 配置及说明

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
serverAddr = "xxx.xxx.xxx.xxx"
serverPort = 27000

auth.token = "******"

[[proxies]]
name = "web"
type = "http"
localIP = "192.168.1.6"
localPort = 8000
customDomains = ["pal.run"]

serverAddr: 服务端外网的 ip 地址
serverPort: 连接外网服务端的端口号,也就是服务端 frps.toml中的bindPort
auth.token: 登录鉴权,同服务端的auth.token相同

[[proxies]]: 表示一个代理项目,是数组的,所以如果有配置多个代理可以直接添加多个

一个web代理中,需要注意的就是 ipport。 这里要注意,这个是客户端的局域网 ipweb 服务的端口号。

还有很多其它的配置可以看这里: https://gofrp.org/zh-cn/docs/reference/client-configures/

引用与文档