我有一个只有以太网的网络。我不知道某些设备使用的 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
那行得通还是我完全误解了它的工作方式?
不,路由不会帮助您获取所有数据包。它们只帮助你发送数据包,但对接收数据包没有影响。更一般地说,无论任何子网配置如何,声称自己是“路由器”(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 个网络在使用它。