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

时间:2019-04-08 08:39:19

标签: kubernetes kubernetes-ingress

我正在使用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始终要求default/tftp超时。

大致上,TFTP读取应以below的形式工作:

  1. 客户端端口A =>服务器端口69(请求)
  2. 服务器端口B =>客户端端口A(发送数据,请注意这是一个端口B)
  3. 客户端端口A =>服务器端口B(确认)
在tftp服务器上运行的

tcpdump显示通信如下:

  1. 主机端口A =>服务器端口69(请求文件)
  2. 服务器端口B =>主机端口A(将数据发送回端口A)
  3. 主机=>服务器,ICMP端口不可达(但端口A不可达)

与此同时,入口记录如下内容:

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:...
来自另一个集群内容器的

TFTP请求工作正常。这应该意味着TFTP服务器本身不是问题的直接根源。问题是入口控制器如何处理请求。

我发现tftpd有一个--port-range参数可以固定tftpd可以用来响应哪些端口。我试图将其固定到端口8881(--port-range 8881:8881),但请求仍被丢弃。

我的猜测是,入口不会将数据包重定向回客户端,因为答复不是来自端口69,而是来自端口B。

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

1 个答案:

答案 0 :(得分:0)

这不是100%的解决方案,但我发现了完全相同的解决方法。问题在于,tftp创建了主机状态表中未知的新出站UDP连接。因此,它将其视为外发请求而不是答复。我还将注意到,TFTP客户端应用程序可以很好地解决此问题,但是PXE驱动程序(至少是英特尔驱动程序)不能解决问题。

如果将Calico用作CNI,则可以在IPPool上禁用“ natOutgoing”。如果需要NAT,则可以创建另一个不带NAT的IPPool。

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

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

将其禁用为默认设置

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

相关问题