限制 Traefik 路由上允许的方法
Restrict allowed methods on Traefik routes
我目前正在使用 traefik 1.6.x 作为我的 K8s 集群中的入口控制器。我想更新到 1.7.x(稍后更新到 2.x),但是更新后我的入口不再工作了。
问题似乎是,我通过将方法添加到 traefik.frontend.rule.type
注释来对我的入口进行 http 方法限制,如下所示:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: app-name
namespace: namespace1
annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: "Method: CONNECT, DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT; PathPrefix"
ingress.kubernetes.io/hsts-max-age: "315360000"
ingress.kubernetes.io/hsts-include-subdomains: "true"
ingress.kubernetes.io/custom-frame-options-value: "SAMEORIGIN"
ingress.kubernetes.io/content-type-nosniff: "true"
ingress.kubernetes.io/browser-xss-filter: "true"
ingress.kubernetes.io/custom-response-headers: "Server:||X-Application-Context:||X-Powered-By:||exception:"
spec:
rules:
- host: ...
我不知道这是否曾经打算以这种方式完成,但显然它奏效了。我发现在其他一些 Whosebug post、iirc.
删除方法部分(或整个注释,因为 PathPrefix
是默认设置)使路由恢复生机。但是当然这又允许 TRACE
方法,例如
是否有另一种方法来限制那些(甚至可能是所有入口)从 1.7.x 开始的 traefik 版本?
提前致谢!
实际上@Crou 关于 CORS headers 的评论有效!我刚刚再次偶然发现了这个问题,并将 method 部分移动到 custom-reponse-headers 并且它似乎有效:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: app-name
namespace: namespace1
annotations:
kubernetes.io/ingress.class: traefik
ingress.kubernetes.io/hsts-max-age: "315360000"
ingress.kubernetes.io/hsts-include-subdomains: "true"
ingress.kubernetes.io/custom-frame-options-value: "SAMEORIGIN"
ingress.kubernetes.io/content-type-nosniff: "true"
ingress.kubernetes.io/browser-xss-filter: "true"
ingress.kubernetes.io/custom-response-headers: "Server:||X-Application-Context:||X-Powered-By:||exception:||Access-Control-Allow-Headers:CONNECT, DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT"
spec:
rules:
- host: ...
我完全删除了 traefik.frontend.rule.type
部分,因为 PathPrefix
是默认值。
(!) 我只升级到 traefik 1.7.20。我还没有设法迁移到 traefik 2。所以我不确定这是否适用于 traefik 2!
我目前正在使用 traefik 1.6.x 作为我的 K8s 集群中的入口控制器。我想更新到 1.7.x(稍后更新到 2.x),但是更新后我的入口不再工作了。
问题似乎是,我通过将方法添加到 traefik.frontend.rule.type
注释来对我的入口进行 http 方法限制,如下所示:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: app-name
namespace: namespace1
annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: "Method: CONNECT, DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT; PathPrefix"
ingress.kubernetes.io/hsts-max-age: "315360000"
ingress.kubernetes.io/hsts-include-subdomains: "true"
ingress.kubernetes.io/custom-frame-options-value: "SAMEORIGIN"
ingress.kubernetes.io/content-type-nosniff: "true"
ingress.kubernetes.io/browser-xss-filter: "true"
ingress.kubernetes.io/custom-response-headers: "Server:||X-Application-Context:||X-Powered-By:||exception:"
spec:
rules:
- host: ...
我不知道这是否曾经打算以这种方式完成,但显然它奏效了。我发现在其他一些 Whosebug post、iirc.
删除方法部分(或整个注释,因为 PathPrefix
是默认设置)使路由恢复生机。但是当然这又允许 TRACE
方法,例如
是否有另一种方法来限制那些(甚至可能是所有入口)从 1.7.x 开始的 traefik 版本?
提前致谢!
实际上@Crou 关于 CORS headers 的评论有效!我刚刚再次偶然发现了这个问题,并将 method 部分移动到 custom-reponse-headers 并且它似乎有效:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: app-name
namespace: namespace1
annotations:
kubernetes.io/ingress.class: traefik
ingress.kubernetes.io/hsts-max-age: "315360000"
ingress.kubernetes.io/hsts-include-subdomains: "true"
ingress.kubernetes.io/custom-frame-options-value: "SAMEORIGIN"
ingress.kubernetes.io/content-type-nosniff: "true"
ingress.kubernetes.io/browser-xss-filter: "true"
ingress.kubernetes.io/custom-response-headers: "Server:||X-Application-Context:||X-Powered-By:||exception:||Access-Control-Allow-Headers:CONNECT, DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT"
spec:
rules:
- host: ...
我完全删除了 traefik.frontend.rule.type
部分,因为 PathPrefix
是默认值。
(!) 我只升级到 traefik 1.7.20。我还没有设法迁移到 traefik 2。所以我不确定这是否适用于 traefik 2!