我有一个仅以太网的网络。我不知道某些设备使用的 IP 和子网,所以我无法设置我的计算机来连接到这些设备。我使用过 masscan 等工具通过 ARP 创建网络地图,但这需要很长时间(即使通过以太网将设备直接连接在一起)。
是否有可能创建 IP 路由来获取本地网络中的所有数据包而无需更改 IP 地址和子网?
我在想这样的事情:
# Enable packets forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# Set local IP
ifconfig eth0 192.168.1.0 netmask 255.255.255.0
# Add IP routes for each subnet
ip route add 0.0.1.0/24 via 192.168.1.0
ip route add 0.0.2.0/24 via 192.168.1.0
...
ip route add 10.0.1.0/24 via 192.168.1.0
ip route add 10.0.2.0/24 via 192.168.1.0
...
ip route add 192.168.1.0/24 via 192.168.1.0
...
ip route add 255.255.255.0/24 via 192.168.1.0
这样可行吗,或者我完全误解了它的工作方式?
答案1
是否有可能创建 IP 路由来获取本地网络中的所有数据包而无需更改 IP 地址和子网?
不,路线不会帮助你得到所有数据包。它们只会帮助你发送数据包,但对接收数据包没有影响。更一般地,声称自己是“路由器”(ip_forward=1)不会自动吸引数据包到您无论子网配置如何。
路由器只接收数据包,因为主机专门配置了它——它不会清除所有数据包,但仍会接收仅有的那些有路由器的 MAC 地址因为主机专门将这些数据包发送到路由器的 MAC 地址。
(在大多数现代以太网上,MAC 帧都是交换的 - 它们不再对所有主机可见,而仅传送到具有指定目标 MAC 地址的一个设备。因此,如果所讨论的 ModBus 服务器具有类似“默认通过 192.168.7.1”的路由,它将查找 192.168.7.1 的 MAC 地址,并且只会将内容发送到那里。)
如果你是已经在您的网络接口上接收数据包,您不需要任何此配置 - 您只需在 tcpdump 中查看它们即可。您很可能不是接收数据包,因此您这边的路由无法对不存在的数据包执行任何操作。
简而言之,不,它根本不起作用。
附注:
在 Linux 上配置“本地”或“接口”路由时,首选的编写方式是
10.0.1.0/24 dev eth0
,不是10.0.1.0/24 via <my_own_ip>
。后者可能仍然有效,但对于 Linux 配置来说相当陌生(我相信它是一种古老的 BSD 主义)。子网不一定是 /24。例如,如果您想要覆盖整个 10.0.0.0/8,那么您可以将整个 /8 作为一个子网,而不是枚举所有 65536 个可能的 /24。如果您想要覆盖所有可能的地址,那么您可以只使用 /0 路由(即“默认路由”)。
唯一的实际区别是积极的——中间的所有“10.xx0”和“10.xx255”地址现在都是 /8 中间完全有效的主机地址,而不是 /24 的保留部分。(无论如何,这仅适用于“直接”子网路由。网关或“通过”路由没有任何保留。)
由于各种原因,许多大块地址无法使用,因此无需列出,因为您的设备不可能使用它们。例如,0.0.0.0/8 因历史原因而被保留;224.0.0.0/4 用于多播,不能用于普通子网;而整个 240.0.0.0/4(即一直到 255.255.255.255!)是几乎保留,世界上可能只有 2-3 个网络使用它。