在 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=0NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=trueStandardOutput=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 工作负载继续访问这些服务,为改造争取时间窗口