Feign 在 IDEA 下被拦截问题 & 双栈套接字(Dual-Stack Socket)动画讲解

问题复盘、为什么会发生、以及你为何通过 `-Djava.net.preferIPv4Stack=true` 解决(交互动画演示)

问题概述

你使用 EasyConnect VPN 后在 IntelliJ IDEA 内发起的 **HTTP(Feign)调用** 被接口拦截(或失败),但使用 Postman / curl / 其他工具时能正常访问。你通过在 IDEA 的 JVM 参数添加:-Djava.net.preferIPv4Stack=true 后问题解决。

结论(快速):问题来源于 JVM 默认使用 IPv6/双栈行为,与 VPN 的路由或代理不兼容;强制使用 IPv4 绕过了该不兼容。

核心概念:什么是 双栈套接字

  1. 双栈设备/主机同时支持 IPv4 和 IPv6 协议。:contentReference[oaicite:1]{index=1}
  2. 在许多系统上(含 Java 的网络实现),JVM 会创建一个 IPv6 套接字 并允许通过“映射的 IPv4 地址(IPv4-mapped IPv6)” 来和 IPv4 主机通信——这就是“dual-stack socket”的典型行为。:contentReference[oaicite:2]{index=2}
  3. 优点:只需一个监听 socket 就可同时接收 IPv4 与 IPv6 连接(某些平台需设置 `IPV6_V6ONLY`)。缺点:不同平台上的行为不完全一致,且在某些 VPN/代理下会出现路由或兼容性问题。:contentReference[oaicite:3]{index=3}

动画演示(点击按钮触发)

IDEA JVM
Feign 请求
远端 API
(支持 IPv4/IPv6)
IPv4 通道
IPv6 / Dual-stack 通道
6
4
当前:JVM 优先双栈(IPv6 可见)

演示说明:点击 发送示例请求,两条“数据包”会尝试通过各自通道到达服务端。切换按钮模拟 JVM 是否强制只用 IPv4。

问题原因简要与建议步骤

  1. IDEA(即 JVM)默认可能优先使用 IPv6 / dual-stack 套接字;在某些 VPN(如 EasyConnect)的网络策略/代理下,IPv6 路径或 IPv4-mapped 转换会被错误处理或拦截,导致 Feign 请求失败。:contentReference[oaicite:4]{index=4}
  2. 将 JVM 启动参数添加:-Djava.net.preferIPv4Stack=true 可强制 JVM 仅使用 IPv4 套接字,避免双栈带来的兼容问题(你用这个方式已解决)。:contentReference[oaicite:5]{index=5}
  3. 其他可选项:在 IDEA 中检查 HTTP Proxy 设置、在 Feign 中打印并比对请求头/目标 IP,或尝试替换 HTTP 客户端(例如用 WebClient)来进一步排查。
如果需要,我可以把这份 HTML 进一步改成自带「导出 PDF」或「演示模式(全屏)」的版本。