【问题标题】:ForwardedHeaderFilter no longer support IPv6ForwardedHeaderFilter 不再支持 IPv6
【发布时间】:2021-10-03 23:33:47
【问题描述】:

升级 Spring Boot 依赖后,Spring Boot 应用程序仅适用于 ipv4,但会引发 ipv6 错误。该应用程序部署在谷歌云运行服务上。当前版本:

      <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>spring-cloud-gcp-dependencies</artifactId>
        <version>2.0.3</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.9</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

错误:

java.lang.IllegalArgumentException: Invalid IPv4 address: 2409:4042:2319:a971:c4db:4661:939c:443b
    at org.springframework.web.util.UriComponentsBuilder.parseForwardedFor(UriComponentsBuilder.java:363)
    at org.springframework.web.filter.ForwardedHeaderFilter$ForwardedHeaderExtractingRequest.<init>(ForwardedHeaderFilter.java:246)
    at org.springframework.web.filter.ForwardedHeaderFilter.doFilterInternal(ForwardedHeaderFilter.java:149)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)

我能够找到类似的问题,但没有找到任何解决方案。 https://github.com/spring-projects/spring-framework/issues/26748

代码中引发错误的行 https://github.com/spring-projects/spring-framework/blob/6c68419073b43fb29114a3af4e402c729084ed84/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java#L363

【问题讨论】:

  • 要检查一个 IP 是否是 v6,我使用以下快速和脏代码:(InetAddress.getByName(ipStr) instanceof Inet6Address)

标签: java spring spring-boot ipv6 x-forwarded-for


【解决方案1】:

问题是由于谷歌云运行服务不遵守 RFC7239 标准,而不是由于 Spring Boot。 Cloud run 无法用引号和方括号括起 IPv6 地址(根据 RFC7239 标准),因此 spring 将其解释为 IPv4 地址并在从地址解析端口号时失败。

这很奇怪,谷歌云没有遵循标准。截至今天,谷歌云团队表示他们正在努力修复,但不能保证预计到达时间。

您可以在此处跟踪状态: https://issuetracker.google.com/issues/184230536?pli=1

【讨论】:

  • 您对问题的看法是正确的,但对于违反 RFC 7239 的看法是错误的:XFF 没有规范,并且在野外存在不兼容的实现。根据 RFC,创建 Forwarded 标头是为了标准化 XFF 的此问题和类似问题: > 请注意,IPv6 地址可能不会在 X-Forwarded-For 中引用,也可能不会用方括号括起来,但它们会被引用和括起来在“转发”中的方括号中。
猜你喜欢
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 2012-06-11
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多