You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K8s中WSS请求通过Traefik IngressRoute无法触发ForwardAuth中间件

解决Traefik IngressRoute中WSS请求绕过forward-auth中间件的问题

当前问题:HTTPS请求可正常触发forward-auth中间件完成Helidon应用认证,但wss://ip:443/ws/guest这类WSS请求会直接绕过中间件转发至后端服务,未经过认证流程。

以下是针对性的排查和解决方法:

1. 给WSS请求配置高优先级路由

WebSocket握手本质是带Upgrade: websocket头的HTTP GET请求,通过给这类请求单独设置更高优先级的路由,确保Traefik优先匹配并应用中间件:

修改IngressRoute.yaml:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  annotations:
    kubernetes.io/ingress.class: traefik
  name: traefik-tls
  namespace: sample-domain1-ns
spec:
  entryPoints:
   - websecure
  routes:
  # 专门匹配WebSocket握手请求,优先级设为10(高于默认的0)
  - kind: Rule
    match: PathPrefix(`/ws`) && Headers(`Upgrade`, `websocket`)
    priority: 10
    middlewares:
    - name: test-auth-tls
      namespace: sample-domain1-ns
    services:
    - kind: Service
      name: sample-domain1-cluster
      port: 8001
  # 匹配/ws路径下的普通HTTP请求
  - kind: Rule
    match: PathPrefix(`/ws`)
    middlewares:
    - name: test-auth-tls
      namespace: sample-domain1-ns
    services:
    - kind: Service
      name: sample-domain1-cluster
      port: 8001
  tls:
    certResolver: default

2. 确认forward-auth后端支持GET请求

WebSocket握手是GET请求,需检查Helidon应用的/auth端点是否支持处理GET方法:

  • 如果当前/auth仅接受POST请求,需修改端点逻辑,添加对GET方法的支持,保证能处理WSS握手的认证请求。

3. 拆分中间件避免执行顺序冲突

当前将headers和forward-auth放在同一个Middleware中,可能存在执行顺序问题,建议拆分为独立中间件,确保认证逻辑先执行:

创建单独的headers中间件(headers.yaml):

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: custom-headers
  namespace: sample-domain1-ns
spec:
  headers:
    customRequestHeaders:
      X-Forwarded-Proto: https

修改forward-auth.yaml:

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-auth-tls
  namespace: sample-domain1-ns
spec:
  forwardAuth:
    address:  https://sample-domain1-lb.sample-domain1-ns.svc.cluster.local:8080/auth
    tls:
       insecureSkipVerify: true

在IngressRoute中调整中间件顺序:

middlewares:
- name: test-auth-tls
  namespace: sample-domain1-ns
- name: custom-headers
  namespace: sample-domain1-ns

4. 查看Traefik日志验证中间件执行

启用Traefik的access日志,检查WSS请求的日志条目,确认Middleware字段包含test-auth-tls@kubernetescrd,以此判断中间件是否被正确调用。若未显示,需进一步调整路由匹配规则(比如添加Host匹配,确保请求域名与路由规则一致)。

内容的提问来源于stack exchange,提问作者atroy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:30:16