精华内容
下载资源
问答
  • Traefik v2

    2020-12-29 01:11:15
    <div><p>该提问来源于开源项目:geek-cookbook/geek-cookbook</p></div>
  • Traefik2 LuaScript LuaScript是中间件,用于执行可访问API的lua脚本 使用的LUA VM 一个 在 关于 该中间件使您可以用LUA脚本编写业务逻辑 收到传入请求 添加/修改请求标头 添加/修改响应头 中断请求 对外部服务进行...
  • traefik2-with-oauth2:在docker环境中全自动安装traefik 2和Google Oauth 2.0
  • traefik-helm-chart:Traefik v2掌舵图
  • <div><p>Running Traefik v2, the current container doesn't export certificates from acme.json anymore. Can be fixed by adding <code>--version v2, but I'm not sure if that should be the default ...
  • Traefik v2 https support

    2020-12-30 05:17:44
    <div><p>I am am trying to up the latest version of docker4drupal to work with Traefik v2. I had it working previously with v1.x of Traefik but am struggling to transition to configure v2. <p>I have ...
  • traefik-v2-reverse-proxy-for-docker Docker应用程序的Traefik v2反向代理文档 格里克辛尼姆勒 CentOS7 kurulu bir机芯 Önceliklemakinemizde码头工人yüklüolmalı。 Makinede docker-撰写yüklüolmalı。 ...
  • [Feature] Traefik v2 app

    2020-11-27 06:34:38
    <p>Add app for traefik v2 <p>https://docs.traefik.io</p> <p>https://docs.traefik.io/getting-started/install-traefik/#use-the-helm-chart</p><p>该提问来源于开源项目:alexellis/arkade</p></div>
  • <strong>A separate guide for Traefik 2 will be published in the coming days.</strong></p> <p>3+ Months later and no updated tutorial. :( Will a revised one come out soon?</p><p>该提问来源于开源...
  • - /home/user/docker/traefik2/acme/acme.json:/acme.json - /home/user/docker/traefik2/traefik.log:/traefik.log environment: - CF_API_EMAIL=my.com - CF_API_KEY=ghfhfh55654fghfh labels: - &...
  • 在kubernetes中安装traefik2

    千次阅读 2020-05-25 09:53:33
    traefik2 DaemonSet 云原生微服务中我们使用了traefik2来作为我们的网关,当然我们也是通过DaemonSet(也可以使用deployment)的方式来部署到Kubernetes集群中。 DaemonSet部署之后的pod有如下特征 Kubernetes集群中...

    traefik2 DaemonSet

    云原生微服务中我们使用了traefik2来作为我们的网关,当然我们也是通过DaemonSet(也可以使用deployment)的方式来部署到Kubernetes集群中。
    DaemonSet部署之后的pod有如下特征

    Kubernetes集群中的每个work node上都有这个pod(traefik2实例)
    每个work node上只有一个这样的pod实例
    当有新的work node加入Kubernetes集群后,该pod会自动在新加入的work node上被创建出来,而当旧的work node被删除后,它上面的pod也会被相应的删除掉。

    比如我们的traefik2的DaemonSet像下面这样

    traefik-ds.png

    需要注意的是args从configMap中引入了4个变量,其值分别如下:

    # 访问http端口
    web_port=80
    
    # 访问https端口
    websecure_port=443
    
    # traefik dashborad端口(默认)
    traefik_port=8080
    
    # 监控哪个namespace资源,如果有多个,则以逗号连接。默认是所有namespace
    watch_namespace=exmpale-beta
    

    如果你使用DaemonSet的方式安装两个相同的traefik,那么上面提及到的4个变量都要进行对应的修改
    一个traefik提供对内服务的访问,一个traefik提供对外服务的访问

    使用了kubernetes,流量路由就如下所示

        internet
            |
       [ Ingress ]
       --|-----|--
       [ Services ]
    
    

    这里定义的80/443端口就是外部的请求要通过这两个端口才能转发到Service(kubernetes)中。

    指定关注的的namespace

    如果我们不指定traefik2监控的是哪个namespace的资源(默认是所有的),那么当我们访问的时候就可能访问到其他namespace的资源

    curl -H 'Host: www.example-beta.com' www.example-rc.com
    

    example-beta.com部署在example-beta这个namespace,而example-rc.com部署在example-rc这个namespace,但是通过上面的访问方式就能访问到example-beta的资源,很明显这并不安全。

    traefik-ingressroute-1.png

    traefik ingress解析规则是根据Host头来解析的,如果我们偷天换日就会导致访问了另外一个namespace的资源。

    关于traefik ingress route我在下面还会提及

    使用traefik2 IngressRoute代替Kubernetes Ingress

    traefik2不仅可以作为网关,它还可以作为ingress controller(另一个比较出名的的nginx),有了它我们需要使用ingress route来配置我们的匹配规则而不再使用kubernetes的ingress。

    之前kubernetes 的ingress规则是这样的

    ingress.png

    而使用了ingress route之后则是这样的

    traefik-ingressroute-2.png

    为什么需要CRD?

    IngressRoute这个Kind是traefik提供的,kubernetes并不认识它呀,不过还好kubernetes支持CRD(Custom Resource Definitions)。我们只需要加上CRD即可。

    所有关于kubernetes的CRD配置请参考官方文档: https://docs.traefik.io/reference/dynamic-configuration/kubernetes-crd/

    访问集群资源(RBAC)

    这里着重需要说明的是RBAC: 基于角色的访问控制(Role-Based Access Control)的配置

    traefik-cluster-role.png

    traefik-cluster-role-binding-user.png

    RBAC实际上很简单,想想平时做的业务系统,你只要知道下面这几个概念你就知道了。

    Kubernetes中的service,ingress,configmap,secret等都是资源,一般是一个账号,属于什么角色,这个角色可以操控哪些资源

    比如HR可以查看员工工资,而员工只能知道自己的工资

    所以Kubernetes中也存在着三个基本概念

    1. Role : 角色,它其实是一组规则,定义了一组对Kubernetes API对象的操作权限
    2. Subject:被作用者,既可以是“人”,也可以是“机器”,也可以使你在Kubernetes里定义的“用
      户”。
    3. RoleBinding:定义了“被作用者”和“角色”的绑定关系

    role-binding-user.png

    Role对象的rules字段,就是它所定义的权限规则。在上面的例子里,这条规则的含义就是:允许“被作用者”,对mynamespace下面的Pod对象,进行GET、WATCH和LIST操作。

    RoleBinding对象里定义了一个subjects字段,即“被作用者”。它的类型是User,即Kubernetes里的用户。这个用户的名字是example-user。

    这里的User实际上是Kubernetes的内置账户ServiceAccount。

    在Kubernetes中Role和RoleBinding对象都是Namespaced对象,它们对权限的限制规则仅在它们自己的Namespace内有效。 对于非Namespaced(Non-namespaced)对象(比如:Node),或者,某一个Role想要作用于所有的Namespace的时候,就需要使用ClusterRole和ClusterRoleBinding这两个组合了。(也就是我们上面贴出来的配置)

    至此,traefik2已经安装完毕。

    总结

    对应安装第三方提供的组件,安装是存在固定流程的。

    1. 使用DaemonSet/Deployment的方式安装
    2. 指定CRD
    3. 指定RBAC

    对于traefik2而已,如果你想要在work node上安装两个traefik(一个对内,一个对外),那么你至少需要改变三个端口。

    展开全文
  • <p><code>./arkade install traefik2</code></p> <p>Exposing the Dashboard <p><code>./arkade install traefik2 --dashboard=true</code></p> <p>Check access to traefik dashboard <p><code>kubectl port-...
  • 更简单的 Traefik 2 使用方式 经过一年多的实践,对于使用 Traefik 有了一些更深入的体会,本篇先来介绍如何简化使用,后续会逐步展开聊聊如何在云上使用这款“云原生”工具,以及结合它做一些提升业务效率和开发...

    更简单的 Traefik 2 使用方式

    经过一年多的实践,对于使用 Traefik 有了一些更深入的体会,本篇先来介绍如何简化使用,后续会逐步展开聊聊如何在云上使用这款“云原生”工具,以及结合它做一些提升业务效率和开发效率的实践。

    Traefik 2 使用指南,愉悦的开发体验配置基于Traefik v2的 Web 服务器 文章中,使用 Traefik 的方案引入了比较多的配置,如果你并不是在一个复杂场景使用,这样的配置是可以简化的。

    简化程序配置文件

    一般情况下将参数变为配置,更利于在版本控制软件中进行版本管理。在 v2 版本中,因为有了动态配置的概念,传统的固定配置,使用简写的参数来替换,并记录在容器启动配置中,可以在减少分发文件数量的情况下,达到相同的效果。

    使用参数取代 traefik.toml

    在之前的文章中,我提供了一般情况下,使用的默认配置内容:

    [global]
      checkNewVersion = false
      sendAnonymousUsage = false
    
    [log]
      level = "WARN"
      format = "common"
    
    [api]
      dashboard = true
      insecure = true
    
    [ping]
    
    [accessLog]
    
    [providers]
      [providers.docker]
        watch = true
        exposedByDefault = false
        endpoint = "unix:///var/run/docker.sock"
        swarmMode = false
        useBindPortIP = false
        network = "traefik"
      [providers.file]
        watch = true
        directory = "/etc/traefik/config"
        debugLogGeneratedTemplate = true
    
    [entryPoints]
      [entryPoints.http]
        address = ":80"
      [entryPoints.https]
        address = ":443"
    

    想要达到相同的效果,只需要在 command 字段内添加下面的内容即可:

    version: '3'
    
    services:
    
      traefik:
    ...
        command:
          - "--global.sendanonymoususage=false"
          - "--global.checknewversion=false"
          - "--entrypoints.http.address=:80"
          - "--entrypoints.https.address=:443"
          - "--api=true"
          - "--api.insecure=true"
          - "--api.dashboard=true"
          - "--api.debug=false"
          - "--ping=true"
          - "--log.level=warn"
          - "--log.format=common"
          - "--accesslog=false"
          - "--providers.docker=true"
          - "--providers.docker.watch=true"
          - "--providers.docker.exposedbydefault=false"
          - "--providers.docker.endpoint=unix:///var/run/docker.sock"
          - "--providers.docker.swarmMode=false"
          - "--providers.docker.useBindPortIP=false"
          - "--providers.docker.network=traefik"
          - "--providers.file=true"
          - "--providers.file.watch=true"
          - "--providers.file.directory=/etc/traefik/config"
          - "--providers.file.debugloggeneratedtemplate=true"
    ...
    

    现在,你就可以将 traefik.toml 配置文件删除掉了。

    简化 dashboard.toml

    前文中,我们将 Traefik 的内置 dashboard 等路由通过配置文件来定义,像下面这样。

    [http.middlewares.dash-compress.compress]
    [http.middlewares.dash-auth.basicAuth]
      users = [
        "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/",
      ]
    
    [http.routers.dashboard-redirect-https]
      rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`)"
      entryPoints = ["http"]
      service = "noop"
      middlewares = ["https-redirect"]
      priority = 100
    
    [http.routers.dashboard]
      rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`)"
      entrypoints = ["https"]
      service = "dashboard@internal"
      middlewares = ["dash-compress"]
      [http.routers.dashboard.tls]
    
    [http.routers.api]
      rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`) && PathPrefix(`/api`)"
      entrypoints = ["https"]
      service = "api@internal"
      middlewares = ["dash-compress"]
      [http.routers.api.tls]
    
    [http.routers.ping]
      rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`) && PathPrefix(`/ping`)"
      entrypoints = ["https"]
      service = "ping@internal"
      middlewares = ["dash-compress"]
      [http.routers.ping.tls]
    

    其实,只需要将配置保留剩下这两条需要被预先定义的“中间件”即可,如果你不需要页面压缩,或者不需要访问密码,那么也可以不对下面的内容进行保存:

    [http.middlewares.dash-compress.compress]
    [http.middlewares.dash-auth.basicAuth]
      users = [
        "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/",
      ]
    

    接着在容器配置中添加一些 traefik 能够解析处理的规则在 labels 字段中即可:

    version: '3'
    
    services:
    
      traefik:
    ...    
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik"
          # 默认请求转发 https 端口
          - "traefik.http.routers.traefik-dash-default.middlewares=https-redirect@file"
          - "traefik.http.routers.traefik-dash-default.entrypoints=http"
          - "traefik.http.routers.traefik-dash-default.rule=Host(`dashboard.guava.lab.com`)"
          - "traefik.http.routers.traefik-dash-default.service=dashboard@internal"
          # 处理网页
          - "traefik.http.routers.traefik-dash-web.entrypoints=https"
          - "traefik.http.routers.traefik-dash-web.rule=Host(`dashboard.guava.lab.com`) && PathPrefix(`/`)"
          - "traefik.http.routers.traefik-dash-web.tls=true"
          - "traefik.http.routers.traefik-dash-web.service=dashboard@internal"
          # 处理接口
          - "traefik.http.routers.traefik-dash-api.entrypoints=https"
          - "traefik.http.routers.traefik-dash-api.rule=Host(`dashboard.guava.lab.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
          - "traefik.http.routers.traefik-dash-api.tls=true"
          - "traefik.http.routers.traefik-dash-api.service=api@internal"
    ...
    

    单独抽象保存的 default.toml 配置

    虽然我们将 90% 的内容都迁移到了 compose 配置文件中,但是还是有一些内容暂时是不好进行重写的,比如下面提到的“内容Gzip压缩”和“HTTP转发HTTPS”:

    # 提供 Gzip 压缩
    [http.middlewares.gzip.compress]
    
    # tricks 实现,提供 HTTP 默认转发 HTTPS
    # https://github.com/containous/traefik/issues/4863#issuecomment-491093096
    [http.services]
      [http.services.noop.LoadBalancer]
         [[http.services.noop.LoadBalancer.servers]]
            url = "" # or url = "localhost"
    
    [http.routers]
      [http.routers.https-redirect]
        entryPoints = ["http"]
        rule = "HostRegexp(`{any:.*}`)"
        middlewares = ["https-redirect"]
        service = "noop"
    
    [http.middlewares.https-redirect.redirectScheme]
      scheme = "https"
    

    这里倒不是说不能够在应用内配置,而是如果这两个中间件在应用内配置,会出现每个应用都需要配置重复配置的问题。尽管独立的配置会让应用的可迁移性更好,然而这份配置可以提供不论是在本地、私有云,还是公有云 SLB 环境下的一致行为,维护一份配置,总比维护几份要来的方便,不是吗?

    完整的容器配置

    一如既往,这里给出完整的 compose 配置:

    version: '3'
    
    services:
    
      traefik:
        container_name: traefik
        image: traefik:v2.3.4
        restart: always
        ports:
          - 80:80
          - 443:443
        networks:
          - traefik
        command:
          - "--global.sendanonymoususage=false"
          - "--global.checknewversion=false"
          - "--entrypoints.http.address=:80"
          - "--entrypoints.https.address=:443"
          - "--api=true"
          - "--api.insecure=true"
          - "--api.dashboard=true"
          - "--api.debug=false"
          - "--ping=true"
          - "--log.level=warn"
          - "--log.format=common"
          - "--accesslog=false"
          - "--providers.docker=true"
          - "--providers.docker.watch=true"
          - "--providers.docker.exposedbydefault=false"
          - "--providers.docker.endpoint=unix:///var/run/docker.sock"
          - "--providers.docker.swarmMode=false"
          - "--providers.docker.useBindPortIP=false"
          - "--providers.docker.network=traefik"
          - "--providers.file=true"
          - "--providers.file.watch=true"
          - "--providers.file.directory=/etc/traefik/config"
          - "--providers.file.debugloggeneratedtemplate=true"
        volumes:
          # 仅限标准的 Linux 环境
          - /etc/localtime:/etc/localtime:ro
          - /etc/timezone:/etc/timezone:ro
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - ./config/:/etc/traefik/config/:ro
          - ./ssl/:/data/ssl/:ro
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik"
          # 默认请求转发 https 端口
          - "traefik.http.routers.traefik-dash-default.middlewares=https-redirect@file"
          - "traefik.http.routers.traefik-dash-default.entrypoints=http"
          - "traefik.http.routers.traefik-dash-default.rule=Host(`dashboard.guava.lab.com`)"
          - "traefik.http.routers.traefik-dash-default.service=dashboard@internal"
          # 处理网页
          - "traefik.http.routers.traefik-dash-web.entrypoints=https"
          - "traefik.http.routers.traefik-dash-web.rule=Host(`dashboard.guava.lab.com`) && PathPrefix(`/`)"
          - "traefik.http.routers.traefik-dash-web.tls=true"
          - "traefik.http.routers.traefik-dash-web.service=dashboard@internal"
          # 处理接口
          - "traefik.http.routers.traefik-dash-api.entrypoints=https"
          - "traefik.http.routers.traefik-dash-api.rule=Host(`dashboard.guava.lab.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
          - "traefik.http.routers.traefik-dash-api.tls=true"
          - "traefik.http.routers.traefik-dash-api.service=api@internal"
        healthcheck:
          test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:8080/ping || exit 1"]
          interval: 3s
          retries: 12
        logging:
          driver: "json-file"
          options:
            max-size: "1m"
    
    networks:
      traefik:
        external: true
    

    最后

    官方在前一阵推出了 https://traefik.io/traefik-pilot/,除了作为统一的管理中心之外,还提供了许多有用的中间件,比如请求/响应头改写、IP 禁止名单、IP地址转换、fail2ban 等等。

    因为暂时官方无意将 pilot 开源(可能也会是长期状况),如果你不介意“联公网”使用,可以试试注册 pilot 使用。

    –EOF


    我现在有一个小小的折腾群,里面聚集了一些喜欢折腾的小伙伴。

    在不发广告的情况下,我们在里面会一起聊聊软件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的资料。

    喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,否则不会通过审核)

    关于折腾群入群的那些事


    本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

    本文作者: 苏洋

    创建时间: 2020年12月02日
    统计字数: 7102字
    阅读时间: 15分钟阅读
    本文链接: https://soulteary.com/2020/12/02/easier-way-to-use-traefik-2.html

    展开全文
  • <div><p>This PR adds the schema of <a href="https://doc.traefik.io/traefik/v2.0/providers/file/">Traefik v2 File Provider</a> configuration (<a href="https://github.com/traefik/traefik/issues/6869#...
  • <p>The Traefik 2 is released. Since in docker-compose.yml we have <pre><code>yaml traefik: image: traefik </code></pre> <p>It gets the last available release. But seems 1.7 and 2.0 is not BC ...
  • <p>Due to backward-incompatible changes in traefik2.X(<a href="https://docs.traefik.io/migration/v1-to-v2/">link) current example doesn't work. <h2>How Has This Been Tested? <p>On my Raspberry Pi....
  • <div><p>I noticed when trying to use your traefik 2 docker-compose file with cloudflare for a wildcard certificate, it would also try to generate a certificate for the service.example....
  • Support Traefik v2 format

    2020-12-02 14:26:22
    destiny_traefik-certs-dumper.1.dmljzrdxvnf0 | github.com/ldez/traefik-certs-dumper/v2/cmd.glob..func2(0xc0001304d0, 0x11c9f60, 0x0, 0x0) destiny_traefik-certs-dumper.1.dmljzrdxvnf0 | /go/src/github....
  • ve been trying to find documentation around websockets for Traefik v2 and have only come across this post with <a href="https://stackoverflow.com/a/58519088">some examples</a>. <p>As a result, I have ...
  • <div><p>Currently Traefik 2 is exposed using a L4 regional LB in gcloud. You can only add regional IPs for service type LoadBalancer in gcloud. However due to future possibility of moving the cluster ...
  • Traefik2.x IngressController

    2020-11-19 18:17:42
    关于Traefik2.x IngressController 引言 主要想了解,外部流量如何请求到内部,并且做反向代理 正文 1. k8s外部流量如何请求到内部? 第一种方式比较容易想到,只要将service绑定好pod,并且将service的node...

    关于Traefik2.x IngressController

    引言

    主要想了解,外部流量如何请求到内部,并且做反向代理

    正文

    1. k8s外部流量如何请求到内部?

    1. 第一种方式比较容易想到,只要将service绑定好pod,并且将service的nodeport暴露出来,提供入口和负载均衡,流量就可以从外部请求到对应的服务,此时就可以按照以前的经验,在最外层部署nginx,由nginx代理这些暴露的nodeport,这样就可以达到反向代理的效果,但是这种方式是静态的,也就是说如果有新的服务需要修改配置重启生效

    2. 第二种方式主要利用k8s提供的IngressController Kind,有很多种实现,这里就说一下Traefik IngressController,他本身提供了反向代理等功能,路由方式,各种插件,WEB页面,以及权限管理等,安装好之后,以后有变更只需要edit ingress即可,发布新的路由也只需发布一个新的ingress就可以动态生效,ingress是在k8s内部,所以他可以不代理nodeport,直接代理clusterIp对应的containerPort即可,也就是说可以不暴露服务到外网,只有ingressController暴露在了外网

    2.如何部署并暴露IngressController?

    这里依然拿Traefik2举例,他有很多端口,比如流量入口 web:80,管理页面端口 admin:8080等,我们只需要将80端口改为hostport占用宿主机的80端口,并以daemonset方式部署,每个节点都部署一个,配置相同的域名和子域名,这样流量就可以请求到任意一个节点都是代理端口80,并自动转发,最后将所有节点的外网ip与域名绑定好后,自动就有了DNS轮训功能,保证了多节点并发流量均衡。

    3.如何部署Traefik2 IngressController?

    1. 网上有很多教程可以参考一些基于yml部署的博客去实现(好不好用看运气)
    2. 基于官网的Helm3部署,需要安装helm并且对其尽可能的熟悉,参考官方地址:基于Helm安装教程
    3. 基于官网的crd安装(有些小问题)

    安装traefik的自定义kind资源和rbac,然后部署dp即可,yum安装教程

    这里有一些问题,部署yml的时候官网是dp的形式部署,可改为daemonset,然后需要加一个东西,否则ingressroute不生效
    在这里插入图片描述
    然后将web:80 流量入口改为hostport即可
    在这里插入图片描述
    这样写ingress或ingressRoute就可以不用端口号直接请求到配置perfix前缀路径了,最后再写一个ingressRoute去代理下traefik的admin端口:8080 就可以看到web页面了(不代理用nodeport也可以)

    在这里插入图片描述
    最后需要注意一下的是ingressRoute的配置路径
    在这里插入图片描述
    比如我配置的是/nginx 会404,如果你用过nginx看一下我这篇文章你就能理解什么意思路径问题,大概就是请求 /nginx 时确实会转发给nginx-svc,但是转发过去的路径依然会带上/nginx 但是nginx.conf并没有任何服务代理到/nginx 所以一定是404 ,只需要代理到 / 即可

    展开全文
  • <p>First time setting up Traefik v2, and got a Dashboard 404 error. <p>I've tried curl https://192.168.0.6:8080/api/http/routers and get: 404 page not found</p> <p>Here's my config: ...
  • Traefik 2 基础授权验证(后篇) 上篇文章中,我们提到了 Traefik 的 Forward Auth,本篇内容我们来展开聊聊如何使用它。 准备基础的 Web 服务Demo 这篇文章里,我们继续使用 whoami 作为 Web 服务,基础的配置文件...

    Traefik 2 基础授权验证(后篇)

    上篇文章中,我们提到了 Traefik 的 Forward Auth,本篇内容我们来展开聊聊如何使用它。

    准备基础的 Web 服务Demo

    这篇文章里,我们继续使用 whoami 作为 Web 服务,基础的配置文件和上一篇文章中一致,暂时不需要额外的设置:

    version: '3'
    
    services:
    
      whoami:
        image: containous/whoami
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik"
    
          - "traefik.http.routers.test-auth-web.middlewares=https-redirect@file"
          - "traefik.http.routers.test-auth-web.entrypoints=http"
          - "traefik.http.routers.test-auth-web.rule=Host(`whoami.lab.com`, `whoami.lab.io`)"
    
          - "traefik.http.routers.test-auth-ssl.entrypoints=https"
          - "traefik.http.routers.test-auth-ssl.tls=true"
          - "traefik.http.routers.test-auth-ssl.rule=Host(`whoami.lab.com`, `whoami.lab.io`)"
    
        networks:
          - traefik
    
    networks:
      traefik:
        external: true
    

    使用容器配置 Traefik Forward Auth 服务

    thomseddon/traefik-forward-auth 这个开源项目让我们在使用 Traefik 的时候,结合 Forward Auth 中间件,可以快速实现通用 OAuth / SSO 功能:

    • 支持多种验证“服务商”:Google/ 通用OAuth / 通用OIDC
    • 支持自定义请求服务器和指定路径,方便与现有系统集成
    • 支持基础的用户限制、授权来源限制、支持设置跨域 Cookie

    简单来说,只要你的系统对外暴露服务是通过 Traefik,那么可以非常轻松愉快的使用这个模式为应用添加一层通用的前置 SSO 。可以达到效果类似我们在外部公网访问公司内网服务时候,会出现的一个登陆框,只有登陆成功后,才会展示我们想要看的内容。

    使用这个方案的好处是,我们只需要结合一些简单的胶水代码,就可以做到背后的应用无修改接入或者几乎无修改接入,即使应用本身不支持 OAuth / SSO 方式接入,或者说我们无法直接修改的商业付费软件。

    version: '3'
    
    services:
      
      traefik-forward-auth:
        image: thomseddon/traefik-forward-auth:v2.2.0
        restart: always
        hostname: traefik-auth.lab.io
        environment:
          - LOG_LEVEL=trace
          - DEFAULT_PROVIDER=generic-oauth
          - PROVIDERS_GENERIC_OAUTH_AUTH_URL=https://sso.lab.io/dialog/authorize
          - PROVIDERS_GENERIC_OAUTH_TOKEN_URL=http://sso-web/oauth/token
          - PROVIDERS_GENERIC_OAUTH_USER_URL=http://sso-web/api/userinfo
          - PROVIDERS_GENERIC_OAUTH_USER_URL=http://sso-web/api/traefik-auth-user
          - PROVIDERS_GENERIC_OAUTH_CLIENT_ID=abc123
          - PROVIDERS_GENERIC_OAUTH_CLIENT_SECRET=ssh-secret
          - PROVIDERS_GENERIC_OAUTH_SCOPE=*
          - PROVIDERS_GENERIC_OAUTH_TOKEN_STYLE=header
          - SECRET=something-random
          - INSECURE_COOKIE=true
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik"
    
          - "traefik.http.routers.traefik-auth-web.entrypoints=http"
          - "traefik.http.routers.traefik-auth-web.rule=Host(`traefik-auth.lab.com`, `traefik-auth.lab.io`)"
    
          - "traefik.http.routers.traefik-auth-ssl.entrypoints=https"
          - "traefik.http.routers.traefik-auth-ssl.rule=Host(`traefik-auth.lab.com`, `traefik-auth.lab.io`)"
          - "traefik.http.routers.traefik-auth-ssl.tls=true"
    
          - "traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181"
          - "traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User"
          - "traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181"
        networks:
          - traefik
    
    networks:
      traefik:
        external: true
    

    使用这个项目因为配置项比较多,而显得比较复杂,实际上并非如此,我们一点一点来理解它。

    配置应用参数

    我们在环境变量中定义了许多内容,这些内容的解释可以参考官方文档,这里我选择了 OAuth 作为授权服务配置,为了演示方便,我将他们运行在相同主机的相同容器网卡中,PROVIDERS_GENERIC_OAUTH_AUTH_URL 是用于用户在浏览器前端访问的地址,用于“确认授权”行为,所以需要配置对外访问的网络域名,除此之外,PROVIDERS_GENERIC_OAUTH_TOKEN_URLPROVIDERS_GENERIC_OAUTH_USER_URLPROVIDERS_GENERIC_OAUTH_USER_URL 可以都走容器内部通信,更加高效。

    如果我们的 SSO 服务可以进行独立部署,那么这里四个 URL 变量需要都配置成可访问的域名地址,如果使用 https 协议,涉及自签名证书,需要重新构建容器。下一篇内容,我们再仔细展开 SSO 服务,这里稍作了解,有个印象就行啦。

    environment:
      - LOG_LEVEL=trace
      - DEFAULT_PROVIDER=generic-oauth
      - PROVIDERS_GENERIC_OAUTH_AUTH_URL=https://sso.lab.io/dialog/authorize
      - PROVIDERS_GENERIC_OAUTH_TOKEN_URL=http://sso-web/oauth/token
      - PROVIDERS_GENERIC_OAUTH_USER_URL=http://sso-web/api/userinfo
      - PROVIDERS_GENERIC_OAUTH_USER_URL=http://sso-web/api/traefik-auth-user
      - PROVIDERS_GENERIC_OAUTH_CLIENT_ID=abc123
      - PROVIDERS_GENERIC_OAUTH_CLIENT_SECRET=secret
      - PROVIDERS_GENERIC_OAUTH_SCOPE=*
      - PROVIDERS_GENERIC_OAUTH_TOKEN_STYLE=header
      - SECRET=something-random
      - INSECURE_COOKIE=true
    

    接着我们来进行服务路由的配置。

    配置应用服务路由

    配置服务路由比较简单,可以根据需求和喜好,设置是否“执行 HTTP 自动转发 HTTPS”等逻辑,设置方法上一篇文章中有描述,就不再赘述:

    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik"
    
      - "traefik.http.routers.traefik-auth-web.entrypoints=http"
      - "traefik.http.routers.traefik-auth-web.rule=Host(`traefik-auth.lab.com`, `traefik-auth.lab.io`)"
    
      - "traefik.http.routers.traefik-auth-ssl.entrypoints=https"
      - "traefik.http.routers.traefik-auth-ssl.tls=true"
      - "traefik.http.routers.traefik-auth-ssl.rule=Host(`traefik-auth.lab.com`, `traefik-auth.lab.io`)"
    ...
    

    接着是配置 forwardauth 中间件,这里和配置应用参数情况类似,因为是同机部署演示,这里使用应用名称即可。如果是独立部署,需要替换为访问域名:

    labels:
      ...
      - "traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181"
      - "traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User"
      - "traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181"
    

    上面的中间件配置中还存在一个 authResponseHeaders 配置项 :用来向后续服务传递通过鉴权的用户信息,可以根据自己的需求进行修改或者移除。

    最后,使用 docker-compose -d 启动应用,等待应用启动完毕,就可以准备应用接入啦。

    完成应用配置

    我们将文章开头的 Web 服务 Demo 配置中添加一条简单的配置规则,让刚刚配置的 traefik-forward-auth 加入到应用服务路由中:

    version: '3'
    
    services:
    
      whoami:
        image: containous/whoami
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik"
    ...
          - "traefik.http.routers.test-auth-ssl.middlewares=traefik-forward-auth@docker"
    
    ...
        networks:
          - traefik
    
    networks:
      traefik:
        external: true
    

    将内容单独保存一个新的 docker-compose.yml ,再次继续使用 docker-compose up -d 启动服务,接着进行服务效果验证。

    验证 Forward Auth SSO 效果

    打开浏览器,输入 whoami.lab.io ,可以看到首先是被重定向到了 https 协议,然后再次被重定向到了 sso.lab.io/... 的 SSO 鉴权地址,提示我们输入账号密码。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jyFjzehZ-1606919693842)(https://attachment.soulteary.com/2020/12/02/auth-input.png)]

    我们使用 curl 再来模拟一次服务端请求:

    curl  https://whoami.lab.io -v    
    *   Trying 127.0.0.1...
    * TCP_NODELAY set
    * Connected to whoami.lab.io (127.0.0.1) port 443 (#0)
    ...
    > GET / HTTP/2
    > Host: whoami.lab.io
    > User-Agent: curl/7.64.1
    > Accept: */*
    > 
    * Connection state changed (MAX_CONCURRENT_STREAMS == 250)!
    < HTTP/2 307 
    < content-type: text/html; charset=utf-8
    < date: Wed, 02 Dec 2020 13:45:35 GMT
    < location: https://sso.lab.io/dialog/authorize?client_id=abc123&redirect_uri=https%3A%2F%2Fwhoami.lab.io%2F_oauth&response_type=code&scope=%2A&state=396bd5c20d6bcfdffc2426bddf619707%3Ageneric-oauth%3Ahttps%3A%2F%2Fwhoami.lab.io%2F
    < set-cookie: _forward_auth_csrf=396bd5c20d6bcfdffc2426bddf619707; Path=/; Domain=whoami.lab.io; Expires=Thu, 03 Dec 2020 01:45:35 GMT; HttpOnly
    < content-length: 271
    < 
    <a href="https://sso.lab.io/dialog/authorize?client_id=abc123&amp;redirect_uri=https%3A%2F%2Fwhoami.lab.io%2F_oauth&amp;response_type=code&amp;scope=%2A&amp;state=396bd5c20d6bcfdffc2426bddf619707%3Ageneric-oauth%3Ahttps%3A%2F%2Fwhoami.lab.io%2F">Temporary Redirect</a>.
    
    * Connection #0 to host whoami.lab.io left intact
    * Closing connection 0
    

    可以看到配置依然是生效的,服务端返回了 307 重定向,我们发送到 whoami.lab.io 的请求被转向到了 sso.lab.io ,符合我们的预期。

    接着在浏览器中输入账号密码,点击提交,可以看到被重定向到了页面授权确认页面。

    提示需要用户确认授权

    点击允许,进行授权,等待授权完毕,我们就可以正式访问到应用的页面了。当然,也有一些应用会精简掉用户确认的对话框,让验证的整个流程更加的顺滑:

    授权完毕,正常访问背后的应用

    可以看到,应用请求头 X-Forwarded-User 和 Cookie 中可以看到通过授权的用户信息,可以进行进一步处理,或者鉴权规则的完善。

    最后

    写到这里,Traefik 基础鉴权验证的内容就完毕了,但是 SSO / OAuth 相关的内容才刚刚开始。

    –EOF


    我现在有一个小小的折腾群,里面聚集了一些喜欢折腾的小伙伴。

    在不发广告的情况下,我们在里面会一起聊聊软件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的资料。

    喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,否则不会通过审核)

    关于折腾群入群的那些事


    本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

    本文作者: 苏洋

    创建时间: 2020年12月02日
    统计字数: 6183字
    阅读时间: 13分钟阅读
    本文链接: https://soulteary.com/2020/12/02/traefik-2-basic-authorization-verification-part-2.html

    展开全文
  • While doing so, I have noticed that the <a href="https://github.com/Mailu/Mailu/blob/master/docs/reverse.rst#traefik-as-reverse-proxy">configuration instructions for Traefik</a> only provide the ...
  • 介绍 Traefik 是什么?...这篇文章对 Traefik 使用有不错的解释:我为什么要选择traefik2做网关? 准备工作 Helm V3 确保你已经安装了 Helm V3,上一节已经介绍如何安装它 -> Helm V3 的安装...
  • Traefik V2 2.1 w/Forward Auth Pomerium 6.0.2 <h2>Traefik V2 helm config <pre><code> apiVersion: helm.fluxcd.io/v1 kind: HelmRelease metadata: name: traefik-v2 namespace: kube-system spec: release...
  • Traefik 2 基础授权验证(前篇) 我们经常会看到在访问应用前,系统提示用户进行鉴权操作,或出于某些原因,内部提供公网服务的应用需要藏在一些基础的鉴权认证后,避免直接向大众公开。 除了使用各种语言来实现鉴权...
  • <div><p>I am using the keys generated by traefik v2 for authelia with a basic whoami example. <p>With traefik set up and working with https from the letsencrypt staging environment, I dump the cert ...
  • 带有Docker Compose,Traefik 2,Google OAuth2和LetsEncrypt的Docker媒体服务器堆栈 设置: 安装Docker和Docker Compose 设置文件夹和子文件夹的特权: sudo setfacl -Rdm g:docker:rwx ~/htpc sudo chmod -R ...
  • Traefik2 User Specified IP

    2020-12-26 05:06:30
    <p>Creating traefik ... error <p>ERROR: for traefik user specified IP address is supported only when connecting to networks with user configured subnets <p>ERROR: for traefik user specified IP address...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 818
精华内容 327
关键字:

traefik2