我想测试网络基础设施如何应对不合规数据包。我很好奇的测试之一是网络基础设施在收到127.0.0.1/8
来自另一台主机的数据包时会如何反应。
为了做到这一点,我必须让 Ubuntu 将此子网上某个地址的数据包转发到网络网关,但我不确定如何做到这一点。要清楚的是,我并不是想将所有数据包发送到子网127.0.0.1/8
到网关,而是发送到特定的非 IP127.0.0.1
和非127.0.0.53
IP,以免破坏任何东西。
我想过按照以下方法将该子网上的地址“映射”到网关 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 地址。