NAT 伪装拒绝在本地链路网络上工作

NAT 伪装拒绝在本地链路网络上工作

我正在开发一种设备,就使用和网络连接而言,它类似于带有以太网端口的打印机。此设备还应在 p2p 场景中工作,即在没有 DHCP 服务器的情况下,当设备的以太网端口直接连接到笔记本电脑的以太网端口时。在这种情况下,两个设备都会在169.254.x.x地址范围内获得一个 Link-Local 地址。到目前为止,一切顺利,一切正常。

我的设备具有一个稍微复杂的内部以太网拓扑,其中有多个不同的电路板,它们在一个小型内部网络中都有自己的 IP 地址。但这些都与设备用户无关 - 用户只能看到并与一个 IP 地址通信。这是使用 NAT 和伪装完成的。该设备有一个带有一个外部 IP 地址的单一入口点,并且有端口转发以服务于不同的电路板和功能。这似乎也作为一个概念运行良好。

现在问题来了:NAT 伪装拒绝使用链路本地 IP 地址。它无法按照我在此接口上指示的方式正确重写源地址(相反,它只会采用它在其他以太网接口,通常是内部接口,这是极其不可取的)。我现在认为我已经将它追踪到了所谓scope的地址:http://linux-ip.net/html/tools-ip-address.html#tb-tools-ip-addr-scope。这scope肯定是global,否则 NAT 伪装似乎会忽略它。我不太清楚这种行为从何而来,所以我想了解更多相关信息。

  • 我如何强制 NAT 伪装忽略这种不必要的scope过滤?我正在使用,firewalld但也可以直接使用iptables。两者都会出现此问题。

  • 或者,即使我使用的是 Link-Local 地址,我该如何配置它scope?我在该接口上使用设置为的网络管理器,并且我需要 NAT 伪装才能可靠地工作。globalipv4.methodlink-local

附加信息:

看起来从设备外部发起的 TCP 连接被正确地进行了 NAT。从设备发送的数据包的源地址实际上被重写为设备的外部 IP。当从设备内部发送 UDP 数据包或向用户计算机建立新的 TCP 套接字时,就会发生问题。然后,这些数据包的源地址不是正确进行 NAT 并且插入来自另一个接口的其他地址。

答案1

我找到了一种使用网络管理器解决此问题的方法。link不幸的是,范围硬编码在网络管理器中添加以下代码行,每当添加 IPv4 地址时都会自动选择范围:

https://github.com/NetworkManager/NetworkManager/blob/d07383d3f36054ea243a86988383b4113a0e6b6e/src/libnm-platform/nm-linux-platform.c#LL9745C48-L9745C48

基本逻辑是:如果 IPv4 地址为127.x.x.x,则范围为RT_SCOPE_HOST,否则如果地址为169.254.x.x,则范围为RT_SCOPE_LINK,在所有其他情况下,其范围为RT_SCOPE_UNIVERSE(范围为global)。它强制地址的范围,无法对其进行配置。

因此,我认为除了在编译 Network Manager 之前修改此代码之外,没有其他解决方案。基本上,我将上面链接的行更改为从不使用范围link,这解决了我在链接本地地址上的 NAT 问题,因为它们现在有了global范围。

我对这个解决方案不是完全满意,但它确实有效。

相关内容