快速定位一个IP或MAC在你的网络中的位置.
- 本程序会采集cisco,huawei,h3c交换机上的arp表和mac地址表,经过运算可以得出两种对应关系: ip -> mac -> SwitchPort , SwitchPort -> mac -> ip 。
- 通过这两种对应关系,可以轻松的通过ip找到设备所在的交换机端口,或者通过交换机端口找到联机的网络设备IP。
- 随着虚拟化技术的发展,本程序对于定位虚拟机所在的物理机也有帮助。
#idc1
10.10.8.1 h3c-sw slp_CoreSW - -
10.10.8.11 h3c-sw server_acc_150 - Bridge-Aggregation2
10.10.8.12 h3c-sw server_acc_151 - Bridge-Aggregation2
#idc2
10.55.0.1 cisco-nxos core1.idc5 - -
10.55.1.1 cisco-nxos n5k1.idc5 - Po51
10.55.1.2 cisco-nxos n5k2.idc5 - Po51
1. 第1个字段设备ip,
2. 第2个字段设备类型(不同的设备类型对应不同的模拟登陆方式和arp/mac获取方式),
3. 第3个字段为备注(可描述设备名字,随意书写),
4. 第4个字段如果是-则取双表,如果不是-则只取mac地址表(目前都设置-,以后可以开发成更有用的字段)。
5. 第5个字段. mac地址表入库的时候,会排除这些接口。 如果是核心交换则用- ,如果是接入层交换机则写上这个交换机的上联口。
- 推荐只采集核心交换和接入层设备,汇聚层设备不要放,因为太多的trunk口没什么用.
- macarpbak目录为自动生成,程序会在生成allarpmac.html 之后向本文件夹中拷贝一份留作备用,以方便以后查找, 需要定期清理。
- macarp目录为自动生成, 存放allmac 和allarp的备份数据,需要定期清理。
- 配置文件中的ip顺序是有讲究的,核心交换,汇聚交换,接入层交换, 这样的排列可以让生成的结果更易读。
程序会通过模拟登陆的方式获取网络设备的arp表和MAC表,取到的ARP信息记录在allarp.txt 中,MAC信息记录在allmac.txt
库文件: allarp.txt
格式:
Mgmt:10.64.0.16 fcfb.fb9e.1041 10.64.3.75 Vlan2 // Mgmt:设备ip mac ip vlan(未用到)
文件名:allmac.txt
格式:
Mgmt:10.64.0.16 58bf.ea74.72b0 DYNAMIC 1 Gi1/0/15 GW:- // Mgmt:设备ip mac dynamic vlan interface Gateway(现在统一为-, 以后可以开发成其他含义的字段)
文件名:allarpmac.html
格式:见1-UDT简易UI
环境需求:apache ,nginx 等
allarpmac.html 是对采集的数据进行了简单的展示(IP -> MAC -> SwitchPort),很丑但凑活能用. 在展现方面在下边还有两个小项目的优化,分别以不同的方式展示了采集回来的数据。
- php+python (IP -> MAC -> SwitchPort)
- golang (SwirthPort -> MAC -> IP)
- 模拟登陆的方式获取arp和mac信息, 使用 screen-length disable 可取消翻页(感谢JD大泳老师github上的作品),这个功能在第一版设计的时候竟没有考虑到,如有兴趣者可进行分支修改。
- 2017年3月, 本程序已经完成的go语言的重构,采集信息的方式由模拟登陆变成了snmp,存储方式也由文本变成了ETCD,并对外提供RESTful接口,后期可能公布源码。
为了让采集得到的数据更加直观的展示,index.php 和 udt.py 两个文件为UDT提供了一个简易的UI, 可以在网页中搜索ip或者mac ( 一位网络工程师已逐渐走向全栈,请不要阻拦)
解释:
ARP:703d.15e3.6dd7 ip:10.10.100.20 L3dev:10.10.8.1</p> //这其实是一条三层信息,L3dev指这条arp信息所在的设备
L2dev:10.10.8.1 type:Dynamic vlan:100 interface:Bridge.Aggregation19</p> //这是一条二层信息,红色的mac地址,出现在10.10.88.1这台设备上,接口是Bridge.Aggregation19(集联口)。
L2dev:10.10.82.3 type:Learned vlan:100 interface:GigabitEthernet1/0/41</p> //这是一条二层信息,红色的mac地址,还出现在了10.10.82.3这个交换机的G1/0/41口。
从以上信息可以解读到,10.10.100.20(703d.15e3.6dd7) 这个设备连接在 10.10.82.3这台接入层交换机的G1/0/41口,vlan 100 。
- search 对最近的一次采集结果进行搜索
- history 在所有的备份文件中搜索(当你想知道某个ip是否被占用也可以用这个功能)
- update 触发一次后台的getMacArp操作,获取最新的arp和mac信息。
- history按钮会对macarpbak中的“所有”备份文件进行搜索,为了避免展示内容过长可以定期清理这些备份文件, 当显示超过500条目时,页面会有提示。
- 面页中 “红色”部分其实就是arp信息,L3dev指的是这条arp信息所在的设备, L2dev 表示红色mac地址所在的设备.
- 要让index.php 跑起来你需要一个web环境,例如apache ,此处不多讲。
- 没有三层信息的设备在allarpmac.html中是不显示的。
- 网页的按钮update不起作用,可能是文件或者目录权限导致。
- 通过这种方式可以直接测试程序是否有问题。排除php的干扰。
example:
python udt.py 192.168.102.134 search 在最近的arpmac库中搜索ip
python udt.py 192.168.102.134 history 在所有arpmac库中搜索ip
python udt.py 00ef.ccrg.a3ff search 在最近的arpmac库中搜索mac
python udt.py 00ef.ccrg.a3ff history 在所有arpmac库中搜索mac
- 可以看作是UDT的go版的简易UI
- 和php版本的UI相比,这个版本展示的信息更全,显示的更加形象。
- 引入了mac地址翻译功能,可以看出网卡的厂家
- 以arp库文件和mac库文件作为源,分析出Interface -> mac -> IP 的对应关系, 这个和allarpmac.html 的生成过程刚好相反,好处在于没有IP信息的mac也会被展示出来。
- 一个mac地址对应多个IP的情况被很好的展现。
- MAC地址解析成厂家的依据是这个文件:ieee_mac.txt ,可去官方网站更新
go build VserverMap.go
./VserverMap
注意:golang的安装方法此处不做介绍
1. http://localhost:8080/mac Interface ->mac->Ip
2. http://localhost:8080/ Interface -> IP
备注:go的强大之处可见一斑,分分钟就能搭建一个网页展示
Mgmt:192.168.24.71-GigabitEthernet2/0/10
-+1866.daf8.5844(Dell Inc.)
--+192.168.30.170
解读:这种情况最为普遍,交换机192.168.24.71的2/0/10口下有一个mac地址1866.daf8.5844,并且可以被成功是被为dell厂商,对应的ip为192.168.30.170
Mgmt:10.2.1.15-GigabitEthernet1/0/19
-+5ab0.461d.f641
--+10.10.10.12
-+c81f.66c2.c2d3(Dell Inc.)
--+10.10.10.11
-+d2d2.0eb8.2d49
--+10.10.10.13
解读: 这种情况可能是c81f.66c2.c2d3(10.10.10.11)物理机上启动了两个虚拟机分别是5ab0.461d.f641(10.10.10.12)和d2d2.0eb8.2d49(10.10.10.13)
Mgmt:172.16.4.3-GigabitEthernet2/0/15
-+b82a.72dc.3dcb
--+21.15.118.66
--+21.15.118.60
--+21.15.118.6
解读: 交换机172.16.4.3的2/0/15口下有一个mac地址b82a.72dc.3dcb,这个mac对应了三个IP,说明可能有虚IP的情况。
Mgmt:192.168.254.6-GigabitEthernet2/0/19
-+c81f.66fa.d90f(Dell Inc.)
--+no ip find
解读: 这种情况很可能是这个服务器没有位置IP,所以只获取了二层信息,没有三层信息。
1. 用map的key存放信息有天然去重的功效,并且可以检索,这个是数组无法比拟的(至少现在数组没有去重的函数)
2. 一个接口下会有多个mac,并且mac可能重复: 这种情况, 外层key存放Interface,内层key存放mac很合理。
3. 一个mac地址会对应多个IP地址, 这种情况,外层key存放mac ,内层key存放Ip很合理。
4. 内层的map只用到了key没有用到value,以后可以开发使用。
type MapMap struct {
mapp map[string]map[string]int
}
5. 外层键值为string,内容为map;
6. 内层键值为string,内容为0
7. FillMacInterface 外层键值Interface 内层键值mac 内容为空, 满足一个接口下多个mac(自动去重),并存入多个不同端口
8. FillMacIp 外层键值Mac 内层键值Ip 内容为空,满足一个mac对应多个ip(自动去重),并存入多个不同mac
9. FillIeeeMac 外层键值Mac前缀 内层键值厂家名字 内容为空, 其实这里没有去重的必要,但是用key检索value还是比较快的。
- FillMacInterface从allmac.txt中过滤出端口和mac的对应关系,存入双重的map关系,记录了 Interface -> mac 的一对多关系
- FillMacIp从allarp.txt 中过滤出mac和ip的对应关系, 存入双重的map结构. 记录了mac -> IP 的一对多关系。
- FillIeeeMac,从ieeemac.txt数据库中,过滤出mac地址前缀和厂家的关系存入双map结构,记录了 mac前缀 -> 厂家的关系。
https://regauth.standards.ieee.org/standards-ra-web/pub/view.html#registries
如果物理服务器有两块网卡,宿主走一个网卡,虚拟机走另外一个网卡,这种情况用本程序就无法找到虚拟机所在的宿主了。
yihongfei QQ:413999317
CCIE 38649
为网络自动化运维尽绵薄之力