traefik反向代理最强教程

2022-08-08 16:30:58 23点赞 229收藏 22评论

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令牌

traefik反向代理最强教程

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 相关文件

traefik反向代理最强教程

traefik反向代理最强教程

  • 喜欢一直保持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

traefik反向代理最强教程

添加此变量后记得删除 /var/run/docker.sock 这条.

traefik反向代理最强教程

3.1 设置traefik的域名DNS解析的API (选择CF方案不需要配置此条)

以DNSPOD为例,其他DNS商的方式自行查看官方文档

3.1.1 DNSPOD官网创建一条API秘钥

traefik反向代理最强教程

3.1.2 增加一个变量

DNSPOD_API_KEY

ID,Token

traefik反向代理最强教程

  • 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才能生效

traefik反向代理最强教程

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会自动重启启用相关配置

traefik反向代理最强教程

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

5.开始配置要反代的程序 (尽量以标签方式为主,虽然手动添加标签会比配置动态文件麻烦点,但是在动态文件里配置,会多一层转发,自己取舍)

(我预判了你的预判,喜欢杠,说动态文件里直接配置的人评论里自觉退散,不支持任何反驳)

5.1 打开要反代的程序的配置页面,添加标签

+启用traefik

traefik.enable

true

traefik反向代理最强教程

traefik反向代理最强教程

5.2 只允许通过HTTPS来代理 (替换app为对应docker名称)

traefik.http.routers.app.entryPoints

https

traefik反向代理最强教程

6. 拓展

6.1 代理多个暴露端口的程序

如qbittorrent , 会有多个端口需要暴露,我们要添加一个标签让traefik知道哪个是WEBUI端口

traefik.http.services.app.loadbalancer.server.port

8080

traefik反向代理最强教程

traefik反向代理最强教程

6.2 使用HTTPS的程序

一般情况下,内网都是HTTP方式连接后端,有些个别程序需要HTTPS,就需要告诉traefik,添加一个标签(替换对应 app 为docker名称)

traefik.http.services.app.loadbalancer.server.scheme

https

traefik反向代理最强教程

  • 某些情况下,改为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

traefik反向代理最强教程

traefik反向代理最强教程

6.5 启用organizr服务器的身份验证

我们可以像authelia一样,利用organizr作为身份验证服务器 ,这种方法更简单,功能也相对较少

6.5.1 organizr要添加对应2条标签

traefik.enable = true

true

traefik反向代理最强教程

traefik反向代理最强教程

traefik.http.routers.organizr.entryPoints = https
https

traefik反向代理最强教程

traefik反向代理最强教程

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 启用此功能

traefik反向代理最强教程

traefik反向代理最强教程

完结撒花

看不懂你可以选择去看人家的收费教程,我没花过钱,也不会去花这个钱去做这种外网一翻到处都能找到的知识付费,仁者见仁智者见智.

自以为本篇万字教程内容都是个人整理的精华,应该比国内全网能找到的大部分traefik教程更加详细

本人没有任何写文盈利目的,不需要打赏推广

发这篇也主要是分享一下给群友,有问题自己下面评论区进行讨论

展开 收起
22评论

  • 精彩
  • 最新
  • 阿里云的DNS Api怎么搞

    校验提示文案

    提交
    官方文档检索一下

    校验提示文案

    提交
    阿里云的找到了吗大哥

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • yml对复制黏贴太不友好了,大佬要是有配置截图就好了。

    校验提示文案

    提交
    啊, 我还想着文字版更加适合, 你还反倒喜欢图片?

    校验提示文案

    提交
    最好都有,不懂这个配置,做完搞了好久才把yml层级弄好,把容器跑了起来。有对照就不用到处去找正确配置格式是什么样的。

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 楼主大赞,之前参照你发的SWAG的教程,现在感觉Traefik更强大呢,目前遇到一个问题:
    我通过unraid虚拟了一台群晖,直通了硬盘控制器和2.5G网卡,也做好了反向代理,目前就是Synology Drive的桌面服务端口6690反向代理没成功,通过配置动态文件的方式,无法访问,是不是要用Traefik的TCP rounter呢,楼主知道吗?

    校验提示文案

    提交
    是的,理解至上.在动态文件中手动修改添加就对了.照着我的范例里面的qb的内容改

    校验提示文案

    提交
    老哥,你的6690反代成功了吗?yml文件里怎么配置

    校验提示文案

    提交
    收起所有回复
  • lucky反代,设置更简单好用

    校验提示文案

    提交
    用过,只能说设置简单适合新手,谈不上好用

    校验提示文案

    提交
    收起所有回复
  • 也没有背景说明,搞一通不知道你要干啥

    校验提示文案

    提交
  • 来给大熊点个赞吧!!!还是沙发~哇咔咔

    校验提示文案

    提交
  • 小白福音,大佬加油!

    校验提示文案

    提交
  • 收藏加关注

    校验提示文案

    提交
  • 头一次在张大妈看技术文章

    校验提示文案

    提交
  • 提醒一下,从值得买的页面上复制下来的代码,一定要对照一下网页上格式,自己再检查一遍,已经好几位朋友来找我,发现是值得买页面的锅,复制下来,导致有些位置的缩进出问题,运行docker会报错,注意!!!注意!!!注意!!! [ok了] [ok了] [ok了]

    校验提示文案

    提交
  • 升级traefik3.0如果出现报错, 需要删除配置文件中的swarm相应字段 [脸红]

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
229
扫一下,分享更方便,购买更轻松