Unraid 篇九:traefik反向代理最强教程
traefik官方见文档参考: https://doc.traefik.io/traefik/
前言
本篇分无公网IP方案和有公网IP方案
无公网IP方案: 采用cloudflare白嫖无限永久的隧道 , 注意追求速度的自行购买收费FRP或者选择有公网IP的宽带运营商 , cloudflare的隧道不可用于jellyfin/emby/plex等需要较大流量和网速的应用
有公网IP方案: 直接跳过下面的大标题 '1. 先从CF官网设置API令牌'
本篇不适合没有任何基础的人,容易出现看不懂瞎配置的情况
如果只需求反代的效果,NPM即可,傻瓜无脑可视化
如果已经用上swag,npm等nginx方式的反代,其实也没大必要再折腾弄traefik
有需求就搞,没需求也不要创造需求
本事不行又要搞的就自己恶补知识,不要在评论里怪我讲的不够通俗易懂像那些保姆教程只教配置,不教原理.
看教程不要看的杂,学会认准一个对的人的教程看他的系列,小白混着看搞不清原理的情况下容易出错
一百个人配置traefik可以有一百种方式
准备工作
1. 先从CF官网设置API令牌
1.1 配置安装cloudflared
为了缩短篇幅以及避免歧义,去看我发布的另一篇文章 cloudflared安装配置教程
2. 创建 acme.json 并修改权限 (600权限,重要坑点)
mkdir -p /mnt/user/appdata/traefik
touch /mnt/user/appdata/traefik/acme.json; chmod 600 /mnt/user/appdata/traefik/acme.json
3. 安装traefik
安装完成后先关闭,后面还要配置 .yml 相关文件
喜欢一直保持docker最新版本状态的,存储库就不要加后面的 :版本号
traefik仪表盘官方文档 https://doc.traefik.io/traefik/operations/dashboard/
如要需要安全方法-则选择安装 dockersocket
有公网IP的忽略删除 'Cloudflare API Token' 这一条,看下面的3.1
意义: 只读访问其他容器,无法启动其他容器或者通过 docker API 运行任何命令
dockersocket默认安装即可
转到traefik配置界面,添加一个变量(如果启用了dockersocket,需要把traefik.yml文件中的 endpoint: "tcp://dockersocket:2375" 启用)
DOCKER_HOST
dockersocket
添加此变量后记得删除 /var/run/docker.sock 这条.
3.1 设置traefik的域名DNS解析的API (选择CF方案不需要配置此条)
以DNSPOD为例,其他DNS商的方式自行查看官方文档
3.1.1 DNSPOD官网创建一条API秘钥
3.1.2 增加一个变量
DNSPOD_API_KEY
ID,Token
ID,Token 条目中间用英文逗号隔开, 自己的TOKEN自行去dnspod网站创建
3.1.3 修改traefik.yml 内 certificatesResolvers 下的相关字段 (traefik.yml 文件看下文)
范例:
# 使用letsencrypt生成SSL Serficiates
certificatesResolvers:
letsencrypt:
acme:
email: 123456@qq.com
storage: /etc/traefik/acme.json
dnsChallenge:
provider: dnspod
delayBeforeCheck: 30
# 用于确保DNS挑战传播到权利DNS服务器
# resolvers:
# - "1.1.1.1:53"
# - "1.0.0.1:53"
############# pilot #############
4.安装完后,关闭traefik,配置yml
yml文件路径 : 保存在上文中的docker配置文件里的 Config Folder 下, 下面不再重复赘述
4.1 静态文件 traefik.yml
修改保存后,需要手动重启traefik才能生效
如果启用了dockersocket,需要把 endpoint: "tcp://dockersocket:2375" 启用
以下是traefik.yml文件范例
(替换domain.com为自己的域名,如果是使用DNSPOD等解析的,需要修改certificatesResolvers后面的内容)
global:
checkNewVersion: true
sendAnonymousUsage: false
serversTransport:
insecureSkipVerify: true
# 启用Traefik UI
api:
dashboard: true
insecure: true
entryPoints:
# 不在应用中使用,而是重定向从HTTP到HTTPS
http:
address: :80
# forwardedHeaders:
# trustedIPs: &trustedIps
# # Start of Clouflare public IP list for HTTP requests, remove this if you don't use it
# - 173.245.48.0/20
# - 103.21.244.0/22
# - 103.22.200.0/22
# - 103.31.4.0/22
# - 141.101.64.0/18
# - 108.162.192.0/18
# - 190.93.240.0/20
# - 188.114.96.0/20
# - 197.234.240.0/22
# - 198.41.128.0/17
# - 162.158.0.0/15
# - 104.16.0.0/12
# - 172.64.0.0/13
# - 131.0.72.0/22
# - 2400:cb00::/32
# - 2606:4700::/32
# - 2803:f800::/32
# - 2405:b500::/32
# - 2405:8100::/32
# - 2a06:98c0::/29
# - 2c0f:f248::/32
# # End of Cloudlare public IP list
http:
redirections:
entryPoint:
to: https
scheme: https
# HTTPS endpoint, with domain wildcard
https:
address: :443
# forwardedHeaders:
# # CloudFlare Trusted IP的重复使用列表上面的HTTPS请求列表
# trustedIPs: *trustedIps
http:
tls:
# 生成通配符域证书
certResolver: letsencrypt
domains:
- main: domain.com
sans:
- '*.domain.com'
middlewares:
- securityHeaders@file
providers:
providersThrottleDuration: 2s
# 文件提供商,用于连接在Docker /定义中间件之外的事物
file:
filename: /etc/traefik/fileConfig.yml
watch: true
# Docker提供商用于连接Docker网络内部的所有应用程序
docker:
watch: true
network: dockernetwork # 在此处添加您的Docker网络名称
# 默认主机规则to contain name.domain.example
defaultRule: "Host(`{{ lower (trimPrefix `/` .Name )}}.domain.com`)" # 替换为您的域
swarmModeRefreshSeconds: 15s
exposedByDefault: false
endpoint: "tcp://dockersocket:2375" # 如果您使用的是dockersocket
# Log level INFO|DEBUG|ERROR
log:
level: INFO
# Use letsencrypt to generate ssl serficiates
certificatesResolvers:
letsencrypt:
acme:
email: 123456@qq.com
storage: /etc/traefik/acme.json
dnsChallenge:
provider: cloudflare
# Used to make sure the dns challenge is propagated to the rights dns servers
resolvers:
- "1.1.1.1:53"
- "1.0.0.1:53"
4.2 动态文件 fileConfig.yml
修改保存动态文件后,traefik会自动重启启用相关配置
以下是fileConfig.yml文件范例
http:
## 外部路由 - 仅在您想手动代理某些东西时使用 ##
########### ROUTERS ###########
routers:
# qbittorrent
# qbittorrent:
# entryPoints:
# https
# rule: 'Host(`qb.domain.com`)' ## 缩略域名
# service: qbittorrent
# middlewares:
# - "auth"
########### SERVICES ###########
services:
# qbittorrent
# qbittorrent:
# loadBalancer:
# servers:
# - url: http://qbittorrent:8080/
## 中间件 ##
middlewares:
# 仅允许本地网络
local-ipwhitelist:
ipWhiteList:
sourceRange:
- 127.0.0.1/32 # Localhost
- 10.0.0.0/24 # LAN Subnet
#这是动态配置log4Shell插件
# my-plugin-log4shell:
# plugin:
# plugin-log4shell:
# errorCode: "200"
# Authelia Guard
# auth:
# forwardauth:
# address: http://authelia:9091/api/verify?rd=https://login.domain.com:55555/ # 用您的authelia容器设置的host名称替换后面这个外网地址
# trustForwardHeader: true
# authResponseHeaders:
# - Remote-User
# - Remote-Groups
# - Remote-Name
# - Remote-Email
# # Authelia basic auth guard
# auth-basic:
# forwardauth:
# address: http://authelia:9091/api/verify?authelia=basic # replace auth with your authelia container name
# trustForwardHeader: true
# authResponseHeaders:
# - Remote-User
# - Remote-Groups
# - Remote-Name
# - Remote-Email
# Security headers
securityHeaders:
headers:
#customFrameOptionsValue: SAMEORIGIN
customResponseHeaders:
X-Robots-Tag: "none,noarchive,nosnippet,notranslate,noimageindex"
server: ""
X-Forwarded-Proto: "https"
sslProxyHeaders:
X-Forwarded-Proto: https
referrerPolicy: "strict-origin-when-cross-origin"
hostsProxyHeaders:
- "X-Forwarded-Host"
customRequestHeaders:
X-Forwarded-Proto: "https"
contentTypeNosniff: true
browserXssFilter: true
forceSTSHeader: true
stsIncludeSubdomains: true
stsSeconds: 63072000
stsPreload: true
# Only use secure ciphers - https://ssl-config.mozilla.org/#server=traefik&version=2.6.0&config=intermediate&guideline=5.6
tls:
options:
default:
minVersion: VersionTLS12
cipherSuites:
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
pilot:
# token: "ebf37a9b-e608-4413-88c7-54b76e9e32a9"
# - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
喜欢直接指定不用贴标签方式的人,在routers和services下面的内容,去掉注释,自行修改 (菜鸡看不懂代码的,就乖乖用贴标签的方法,少一层转发)
检查域名标头 :https://securityheaders.com/
CF作为DNS提供商,可能会覆盖中间件的标头,出现问题查看这个指南 : https://help.nextcloud.com/t/docker-traefik-strict-transport-security-http-header-is-not-set-to-at-least-15552000-seconds/93348
5.开始配置要反代的程序 (尽量以标签方式为主,虽然手动添加标签会比配置动态文件麻烦点,但是在动态文件里配置,会多一层转发,自己取舍)
(我预判了你的预判,喜欢杠,说动态文件里直接配置的人评论里自觉退散,不支持任何反驳)
5.1 打开要反代的程序的配置页面,添加标签
+启用traefik
traefik.enable
true
5.2 只允许通过HTTPS来代理 (替换app为对应docker名称)
traefik.http.routers.app.entryPoints
https
6. 拓展
6.1 代理多个暴露端口的程序
如qbittorrent , 会有多个端口需要暴露,我们要添加一个标签让traefik知道哪个是WEBUI端口
traefik.http.services.app.loadbalancer.server.port
8080
6.2 使用HTTPS的程序
一般情况下,内网都是HTTP方式连接后端,有些个别程序需要HTTPS,就需要告诉traefik,添加一个标签(替换对应 app 为docker名称)
traefik.http.services.app.loadbalancer.server.scheme
https
某些情况下,改为HTTPS后,还得手动指定HTTPS端口,参照上面一条 "代理多个暴露端口的程序"
6.3 手动选择代理域名
添加一条标签 (替换 app 为指定域)
traefik.http.routers.app.rule
Host(`app.YOURDOMAIN.COM`)
6.4 启用authelia
6.4.1 authelia的配置界面添加一个标签
traefik.http.routers.authelia.entryPoints = https
https
为了避免authelia重定向到循环中, 需要添加一条规则到Authelia的 configuration.yml 文件
## bypass rule
- domain:
- "auth.domain.com"
policy: bypass
6.4.2 在要反代的程序配置界面添加一个标签 (替换 app 为docker名称)
traefik.http.routers.app.middlewares
auth@file
6.5 启用organizr服务器的身份验证
我们可以像authelia一样,利用organizr作为身份验证服务器 ,这种方法更简单,功能也相对较少
6.5.1 organizr要添加对应2条标签
traefik.enable = true
true
traefik.http.routers.organizr.entryPoints = https
https
6.5.2 在对应程序启用organizer
要启用organizer的程序配置中,添加标签 ( 替换 app 为对应的docker名称 )
traefik.http.routers.app.middleware
sauth@file
6.5.3 将organizr添加到 fileConfig.yml 动态文件
注意 : " {organizr} " 是docker名称
middlewares:
# Organizr server authentication
auth:
forwardAuth:
address: "http://{organizr}/api/v2/auth/1"
6.5.4 organizr设置界面中,启用重定向
打开organizr的WEBUI界面, setting-basic-security 启用此功能
有关organizr服务器身份验证检查的官方文档
https://docs.organizr.app/features/server-authentication/traefik-server-authentication
完结撒花
看不懂你可以选择去看人家的收费教程,我没花过钱,也不会去花这个钱去做这种外网一翻到处都能找到的知识付费,仁者见仁智者见智.
自以为本篇万字教程内容都是个人整理的精华,应该比国内全网能找到的大部分traefik教程更加详细
本人没有任何写文盈利目的,不需要打赏推广
发这篇也主要是分享一下给群友,有问题自己下面评论区进行讨论
君荙菜
校验提示文案
什么都不买最省钱
校验提示文案
东哥的Unraid
我通过unraid虚拟了一台群晖,直通了硬盘控制器和2.5G网卡,也做好了反向代理,目前就是Synology Drive的桌面服务端口6690反向代理没成功,通过配置动态文件的方式,无法访问,是不是要用Traefik的TCP rounter呢,楼主知道吗?
校验提示文案
过来的雷
校验提示文案
icybor
校验提示文案
布吉德峰
校验提示文案
雨落枫叶
校验提示文案
shanetian
校验提示文案
小冲2020
校验提示文案
大熊本熊
校验提示文案
过来的雷
校验提示文案
大熊本熊
校验提示文案
小冲2020
校验提示文案
东哥的Unraid
我通过unraid虚拟了一台群晖,直通了硬盘控制器和2.5G网卡,也做好了反向代理,目前就是Synology Drive的桌面服务端口6690反向代理没成功,通过配置动态文件的方式,无法访问,是不是要用Traefik的TCP rounter呢,楼主知道吗?
校验提示文案
shanetian
校验提示文案
什么都不买最省钱
校验提示文案
君荙菜
校验提示文案
雨落枫叶
校验提示文案
icybor
校验提示文案
布吉德峰
校验提示文案