无法从 Kubernetes 集群内公开 TFTP 服务

问题描述 投票:0回答:2

我正在使用 Rancher 的 nginx 入口控制器,

rancher/nginx-ingress-controller:0.21.0-rancher3
,它应该基于 https://github.com/kubernetes/ingress-nginx AFAIK。

我的 udp 服务配置为:

apiVersion: v1
kind: ConfigMap
metadata:
  name: udp-services
  namespace: ingress-nginx
data:
  69: "default/tftp:69"
  8881: "default/test:8881"

nc -l -u -p 8881
上运行
default/test
可以与集群外客户端正常通信。这应该意味着 udp 代理可以工作,至少在某些情况下是这样。然而 tftp 请求始终超时。

粗略地说,TFTP 读取的工作方式应如下

客户端端口 A => 服务器端口 69(请求)

    服务器端口 B => 客户端端口 A(发送数据,注意它是
  1. 端口 B)
  2. 客户端端口 A => 服务器端口 B(确认)
  3. default/tftp
在 tftp 服务器上运行显示通信如下:

主机端口A => 服务器端口69(请求文件)

    服务器端口B => 主机端口A(将数据发送回端口A)
  1. 主机=>服务器,ICMP端口不可达(但端口A不可达)
  2. 同时,入口记录类似以下内容:
tcpdump

来自另一个集群内容器的 TFTP 请求工作得很好。这应该意味着 TFTP 服务器本身并不是问题的直接根源。问题是入口控制器如何处理请求。

我发现

tftpd

有一个

TIMESTAMP [error] ... upstream timed out (110: Connection timed out) while proxying connection, udp client: ::1, server: [::]:69, upstream: "...:69", bytes from/to client:..., bytes from/to upstream:... 参数,可以固定 tftpd 可以使用哪些端口来响应。我尝试将其固定到端口 8881 (--port-range

),但请求仍然被丢弃。
我的猜测是入口不会将数据包重定向回客户端,因为回复不是来自端口 69,而是来自端口 B。

有人成功在 Kubernetes 集群中公开 TFTP 服务吗?

这不是 100% 的解决方案,但我找到了完全相同的解决方法。问题在于 tftp 创建了主机状态表中未知的新出站 UDP 连接。因此,它将其视为传出请求而不是回复。我还要指出,TFTP 客户端应用程序可以很好地处理此问题,但 PXE 驱动程序(至少是英特尔驱动程序)则不能。
kubernetes kubernetes-ingress
2个回答
2
投票
如果您使用 Calico 作为 CNI,您可以在 IPPool 上禁用“natOutgoing”。如果您需要 NAT,您可以创建第二个不带 NAT 的 IPPool。

https://docs.projectcalico.org/networking/assign-ip-addresses-topology#features

我默认禁用它 --port-range 8881:8881

我确信其他 CNI 插件可能有类似的解决方法 

您需要在 k8s 节点上的传入流量上设置 tftp 帮助程序

0
投票

calicoctl get ippool -oyaml | sed 's/natOutgoing: true/natOutgoing: false/g' | calicoctl apply -f -

© www.soinside.com 2019 - 2024. All rights reserved.