【Kubernetes】纯 IPv6 K8s 用 socat 打通 IPv4 服务

在 IPv6-only 的 Kubernetes worker 节点上,用 socat 建立一个 systemd 管理的端口代理,把节点 IPv6 地址上的某个端口转发到目标 IPv4 地址和端口,让 Pod 能间接访问只支持 IPv4 的外部服务。一起来看看如何使用吧!

1、前置条件

  • 节点运行纯 IPv6-only Kubernetes,Pod 和 Service 只有 IPv6 地址
  • 节点本身具备出站 IPv4 连通性(通常基础设施是双栈的,但 K8s 层只启用 IPv6)
  • 已知目标服务的 IPv4 地址和端口(如 192.168.40.141:13001)

2、安装 socat

复制代码
# CentOS/RHEL
yum install -y socat

# Debian/Ubuntu
apt install -y socat

# 验证
socat -V

3、手动测试转发是否可用

复制代码
# 在创建 systemd 服务前,先手动运行命令验证连通性
socat TCP6-LISTEN:13001,fork,reuseaddr TCP4:192.168.40.141:13001

# 参数说明
## TCP6-LISTEN:13001:在节点所有 IPv6 地址上监听 13001 端口
## fork:每个新连接派生独立子进程,支持并发
## reuseaddr:允许快速重启复用端口,避免 TIME_WAIT 报错
## TCP4:192.168.40.141:13001:目标 IPv4 地址和端口


# 保持运行,在另一个终端测试,在集群内任意 Pod 中
curl -v http://[节点IPv6地址]:13001

4、创建 systemd 服务单元

  • 创建文件 /etc/systemd/system/nat64-proxy-13001.service

    [Unit]
    Description=NAT64 Proxy IPv6:13001 → IPv4:192.168.40.141:13001
    After=network-online.target
    Wants=network-online.target

    [Service]
    Type=simple
    ExecStart=/usr/bin/socat TCP6-LISTEN:13001,fork,reuseaddr TCP4:192.168.40.141:13001
    Restart=always
    RestartSec=3
    StartLimitInterval=0

    NoNewPrivileges=true
    ProtectSystem=strict
    ProtectHome=true
    PrivateTmp=true

    StandardOutput=journal
    StandardError=journal
    SyslogIdentifier=nat64-proxy-13001

    [Install]
    WantedBy=multi-user.target

    关键配置解释

    After=network-online.target + Wants=:确保网络完全就绪后再启动

    Restart=always + RestartSec=3:崩溃后 3 秒自动重启,保证可用性

    StartLimitInterval=0:禁用启动频率限制,避免频繁重启被 systemd 阻止

    安全加固项(NoNewPrivileges 等):以最小权限运行,不影响功能

5、启用并启动服务

复制代码
systemctl daemon-reload
systemctl enable --now nat64-proxy-13001.service
systemctl status nat64-proxy-13001.service

6、Pod 中如何使用

复制代码
# 在 IPv6-only Pod 中,直接访问节点的 IPv6 地址和代理端口

# 获取目标节点 IPv6 地址
kubectl get nodes -o wide

# 在 Pod 内
curl http://[fd00::node-ip]:13001

7、局限性

  • **目标地址硬编码:**每个目标需要单独创建一个 systemd 单元,无法像完整 NAT64 那样动态映射
  • **无 DNS64 支持:**只适用于 Pod 中已经拿到 IPv4 地址的场景,不解决域名解析问题
  • 用户态性能: 高并发下 socat 的吞吐和连接数不如内核态/eBPF NAT64 方案,适合辅助通道而非主流量路径

8、使用场景

  • **IPv6-only 集群访问外部 IPv4 数据库/API:**集群完成 IPv6 化改造后,仍有外部依赖(如遗留数据库、第三方 API)只提供 IPv4 入口。为每个关键目标创建一个 socat 代理,是成本最低的过渡方案。相比部署完整的 NAT64 网关(DaemonSet + eBPF + DNS64),socat 方案不需要改动集群网络架构,一个 systemd 单元对应一个目标
  • **CI/CD 和本地测试环境:**在 k8s/k3s 搭建的 IPv6-only 测试集群中,拉取 IPv4 容器镜像或访问 IPv4 的 Git 服务时,节点级 socat 代理比配置整套 NAT64 网关轻量得多。Kubernetes SIGs 的 nat64 项目本身也提到,其设计目标之一就是适配 GitHub Actions 等只有 IPv4 的 CI 环境。
  • **迁移过渡期的临时兼容:**从 IPv4 向 IPv6 迁移期间,部分服务尚未完成双栈改造。socat 代理可作为"急救通道",让 IPv6-only 工作负载继续访问这些服务,为改造争取时间窗口
相关推荐
CCblandy3 小时前
HTTP 长连接 3 类故障实测:[WinError 10053]、99 个 TIME_WAIT、69 次多余握手,4 种对策怎么选
后端·python·网络协议·http·云原生·性能优化·架构
阿里云云原生4 小时前
阿里云 AgentCore 产品负责人解读产品全景
云原生·agent
阿里云云原生4 小时前
告别手动补索引:SLS 支持索引自动发现,让数据开箱即用、自由分析
云原生
阿里云云原生5 小时前
从 HTTP 200 到第一个有效输出:AI SSE 拨测如何量化流式体验
云原生
分布式存储与RustFS5 小时前
rclone 与 mc mirror:S3 对象存储同步,限速、过滤、断点续传实测对比
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
阿里云云原生6 小时前
Kitta:Code Review Agent,提升代码审查质量
云原生
灯澜忆梦7 小时前
【docker】#4 | Docker 自定义镜像与 Dockerfile
运维·docker·容器
吴声子夜歌9 小时前
Docker入门与实战——实战案例(编程开发)(一)
运维·docker·容器