<p>我在一个TFTP服务器上碰到这个。我的服务器有两个IP地址面对同一个网络。因为UDP是无连接的,在这种情况下,可能会出现IP地址没有按预期设置的问题。我的顺序是:</p>
<ol>
<li>客户机在特定的IP地址发送初始数据包</li>
<li>服务器从传入的数据包中读取客户端的源地址,并发送一个响应。
<ol>
<li>然而,在响应中,服务器的“源地址”是根据路由表设置的,它被设置为<strong>其他</strong>IP地址。在</li>
<li>无法控制服务器的“源”IP地址,因为操作系统没有告诉我们请求通过哪个IP地址。在</li>
</ol></li>
<li>客户机从“其他”IP地址获得响应,并拒绝它。在</li>
</ol>
<p>在我的例子中,解决方案是专门将TFTP服务器绑定到我想要监听的IP地址,而不是绑定到所有接口。在</p>
<p>我发现了一些可能与<a href="http://man.cx/tftpd%288%29" rel="nofollow noreferrer">Linux man page for <strong>^{<cd1>}</strong></a>(TFTP服务器)相关的文本。这里是:</p>
<pre><code> Unfortunately, on multi-homed systems, it is impossible for tftpd to
determine the address on which a packet was received. As a result, tftpd
uses two different mechanisms to guess the best source address to use for
replies. If the socket that inetd(8) passed to tftpd is bound to a par‐
ticular address, tftpd uses that address for replies. Otherwise, tftpd
uses ‘‘UDP connect’’ to let the kernel choose the reply address based on
the destination of the replies and the routing tables. This means that
most setups will work transparently, while in cases where the reply
address must be fixed, the virtual hosting feature of inetd(8) can be
used to ensure that replies go out from the correct address. These con‐
siderations are important, because most tftp clients will reject reply
packets that appear to come from an unexpected address.
</code></pre>
<p>请参阅<a href="https://stackoverflow.com/a/3929208/60075">this answer</a>,这表明在Linux上,<em>可以读取传入UDP数据包的本地地址,并为传出数据包设置本地地址。在C语言中是可能的;但是我不确定Python。在</p>