我正在使用Rancher的nginx ingress控制器rancher/nginx-ingress-controller:0.21.0-rancher3
,它应该基于https://github.com/kubernetes/ingress-nginx AFAIK。
我的udp-services配置为:
apiVersion: v1
kind: ConfigMap
metadata:
name: udp-services
namespace: ingress-nginx
data:
69: "default/tftp:69"
8881: "default/test:8881"
字符串
在default/test
上运行nc -l -u -p 8881
可以很好地与集群外的客户端通信。这应该意味着udp转发工作,至少在某些情况下。但是tftp对default/tftp
的请求总是超时。
大致上,TFTP读取应该像below一样工作:
1.客户端端口A =>服务器端口69(请求)
1.服务器端口B =>客户端端口A(发送数据,注意它是一个 * 新 * 端口B)
1.客户端端口A =>服务器端口B(确认)
运行在tftp服务器上的tcpdump
显示通信如下:
1.主机端口A =>服务器端口69(请求文件)
1.服务器端口B =>主机端口A(将数据发送回端口A)
1.主机=>服务器,主机端口不可达(但端口A不可达)
与此同时,ingress会记录如下内容:
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服务?
2条答案
按热度按时间llycmphe1#
这不是一个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插件可能有类似的解决办法
cuxqih212#
你需要在k8s节点上设置传入流量的tftp助手
第一个月