一个疯狂的问题,但无论如何都要发现没有DHCP的默认网关?
这适用于网络上的设备,该设备不使用尚未具有IP地址的DHCP.我在想是否可以发现默认网关,然后我可以尝试猜测一个未使用的IP地址然后在网络上广播,看它是否被使用.
我理解我可能会遇到麻烦.例如,如果已经有一台具有静态IP并且已关闭的计算机.
数据包嗅探一段时间,然后应用启发式.我假设IPv4和以太网用于其余部分.如果使用以太网交换机而不是HUB,这将无法正常工作.最后还有更多内容.
根据您看到的以太网(或其他)和IP头以及实际的ARP数据包(忽略广播和多播IP和MAC地址)创建您自己的RARP(反向地址解析)表.确保您的表能够将多个IP地址映射到单个硬件接口.表中由实际ARP数据包输入或验证的任何IP地址都应标记为这样.
网关很可能会收到并发送更多流量.此流量可能具有来自许多不同网络的许多IP地址,但具有相同的硬件地址.网关将在您的表中显示为一个具有大量IP地址的MAC地址.您可能会观察到涉及此MAC地址的ARP事务,因此您可以查找一个IP地址,该IP地址将该MAC seen in ARP packet设置为别名.这几乎可以肯定是网关的IP地址.
您可能会根据网关的IP地址猜测网络地址和子网掩码,但这可能不是您可以信任的.如果您想尝试在具有非标准网络掩码的网络上进行此操作,可以尝试执行以下操作.制作两个IP地址大小的累加器变量:
uint32_t acc_and = 0xFFffFFff;
uint32_t acc_or = 0x00000000;
Run Code Online (Sandbox Code Playgroud)
然后为您表中的每个ARP验证地址执行此操作
acc_and &= ip_addr;
acc_or |= ip_addr;
Run Code Online (Sandbox Code Playgroud)
您也可以在来自网关的数据包中使用目标IP地址(非多播),但您必须先了解网关,然后才能标记它们.
地址的网络部分应该在两者中保持相同(在第一次操作之后),但是在acc_and底部位应该开始清除,而在acc_or底部位应该开始填满.有了足够的样本,您就可以通过以下方式确定网络地址:
uint32_t net_addr = acc_and & acc_or;
Run Code Online (Sandbox Code Playgroud)
和网络掩码:
uint32_t net_mask = acc_and ^ acc_or;
Run Code Online (Sandbox Code Playgroud)
获取足够的采样本地IP地址可能需要很长时间,因此您可以开始尝试通过以下方式缩小范围:
uint32_t almost_net_mask = acc_and ^ acc_or;
int i = 0;
while ( 1 & almost_net_mask ) {
i++;
almost_net_mask >>= 1;
}
uint32_t net_mask = 0xFFffFFff;
while( i-- ) {
net_mask <<=1;
}
Run Code Online (Sandbox Code Playgroud)
这会找到你最后的1位设置.最低的0位显然不是地址的本地部分的一部分.或者你可以得到相同i的:
i = ffs( ~ ( acc_and ^ acc_or ) ) ; // assuming that int on your system is 32 bit. if not use ffsl
Run Code Online (Sandbox Code Playgroud)
如果你真的想确定你的网络掩码和网络地址,你现在可以尝试其他一些东西.您可以尝试查看网关是否会尝试将您发送的数据包转发到您认为应该是本地地址的数据包.为此,必须继续为自己分配一个IP地址,如果您的网络掩码不正确,这将有风险.
尝试选择您没有看到流量的最低合法IP地址,以增加其不在范围之外的机会.您可以欺骗该地址的ARP请求并查找任何回复(您可以使用自己的真实MAC地址但可能为此构成IP.不一定是您的IP,这可能会让事情稍微混淆) .找到IP地址后,您无法为自己声明ARP.
您可能最终得到的IP地址实际上太高了.这很难确定,因为你的网络掩码仍然是一个很好的猜测.如果是这样的话你就不走运了,因为你没有空闲的生活空间.
要查看您的网络掩码是否需要调整,请尝试发送目标地址的IP数据包,这些目标地址是您在本地网络中看不到的,但可能是基于您在网络掩码和网络地址上的猜测而在本地网络中.如果这些猜测都没有,那么它们应该有太多的位分配给网络地址,因此发送到地址会改变(到目前为止)最佳猜测网络地址的网络掩蔽部分的低位是您想要的.您可以尝试通过ARPing IP地址发送这些,并查看是否有人回复,但由于您猜测地址并且可能会错过,因此尝试创建目标MAC地址设置为的数据包可能会更好查看它是否会转发它的网关.它可能配置为不,所以你可以试着看看它是否会首先为你已经在网络中观察过的网络成员做这个,然后看看它是否会为你转发它.如果网关转发数据包,那么你可以依靠网络掩码的想法来缩小你对网络掩码的看法.如果网关不转发目的地为本地网络的已知成员的数据包,那么您可以继续使用您对本地网络掩码和网络的想法,直到您有理由调整它或发送该范围内的地址的ARP请求(这只会回答你的问题,因为"是"或"可能",不可能确定"不".如果网关转发数据包,那么你可以依靠网络掩码的想法来缩小你对网络掩码的看法.如果网关不转发目的地为本地网络的已知成员的数据包,那么您可以继续使用您对本地网络掩码和网络的想法,直到您有理由调整它或发送该范围内的地址的ARP请求(这只会回答你的问题,因为"是"或"可能",不可能确定"不".如果网关转发数据包,那么你可以依靠网络掩码的想法来缩小你对网络掩码的看法.如果网关不转发目的地为本地网络的已知成员的数据包,那么您可以继续使用您对本地网络掩码和网络的想法,直到您有理由调整它或发送该范围内的地址的ARP请求(这只会回答你的问题,因为"是"或"可能",不可能确定"不".
如果您使用的是以太网交换机,那么事情变得更加困难,因为如果交换机知道帧应该转到其他地方,那么交换机不会将以太网帧转发给您,因此您将看不到它们.它会转发许多ARP请求,因为它们是广播的,除非发送方在其ARP缓存中仍然有该IP的条目,并且只是尝试提前更新该条目(这可能不是由所有系统完成).这将使您对网络及其成员的构想变得更加困难,但您可能能够做得体.但是,您可能不得不依赖于网关的ARP请求数量,以及来自高于其他系统的网关来发现它的数量.这很容易出错,因为文件服务器可能有类似的流量.