V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dong706
V2EX  ›  Kubernetes

部署在 k8s 里的 udp 服务,如何获取客户端真实 ip?

  •  
  •   dong706 · 2023-02-07 22:55:39 +08:00 · 2501 次点击
    这是一个创建于 415 天前的主题,其中的信息可能已经有所发展或是发生改变。

    费老劲解决了 http 服务获取真实 ip 的问题( ingress-nginx+service 的方式),现在碰到 udp 服务,搞不定了,有没有大佬指教下~~~不胜感激!

    14 条回复    2023-06-20 23:38:43 +08:00
    Yien
        1
    Yien  
       2023-02-07 23:48:22 +08:00
    不懂 k8s ,刚好在玩 GPT ,一下是它的答案

    通过 UDP 协议收到的请求不会包含客户端的真实 IP 地址,因此在部署在 k8s 里的 UDP 服务中,获取客户端的真实 IP 可能需要一些额外的工作。

    你可以使用一个反向代理来访问客户端的真实 IP 。例如,您可以使用 kube-proxy 或者 envoy 等工具作为反向代理,并通过在它们之间设置一个 TCP 连接来获取客户端的真实 IP 。

    另一种方法是通过把客户端的 IP 地址封装到数据包中,然后在服务端解包并读取该信息。这需要在客户端和服务端的代码中进行一些额外的开发。

    总的来说,选择哪种方法要根据你的需求和系统架构来决定。
    renothing
        2
    renothing  
       2023-02-08 01:51:33 +08:00
    需要你的服务端改造下,支持 proxy protocol 这样的协议
    https://www.haproxy.com/blog/use-the-proxy-protocol-to-preserve-a-clients-ip-address/
    kennylam777
        3
    kennylam777  
       2023-02-08 04:54:07 +08:00
    樓上兩個回應都沒看題目吧,都說了是 UDP 還在答 TCP Protocol ,但 UDP 的確是個難題
    lovelylain
        4
    lovelylain  
       2023-02-08 08:23:00 +08:00 via Android
    k8s 没玩过,很早以前解决了 frp 穿回家里 https 获取真实 ip ,上周解决了 ssh 获取真实 ip 。前者是 frp 开启 proxy_protocol 把 ip 传给 nginx ,nginx 加到 xff 头反代后端 http ;后者是 frp proxy_protocol 把 ip 传给 nginx stream ,nginx 透明代理到 ssh 。udp 应该也一样,要么你改造协议支持 proxy protocol ,要么透明代理。
    tairan2006
        5
    tairan2006  
       2023-02-08 08:42:27 +08:00
    这个要看你前端用的是 ingress 还是云厂商的 LB ,后者一般有 ip 透传的选项,前者需要你自己查配置(不过我之前看好像是不支持 UDP 透传的,不知道现在支持了没)。

    然后,最重要的是,要将 service 的 spec.externalTrafficPolicy 设为 Local ,这样才能保留源 ip 地址。
    nilai
        6
    nilai  
       2023-02-08 08:50:25 +08:00
    其实,在 k8s 的网络插件中,像 flannel calico, 正常情况下是不能够获取客户端的 ip 地址, 但是基于 ebpf 的 cilium 能获取客户端的 ip, 在 node 内部不会经过类似 SNAT 的操作, 你可以试试 cilium ,应该是程序直接就能获取的, 如果是 http 的, 也不需要用什么 x-forwarded-for 来携带客户端的 ip 地址了, 现在 calico 也支持 ebfp 模式了, 不过我尝试过好几次,calico 的 ebpf 都没有安装成功。
    dong706
        7
    dong706  
    OP
       2023-02-08 09:30:32 +08:00
    @tairan2006 前端没有云厂商相关的东西,service 的 spec.externalTrafficPolicy 已经设为 Local 了 。
    GeruzoniAnsasu
        8
    GeruzoniAnsasu  
       2023-02-08 09:33:06 +08:00   ❤️ 1
    @Yien 提醒一下,chatGPT 刚发布的那时候,三个月前,站里有不少人因为 spam chatGPT 的回复被降权或封号


    ------



    一句话来说,nginx ingress 无法满足你的需求,你需要一个支持透明代理的负载前端。 不过说实话我也不清楚能怎么做到,OP 的问题实在太宽泛了,连 kube proxy 的实现模式都没说。 如果采用 iptables ,你至少是可以手动配置透明代理的规则把包转发到 POD 里去的
    sujin190
        9
    sujin190  
       2023-02-08 09:58:14 +08:00
    @dong706 #7 只有 proxyMode 为 iptables 的 NodePort 支持 externalTrafficPolicy 为 Local 会保留源地址吧,如果是 LoadBalance ,那么就要看各自云厂商自己怎么实现了,其他的 proxyMode 也要看具体云厂商的实现吧
    jitongxi
        10
    jitongxi  
       2023-02-08 12:37:14 +08:00
    k8s 基本就跟 udp 绝缘了
    FabricPath
        11
    FabricPath  
       2023-02-08 19:14:10 +08:00
    UOA (对应 TCP 的 TOA ),既要 real server (的 host 的 kernel )支持,又要 lb 支持,所以在网络层去获取源 IP 吧。
    FabricPath
        12
    FabricPath  
       2023-02-08 19:14:29 +08:00
    @FabricPath 所以放弃在网络层去获取源 IP 吧
    holinhot
        13
    holinhot  
       2023-02-09 03:30:06 +08:00
    别说 UDP ,就连 TCP 也不的。都得在业务层上传递 IP 了。链路层传递不了 IP
    bingfengfeifei
        14
    bingfengfeifei  
       282 天前
    我之前是这样做的,TCP UDP 都可以让 POD 内的东西无感获取到真实的源 IP ,但是有点破坏原生的 K8S Service 结构。
    你的需求和我的原始需求有点区别,正常情况下网络插件是可以将 IP 透传到 POD 中的啊,iptables DNAT 转发不改变源 IP 。

    我说下我的做法吧,最开始我是用 NodePort 暴露服务的,这种情况下只能改成宿主机网络的 Gateway 了。
    我写了一个部署在 Host Network 模式的 Gateway ,暴露宿主机端口并且绑定到一个 POD Service 地址。
    将每个连接代理的时候添加 PROXY Protocol Header 添加源 IP 的信息。
    然后将 POD 中注入一个 Sidecar 做透明代理和流量卸载,借鉴下面这个项目。
    https://github.com/path-network/go-mmproxy

    这样 POD 的 Sidecar 拦截流量,并且解析 Proxy Protocol Header 知道原始 IP 地址,并且使用 IP Transparent 方式和策略路由拦截 localhost 流量组合的方式欺骗 POD 服务,将真正地址透传给他,并且拦截回包改写为真正地址。

    这个有点类似于 istio 的透明代理的实现。

    另外我的需求和你不太一样,我是要支持宿主机的策略路由,不得已必须使用宿主机网络监听,从而不得已解决这个源 IP 透传问题。 在我使用宿主机网络之前,我直接使用 K8S 的网络 POD 都是可以获取真实源 IP 的啊,你要不先调下 Service 的选项试试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   967 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:22 · PVG 04:22 · LAX 13:22 · JFK 16:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.