昨天晚上浏览bbs时,发现有位同行提出如何用本机telnet到Dynamips虚拟出来的路由器端口上。之前以为连接是理所当然的,做了试验后才发现,使用物理网卡无法ping通路由器的端口,提示为超时。
 
个人认为这跟Dynamips没有接管OSI第1、2层以及物理网卡对待数据帧的方法有关。使用wireshark抓包后发现,因此从本机发出的icmp数据帧,目标mac地址为虚拟路由器的端口mac地址。而这个数据包是有系统icmp协议直接调用网卡驱动发出的,并没有经过Dynamips。在广播域上(就是交换机上)看到源mac和目标mac就在同一个冲突域(交换机端口)下。因此数据帧发回到该物理网卡的冲突域上。但是对于物理网卡而言,交换机发过来的数据帧的目标mac不是自己的mac,应该将其丢弃。而且由于主机一般不对icmp进行错误返回,因此显示超时错误。
 
网上google、baidu了一番,终于发现了一个折中的方法:使用loopback网卡。因为loopback在逻辑上与物理网卡是一致的。而且任何发往loopback的数据包根本不会经过第二层封装。这就不存在网卡丢弃数据帧的问题。
 
xp的话使用添加新设备,选择网络适配器,手动安装,厂商选老比盖,里面就有loopback。装完后重启计算机,重新使用dynamips中选择npf的参数(我使用edurainbow的full 2,有个setup目录下可直接改网卡参数),填上loopback网卡的npf即可。重新启用dynamips,主机和路由器终于可以直接ping了。
 
这样有个缺点,就是无法使用多台主机作分布式虚拟试验。暂时没有想到更好的方法,希望有识之士可以指教。