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

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

  •  
  •   dong706 Feb 7, 2023 3575 views
    This topic created in 1196 days ago, the information mentioned may be changed or developed.

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

    14 replies    2023-06-20 23:38:43 +08:00
    Yien
        1
    Yien  
       Feb 7, 2023
    不懂 k8s ,刚好在玩 GPT ,一下是它的答案

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

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

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

    总的来说,选择哪种方法要根据你的需求和系统架构来决定。
    renothing
        2
    renothing  
       Feb 8, 2023
    需要你的服务端改造下,支持 proxy protocol 这样的协议
    https://www.haproxy.com/blog/use-the-proxy-protocol-to-preserve-a-clients-ip-address/
    kennylam777
        3
    kennylam777  
       Feb 8, 2023
    上回都看目吧,都了是 UDP 在答 TCP Protocol ,但 UDP 的是
    lovelylain
        4
    lovelylain  
       Feb 8, 2023 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  
       Feb 8, 2023
    这个要看你前端用的是 ingress 还是云厂商的 LB ,后者一般有 ip 透传的选项,前者需要你自己查配置(不过我之前看好像是不支持 UDP 透传的,不知道现在支持了没)。

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


    ------



    一句话来说,nginx ingress 无法满足你的需求,你需要一个支持透明代理的负载前端。 不过说实话我也不清楚能怎么做到,OP 的问题实在太宽泛了,连 kube proxy 的实现模式都没说。 如果采用 iptables ,你至少是可以手动配置透明代理的规则把包转发到 POD 里去的
    sujin190
        9
    sujin190  
       Feb 8, 2023
    @dong706 #7 只有 proxyMode 为 iptables 的 NodePort 支持 externalTrafficPolicy 为 Local 会保留源地址吧,如果是 LoadBalance ,那么就要看各自云厂商自己怎么实现了,其他的 proxyMode 也要看具体云厂商的实现吧
    jitongxi
        10
    jitongxi  
       Feb 8, 2023
    k8s 基本就跟 udp 绝缘了
    FabricPath
        11
    FabricPath  
       Feb 8, 2023
    UOA (对应 TCP 的 TOA ),既要 real server (的 host 的 kernel )支持,又要 lb 支持,所以在网络层去获取源 IP 吧。
    FabricPath
        12
    FabricPath  
       Feb 8, 2023
    @FabricPath 所以放弃在网络层去获取源 IP 吧
    holinhot
        13
    holinhot  
       Feb 9, 2023
    别说 UDP ,就连 TCP 也不的。都得在业务层上传递 IP 了。链路层传递不了 IP
    bingfengfeifei
        14
    bingfengfeifei  
       Jun 20, 2023
    我之前是这样做的,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 的选项试试
    About     Help     Advertise     Blog     API     FAQ     Solana     2594 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 57ms UTC 15:28 PVG 23:28 LAX 08:28 JFK 11:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86