使用Apisix打造家庭NAS网关
本文使用apisix打造家庭NAS网关,并通过cloudflare进行穿透,可免公网IP访问。首先你的NAS支持Docker,没有NAS也没有关系,只要你的电脑支持Docker同样可以参照该教程。
1 依赖资源准备
- 准备域名:
- 免费域名注册: https://www.freenom.com/
- 或者在云厂商(阿里云/腾讯云/华为云等)注册一个,新用户最低1
- cloudflare账户,注册很简单,这里我就不演示,请提前准备好
- 依赖镜像
- alpine:3.17
- bitnami/etcd:latest
- apache/apisix:latest
- apache/apisix-dashboard:latest
- vcyang/cloudflared:1.0.0 如果是arm芯片请选择 vcyang/cloudflared:1.0.0-arm64
2 镜像配置
2.1 设置docker官方镜像源
打开docker -> 镜像 -> 仓库 -> 设置 -> 添加
仓库名称:Docker Hub
库地址: https://hub.docker.com/
2.2 请依次下载上述依赖的镜像
3 安装镜像
3.1 NAS中新建挂载所需目录
请在nas中建立docker需要挂载的目录,目录如下:
- 我的文件/docker/
- 我的文件/docker/etcd/
- 我的文件/docker/apisix/apisix/
- 我的文件/docker/apisix/apisix/conf/
- 我的文件/docker/apisix/apisix/logs/
- 我的文件/docker/apisix/dashboard/
3.2 NAS中添加apisix所需的配置文件
文件目录: /我的文件/docker/apisix/apisix/conf/config.yaml
apisix:
node_listen: 9080 # APISIX listening port
enable_ipv6: true # 开启ipv6支持
enable_control: true
control:
port: 9092
deployment:
admin:
allow_admin:
- 0.0.0.0/0
- ::0/0
admin_key:
- name: "admin"
key: edd1c9f034335f136f87ad84b625c8f1
role: admin # admin: manage all configuration data
- name: "viewer"
key: 4054f7cf07e344346cd3f287985e76a2
role: viewer
etcd:
host:
- "http://NAS的ip地址:12379" # etcd的地址
prefix: "/apisix" # apisix configurations prefix
timeout: 30 # 30 seconds
3.3 NAS中添加apisix dashboard所需的配置文件
文件目录: /我的文件/docker/apisix/dashboard/conf.yaml
conf:
listen:
port: 9000 # `manager api` listening port
allow_list: # If we don't set any IP list, then any IP access is allowed by default.
- 0.0.0.0/0
- ::0/0
etcd:
endpoints: # supports defining multiple etcd host addresses for an etcd cluster
- "http://NAS的ip地址:12379" # etcd的地址
mtls:
enable: false
key_file: "" # Path of your self-signed client side key
cert_file: "" # Path of your self-signed client side cert
ca_file: "" # Path of your self-signed ca cert, the CA is used to sign callers'
prefix: /apisix # apisix config's prefix in etcd, /apisix by default
log:
error_log:
level: warn # supports levels, lower to higher: debug, info, warn, error, panic, fatal
file_path:
logs/error.log # supports relative path, absolute path, standard output
# such as: logs/error.log, /tmp/logs/error.log, /dev/stdout, /dev/stderr
access_log:
file_path:
logs/access.log # supports relative path, absolute path, standard output
authentication:
secret:
secret # secret for jwt token generation.
# NOTE: Highly recommended to modify this value to protect `manager api`.
# if it's default value, when `manager api` start, it will generate a random string to replace it.
expire_time: 3600 # jwt token expire time, in second
users: # yamllint enable rule:comments-indentation
- username: admin # username and password for login `manager api`
password: 这里是你的登录密码 # 这里是dashboard登录的密码,请尽量设置复杂一点
- username: user
password: 这里是你的登录密码 # 这里是dashboard普通用户登录的密码,请尽量设置复杂一点
plugins: # plugin list (sorted in alphabetical order)
- api-breaker
- authz-keycloak
- basic-auth
- batch-requests
- consumer-restriction
- cors
# - dubbo-proxy
- echo
# - error-log-logger
# - example-plugin
- fault-injection
- grpc-transcode
- hmac-auth
- http-logger
- ip-restriction
- jwt-auth
- kafka-logger
- key-auth
- limit-conn
- limit-count
- limit-req
# - log-rotate
# - node-status
- openid-connect
- prometheus
- proxy-cache
- proxy-mirror
- proxy-rewrite
- redirect
- referer-restriction
- request-id
- request-validation
- response-rewrite
- serverless-post-function
- serverless-pre-function
# - skywalking
- sls-logger
- syslog
- tcp-logger
- udp-logger
- uri-blocker
- wolf-rbac
- zipkin
- server-info
- traffic-split
3.4 新建alpine容器
a. 挂载目录: 我的文件/docker/
b. 设置启动命令:
sleep inf
c. 容器创建成功后,连接ssh进去执行
# 给etcd挂载的目录读写权限
chmod -R 777 /data/etcd
# 然后退出
exit
3.5 创建etcd容器
a. 设置挂载目录
挂载目录: 我的文件/docker/etcd/
容器内目录: /bitnami/etcd
如图:
b. 设置端口
本地端口
- 12379
- 12380
如图:
c. 设置环境变量
ALLOW_NONE_AUTHENTICATION: "yes"
ETCD_ADVERTISE_CLIENT_URLS: "http://NAS的ip地址:12379"
如图:
d. 看进程,看到如图说明etcd容器安装成:
c. 在浏览器访问: http://NAS的ip地址:12379/version
返回如下信息说明正常访问:
{"etcdserver":"3.5.6","etcdcluster":"3.5.0"}
3.6 创建apisix容器
a. 挂载目录
挂载文件: 我的文件/docker/apisix/apisix/conf/config.yaml
容器内目录: /usr/local/apisix/conf/config.yaml
挂载日志目录: 我的文件/docker/apisix/apisix/logs/
容器内目录: /usr/local/apisix/logs
如图:
b. 开放端口
- 19080
- 19443
- 19180
如图:
c. 查看进程,如图说明启动成功
d. 验证服务
浏览器中访问:http://NAS的IP地址:19180/apisix/admin/services/
返回如下信息说明服务正常:
{"error_msg":"failed to check token"}
3.7 创建apisix-dashboard
a. 设置挂载目录
挂载配置文件: /我的文件/docker/apisix/dashboard/conf.yaml
容器内目录文件: /usr/local/apisix-dashboard/conf/conf.yaml
如图:
b. 设置端口
- 19000
如图:
c. 查看进程,如图说明运行正常:
d. 验证服务
浏览器中访问:http://NAS的IP地址:19000/
显示如下说明服务正常:
然后使用配置中的账户和密码登录。
4 设置域名
4.1登录cloudflare
地址:https://dash.cloudflare.com/login
4.2 添加你的域名站点
4.3 设置你的域名DNS服务器为cloudflare的DNS服务
a. 复制红框的地址,然后修改你的域名的DNS
b. 这里以阿里云域名举例:
然后确定提交
5 通过cloudflare穿透
5.1 创建穿透服务容器,新建容器vcyang/cloudflared
不用做任何设置,直接应用
5.2 容器启动后连接ssh进入容器
5.3 配置cloudflared
ssh中执行
cloudflared tunnel login
复制红框中的地址到浏览器中访问,登录cloudflare账号进行域名授权,然后选择如下图中域名进行授权
然后关闭页面
5.4 创建隧道名
a. ssh中执行
cloudflared tunnel create 隧道名,请使用字母或者拼音
b. 绑定域名,并执行:
cloudflared tunnel route dns 隧道名 你的域名
cloudflared tunnel run --url http://你nas的IP地址:19080 隧道名 &
d. 浏览中输入https://你的域名 ,显示如下说明网关穿透成功
6 配置网关
6.1 登录;apisix dashboard访问路由
地址: http://你nas地址:19000
账户和密码参考上面dashboard的配置文件
6.2 配置上游服务器
配置内容按图中填写,然后下一步,然后提交
6.2 创建服务
6.2 创建路由
按照图中填写,其他默认,下一步,提交
6.3 访问NAS 地址: http://你的域名/home/
7 结束语
喜欢的小伙伴欢迎收藏+关注,我会不定时的分享一些干货,你们的支持就是我最大的动力。