将发往 127.0.0.1/8 地址的数据包发送到 Ubuntu 上的网络

将发往 127.0.0.1/8 地址的数据包发送到 Ubuntu 上的网络

我想测试网络基础设施如何应对不合规数据包。我很好奇的测试之一是网络基础设施在收到127.0.0.1/8来自另一台主机的数据包时会如何反应。

为了做到这一点,我必须让 Ubuntu 将此子网上某个地址的数据包转发到网络网关,但我不确定如何做到这一点。要清楚的是,我并不是想将所有数据包发送到子网127.0.0.1/8到网关,而是发送到特定的非 IP127.0.0.1和非127.0.0.53IP,以免破坏任何东西。

我想过按照以下方法将该子网上的地址“映射”到网关 IP:https://serverfault.com/q/692415但这会在数据包离开主机之前改变其目标头。

有什么方法可以在 Ubuntu 中实现我想要的功能吗?是否需要修改内核?或者,在其他操作系统上是否更容易实现?

答案1

我可能给了你足够的绳索让你自寻死路。 sysconfig 参数route_localnet控制 127.0.0.0/8 的路由限制,并且仅应用于可能涉及 NAT 或负载平衡的某些特定设置。

route_localnet- 布尔值

路由时不将环回地址视为火星源或目标。这允许将 127/8 用于本地路由目的。默认为 FALSE

例如:对于设置了 192.0.2.2/24 的系统eth0并尝试使用源 127.0.0.44 到达 192.0.2.3,路由堆栈默认禁止此操作:

# ip route get from 127.0.0.44 192.0.2.3
RTNETLINK answers: Invalid argument

一旦设定:

# sysctl -w net.ipv4.conf.eth0.route_localnet=1
net.ipv4.conf.eth0.route_localnet = 1
# ip route get from 127.0.0.44 192.0.2.3
192.0.2.3 from 127.0.0.44 dev eth0 uid 0
    cache 

$ echo test | socat udp:192.0.2.3:4444,bind=127.0.0.44 - 

ARP 请求仍应由 192.0.2.2 完成,但无论如何都会出现麻烦(除非您在另一端采用相同的设置)。

要使真正的路由正常工作,您仍然需要在两侧设置显式路由,因为仍然有本地路由使得系统认为 127.0.0.0/8 全部属于自己:

在另一个系统 192.0.2.3 上(也称 Linux),由于 martian,该路由将被忽略,因此也放宽这一点:

# sysctl -w net.ipv4.conf.eth0.route_localnet=1

但仍然:

# ip route get from 127.0.0.44 iif eth0 192.0.2.3
RTNETLINK answers: Invalid argument

因为是本地路线。

因此,此外,在另一个系统(192.0.2.3)上添加:

# ip route add 127.0.0.44/32 dev eth0

这使:

# ip route get from 127.0.0.44 iif eth0 192.0.2.3
local 192.0.2.3 from 127.0.0.44 dev lo 
    cache <local> iif eth0 

现在它将能够使用 127.0.0.44 接收和发送数据包

如果你想两个都系统使用 127.0.0.0/8 中的地址,原始系统也应使用相同类型的设置。当然它们应该使用不同的 IP 地址。

相关内容