环境

我在国内某云有一台轻量服务器,有公网IP,用k3s部署的kubernetes单节点集群。

家庭网络受限于环境,单网口百兆,接入的NAS设备是极空间Z4S,4C/8G/8T,支持Docker和虚拟化的现代化简单易上手的NAS设备。

关于frp的介绍参考官网:https://gofrp.org, 使用的frps镜像是:snowdreamtech/frps, 使用的frpc镜像是:snowdreamtech/frpc

云服务器配置

我用的 Traefik(v2) 作为 Ingress 控制器,需要为 frp 服务端口准备一个 TCP entrypoint,默认是7000。 我只映射http服务,所以共用 traefik web entrypoint,不需要额外入口。

traefik

我的是hostNetwork,只需要增加一个入口: --entryPoints.frps.address=:7000

frps

直接参考yaml:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: frps-ini
data:
  frps.ini: |-
    [common]
    # 默认端口
    bind_port=7000
    # 默认鉴权方式为token,服务端和客户端的 common 配置中的 token 参数一致则身份验证通过。
    token=Frp
    log_level=info
    log_file=console
    disable_log_color=true
    # Web
    vhost_http_port=8000
    # 仪表盘,默认关闭
    dashboard_port=9000
    dashboard_user=admin
    dashboard_pwd=admin    
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frps-deploy
  labels:
    app: frps
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frps
  template:
    metadata:
      labels:
        app: frps
      annotations:
        port: "7000,8000,9000"
        github: "snowdreamtech/frps"
    spec:
      containers:
        - name: frps
          image: docker.io/snowdreamtech/frps:0.51.2
          ports:
            - containerPort: 7000
              name: frps
            - containerPort: 8000
              name: http
            - containerPort: 9000
              name: dashboard
          volumeMounts:
            - name: frps-config
              mountPath: /etc/frp/
      volumes:
        - name: frps-config
          configMap:
            name: frps-ini
---
apiVersion: v1
kind: Service
metadata:
  name: frps-svc
  labels:
    app: frps
spec:
  selector:
    app: frps
  ports:
  - name: frps-port
    protocol: TCP
    port: 7000
    targetPort: 7000
  - name: http-port
    protocol: TCP
    port: 8000
    targetPort: 8000
  - name: dashboard-port
    protocol: TCP
    port: 9000
    targetPort: 9000
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: frps-dashboard-ingroute
spec:
  entryPoints:
  - web
  - websecure
  routes:
  - match: Host(`frps.demo.com`)
    kind: Rule
    services:
    - name: frps-svc
      port: 9000
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: frps-http-ingroute
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`test.demo.com`)
    kind: Rule
    services:
    - name: frps-svc
      port: 8000
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: frps-tcp
spec:
  entryPoints:
    - frps
  routes:
    - match: HostSNI(`*`)
      services:
        - name: frps-svc
          port: 7000

极空间NAS配置

启动frpc

  1. 下载frpc镜像,版本与服务器端保持一致,如0.51.2 nas1.png

  2. 镜像下载完成后,用此镜像添加容器,参数如下: nas2.png

  3. 配置文件frpc.ini先创建好上传到NAS中,映射到容器/etc/frp/frpc.ini nas3.png

  4. 网络可以用默认桥接,也可以更换为host网络 nas4.png

  5. 启动后查看日志有无异常,可以通过 UI 查看代理(极空间有远程访问功能,可以远程查看家庭网络服务): nas5.png

frpc.ini 示例

[common]
server_addr = 云服务器公网IP
server_port = 7000
token = Frp
log_file = console
log_level = info
disable_log_color = true
# UI
admin_port = 9000
admin_user = admin
admin_pwd = admin

[sapic]
type = http
local_port = 12345
custom_domains = test.demo.com
use_encryption = true
use_compression = true

测试

解析 test.demo.com 到公网云服务器,即可在公网访问到内网服务。


·End·