在 Kubernetes 内取得使用者 IP – HTTP Loadbalancer

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 对于提供 HTTP 服务的系统来说,取得来源 IP 方式有两种: 利用包头取得来源 IP此方案是直接读取封包的来源 IP,但由于容器和外界沟通不像传统 Linux 主机有实体网卡对接,而是通过一系列的 NAT 规则置换包头后才传进容器内 (Understand container communication),导致取得错误的使用者 IP。

对于提供 HTTP 服务的系统来说,取得来源 IP 方式有两种:

  • 利用包头取得来源 IP

此方案是直接读取封包的来源 IP,但由于容器和外界沟通不像传统 Linux 主机有实体网卡对接,而是通过一系列的 NAT 规则置换包头后才传进容器内 (Understand container communication),导致取得错误的使用者 IP。


此方案则是利用 PROXY Protocol,此方案是让 Proxy Server 将 IP 附加在 HTTP 标头 X-Forwarded-For 内,因此该标头内的第一个地址即是用户的真实 IP。

X-Forwarded-For:[61.219.125.41, 10.140.0.2]

下面会介绍在 GKE (Google Container Engine) 上透过 L7 HTTP Load Balancer 取得使用者真实 IP。

架构说明

下图为目前 Google 支持三种 LB

在 GKE 上新增 spec.type=LoadBalancer 的 Service,Kubernetes 会协助建立一组拥有独立 IP 地址的 L4 TCP Load Balancer,因此无法支持 L7 应用层的 PROXY Protocol。

为此我们必须建立 Layer 7 的 HTTP Load Balancer,将其先连接到 NGINX instance group 再导向后方的 Kubernetes 集群内。由于 HTTP 请求会先经过 NGINX reverse proxy,此时用户 IP 会被纪录在 X-Forwarded-For 内。

在 GCP 上建立 HTTP Load Balancer 的方式请参考 Setting Up HTTP(S) Load Balancing

下面附上 NGINX 配置文件以及应用端取得 IP 的程序。

NGINX 设定

## /etc/nginx/nginx.conf

worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    keepalive_timeout  65;

    gzip  on;
    client_max_body_size 5M;
    include /etc/nginx/conf.d/*.conf;

    #additional config
    include /etc/nginx/extra-conf.d/*;
}
## /etc/nginx/conf.d/realip.conf

upstream realip {
  server server <k8s service LB ip>;
}

server {
  server_name _;
  listen 80;

  location / {
    proxy_set_header           Host $host;
    proxy_set_header           X-Real-IP $remote_addr;
    proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header           X-Forwarded-Proto $scheme;
    proxy_pass                 http://realip;
    proxy_connect_timeout      10;
    proxy_send_timeout         10;
    proxy_read_timeout         10;
    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;
    access_log on;
  }
}

应用端

package main

import (
    "fmt"
    "net/http"
    "os"

    "github.com/tomasen/realip"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        host := os.Getenv("HOSTNAME")
        reply := fmt.Sprintf("Hostname:\n%s\n\nUser-Agent:\n%v\n\nHeader:\n%v\n\nIP:\n%v", host, r.UserAgent(), r.Header, realip.RealIP(r))
        w.WriteHeader(http.StatusOK)
        w.Write([]byte(reply))
    })
    http.ListenAndServe(":80", nil)
}

本文转自kubernetes中文社区-在 Kubernetes 内取得使用者 IP – HTTP Loadbalancer

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5月前
|
安全 网络协议 网络安全
IP代理的三大协议:HTTP、HTTPS与SOCKS5的区别
**HTTP代理**适用于基本网页浏览,简单但不安全;**HTTPS代理**提供加密,适合保护隐私;**SOCKS5代理**灵活强大,支持TCP/UDP及认证,适用于绕过限制。选择代理协议应考虑安全、效率及匿名需求。
|
4月前
|
数据采集 缓存 安全
2024年最佳http 代理 IP选择及其价格分析
2024年,多家服务商如快代理、123Proxy、巨量代理、IPIDEA等提供不同类型的代理IP,以满足数据采集、跨境电商等多种需求。
2024年最佳http 代理 IP选择及其价格分析
|
3月前
|
机器学习/深度学习 Ubuntu Linux
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000个包,并且保存到1.cap文件中?
|
2月前
|
网络协议
网络协议概览:HTTP、UDP、TCP与IP
理解这些基本的网络协议对于任何网络专业人员都是至关重要的,它们不仅是网络通信的基础,也是构建更复杂网络服务和应用的基石。网络技术的不断发展可能会带来新的协议和标准,但这些基本协议的核心概念和原理将继续是理解和创新网络技术的关键。
152 0
|
4月前
|
Kubernetes 负载均衡 安全
如何为Azure Kubernetes Services启用Internal Loadbalancer
执行上述步骤,您就可以搭建一个仅在Azure虚拟网络内部可用的内部负载均衡器了。这为内部服务通信提供了安全性,避免了外部世界的直接接入。与外部负载均衡器相比,内部负载均衡器通常用于企业内部或多层应用架构中的后端服务。通过仔细配置和管理AKS中的Service对象,您可以确保应用架构符合网络和安全性要求。
46 2
|
3月前
|
Kubernetes 网络协议 调度
在K8S中,flannel可以固定节点IP和Pod的IP地址吗?
在K8S中,flannel可以固定节点IP和Pod的IP地址吗?
|
4月前
|
缓存 网络协议 网络性能优化
网络协议详解:TCP/IP与HTTP
【7月更文挑战第24天】TCP/IP协议和HTTP协议是现代互联网通信的重要基石。TCP/IP协议提供了计算机之间数据传输和通信的底层支持,而HTTP协议则在此基础上实现了超文本数据的传输。随着互联网的不断发展,TCP/IP协议和HTTP协议将继续发挥重要作用,为各种网络应用提供稳定、高效的通信服务。
|
3月前
|
存储 Kubernetes 数据安全/隐私保护
在K8S中,如果后端nfs存储的ip发生变化如何解决?
在K8S中,如果后端nfs存储的ip发生变化如何解决?
|
3月前
|
Kubernetes Perl 容器
在K8S中,flannel能固定节点IP和Pod的IP地址吗?
在K8S中,flannel能固定节点IP和Pod的IP地址吗?
|
5月前
|
数据采集
http代理IP能开展哪些应用?
在互联网时代,HTTP代理IP广泛应用于营销推广、排名优化和数据采集。对于营销,它帮助企业在社交媒体上切换IP以确保推广活动顺利进行;在排名优化中,代理IP避免了因同一IP多账号操作导致的账号暂停,提升企业产品曝光;在数据采集时,通过不断切换IP,提高数据抓取效率,确保任务的高效执行。
38 2
http代理IP能开展哪些应用?