使用iptables记录后端Pod真实IP

在Kubernetes集群中,可以通过修改iptables规则来记录经过Service转发的流量真实来源IP。以下是具体实现方法:

修改kube-proxy配置,确保--proxy-mode=iptables并启用--feature-gates=ProxyTrafficEndpoints=true

在iptables的PREROUTING或INPUT链添加日志规则:

iptables -t raw -I PREROUTING -p tcp -m tcp --dport <服务端口> -j LOG --log-prefix "K8S Traffic: "
iptables -t raw -I PREROUTING -p udp -m udp --dport <服务端口> -j LOG --log-prefix "K8S Traffic: "

查看日志时需要过滤特定标记:

journalctl -k -f | grep "K8S Traffic"

使用ipvs模式记录真实IP

当kube-proxy使用ipvs模式时(--proxy-mode=ipvs),可通过以下方式获取真实客户端IP:

启用ipvs连接追踪:

sysctl -w net.ipv4.vs.conntrack=1

查看连接状态信息:

ipvsadm -ln --stats
ipvsadm -ln --connection

在Pod的应用程序中获取X-Forwarded-For头信息,需要配置Service的externalTrafficPolicy: Local并确保负载均衡器传递原始IP。

网络策略增强方案

结合NetworkPolicy资源定义更精细的访问控制:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: log-traffic
spec:
  podSelector: {}
  ingress:
  - from:
    - podSelector: {}
    ports:
    - protocol: TCP
      port: <端口号>

日志分析优化

对于大规模集群,建议将iptables日志发送到集中式日志系统:

iptables -t raw -I PREROUTING -p tcp -j NFLOG --nflog-group 100 --nflog-prefix "k8s_trace:"

使用ulogd工具收集nflog分组100的日志,并配置日志解析规则提取源IP、目标IP和端口信息。

注意事项

  • 在生产环境启用详细日志可能影响性能,建议按需采样
  • 需要确保节点有足够日志存储空间
  • 在IPVS模式下,原始客户端IP可能被SNAT替换,需要正确配置kube-proxy的--ipvs-exclude-cidrs参数
  • 对于NodePort类型的Service,客户端IP记录取决于externalTrafficPolicy配置
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐