unraid 公网 Traefik 统一网关

独奏

技术分享|2024-10-18|最后更新: 2024-10-18|
type
status
date
slug
summary
tags
category
icon
password

背景

最近玩 pt 使用 qbittorrent 想要增加上传,由于家中是移动宽带无公网 v4,且 qbittorrent 安装在 unraid 上面,因此只能通过公网 ipv6 来增加 bt 上传。
家中的网络是光猫 → 路由 → unraid,光猫与路由桥接,路由负责拨号以及 ipv4 dhcp。
之前 unraid 一直是默认关闭 ipv6,把需要暴露到外网的服务通过 NPS 做端口转发,因此不存在服务暴露在公网的问题,但是开启 ipv6 之后,由于 unraid 获取到公网的 ipv6 地址,意味着上面的所有服务都会暴露到公网,存在一定的安全风险。
综上,需要通过防火墙来屏蔽公网的访问,同时把需要暴露的服务进行放行。这里使用 Traefik 来实现一个统一网关,由网关来对外提供服务。
 

方案

1. unraid 开启 ipv6

首先需要路由开启 ipv6,让下面的设备能够获取到公网 ipv6 地址,这里不同路由设置方式不同,不详细说明了。
unraid 开启 ipv6 相对简单,首先关闭 docker 和虚拟机服务,在【设置】→【网络设置】→【网络协议】里面选择【ipv4+ipv6】即可。
notion image
 

2. 设置防火墙

开启 ipv6 后,即可发现已经有了 ipv6 公网地址,通过这个地址,再加上你的服务端口(如:http://[2409:8a:xxx:1]:8080),即可在公网直接访问你的服务了。
这样显然是不安全的,我们并不希望所有服务都暴露在公网上。因此需要增加防火墙来防止公网上的访问。
这里需要先安装【user scripts】插件,安装完之后添加一个 script,设置为【At First Array Start Only】即可。第一次设置需要手动执行一次,可以通过ip6tables --list查看规则生效情况。
 

3. 域名动态解析

配置 Traefik 网关之前,我们需要安装 DDNS-go 服务,能够把域名动态解析到 unraid 的公网 ipv6 上面,这里通过后台配置启用 ipv6 解析即可。
notion image

4. Traefik 统一网关

设置好防火墙之后会发现所有服务都无法通过公网 ipv6 地址来访问了。这里我希望能通过域名来访问 alist 等部分服务,因此这里加入了 Traefik 网关来对外提供 http 服务。
 
首先安装 Traefik,在 unraid 的【应用】中心直接下载 Traefik 即可。Traefik 提供不同的配置方式,网络上大部分都是通过 docker label 来进行配置,但是这样需要修改现有的所有 docker 容器,因此这里我是通过 yml config file 的方式来进行配置。
notion image
安装完之后需要创建如下文件:
创建 acme.json
/mnt/user/appdata/traefik 目录下新建 traefik.yml 文件
创建反向代理服务:在 /mnt/user/appdata/traefik/dynamic-conf/ 下创建 alist.yml
 
上述文件修改好之后,开启 Traefik docker 服务即可,这个时候可以通过 https://alist.YOURDOMAIN.COM:HTTP_PORT 来访问 unraid 上面的 alist 服务了。同时也可以通过后台来查看 Traefik 的链路。
notion image