我有一台配置为路由器的 Ubuntu 笔记本电脑。拓扑如下所示:
internet <---> laptop router <---> raspberry pi 3
笔记本电脑中启用了 NAT 以将数据包从树莓派 3 转发到互联网,也从互联网转发回树莓派 3。除 TFTP 外,一切正常。
每次我想从 TFTP 服务器获取文件时,都会因超时而失败。并且在笔记本电脑上抓包后,就找到了根本原因。
NAT 使用 dest IP 和 dest 端口作为标志,在回复返回时将帧转发回 pi 3。但是在 TFTP 的情况下,TFTP 请求使用 IP 和 dest 端口 69 发送,但 TFTP 服务器以相同的 IP 但不同的随机端口回复请求。所以这让 NAT 感到困惑,不知道该把回复消息转发到哪里。最后,它以错误目的地无法到达的方式回复 TFTP 服务器。
虽然我知道原因,但不知道如何解决这个问题。谁能帮我?谢谢!
您需要标记数据包以使用特定于 TFTP 的 NAT 模块:
使用 nft:
您需要为 tftp 协议手动加载 nat 助手。对于 nftables 它被称为
nf_nat_tftp
,对于 iptables 你必须自己检查它(我没有现成的它们,它可能是同一个模块)。