{"id":13844222,"url":"https://github.com/hongfeioo/UserDeviceTracker","last_synced_at":"2025-07-11T22:31:02.585Z","repository":{"id":144465929,"uuid":"89680317","full_name":"hongfeioo/UserDeviceTracker","owner":"hongfeioo","description":"快速定位一个IP或MAC在你的网络中的位置，是网络工程师提高工作效率的利器，也可以为CMDB提供基础网络数据。","archived":false,"fork":false,"pushed_at":"2017-12-04T09:19:37.000Z","size":830,"stargazers_count":48,"open_issues_count":0,"forks_count":22,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-11-21T16:40:21.388Z","etag":null,"topics":["devicetracker","devops-tools","golang","ip","mac","netdev","router","switch","switchport","udt"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hongfeioo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-04-28T07:31:21.000Z","updated_at":"2024-09-16T06:59:57.000Z","dependencies_parsed_at":null,"dependency_job_id":"925fde47-5dd5-4e3a-932d-085eda43d849","html_url":"https://github.com/hongfeioo/UserDeviceTracker","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/hongfeioo/UserDeviceTracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongfeioo%2FUserDeviceTracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongfeioo%2FUserDeviceTracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongfeioo%2FUserDeviceTracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongfeioo%2FUserDeviceTracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hongfeioo","download_url":"https://codeload.github.com/hongfeioo/UserDeviceTracker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongfeioo%2FUserDeviceTracker/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264909966,"owners_count":23682096,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["devicetracker","devops-tools","golang","ip","mac","netdev","router","switch","switchport","udt"],"created_at":"2024-08-04T17:02:37.722Z","updated_at":"2025-07-11T22:31:02.074Z","avatar_url":"https://github.com/hongfeioo.png","language":"Python","readme":"# UserDeviceTracker\n快速定位一个IP或MAC在你的网络中的位置.\n\n\n## 介绍\n1. 本程序会采集cisco,huawei,h3c交换机上的arp表和mac地址表，经过运算可以得出两种对应关系: ip -\u003e mac -\u003e SwitchPort ,  SwitchPort -\u003e mac -\u003e ip 。\n2. 通过这两种对应关系，可以轻松的通过ip找到设备所在的交换机端口，或者通过交换机端口找到联机的网络设备IP。  \n3. 随着虚拟化技术的发展，本程序对于定位虚拟机所在的物理机也有帮助。\n\n\n\n\n## 配置文件的格式\n```\n#idc1\n10.10.8.1       h3c-sw          slp_CoreSW      -       -\n10.10.8.11      h3c-sw          server_acc_150  -       Bridge-Aggregation2\n10.10.8.12      h3c-sw          server_acc_151  -       Bridge-Aggregation2\n#idc2\n10.55.0.1       cisco-nxos      core1.idc5      -       -\n10.55.1.1       cisco-nxos      n5k1.idc5       -       Po51\n10.55.1.2       cisco-nxos      n5k2.idc5       -       Po51\n\n1.  第1个字段设备ip，\n2.  第2个字段设备类型（不同的设备类型对应不同的模拟登陆方式和arp／mac获取方式），\n3.  第3个字段为备注（可描述设备名字,随意书写），\n4.  第4个字段如果是-则取双表，如果不是-则只取mac地址表（目前都设置-，以后可以开发成更有用的字段）。\n5.  第5个字段.   mac地址表入库的时候，会排除这些接口。 如果是核心交换则用- ，如果是接入层交换机则写上这个交换机的上联口。 \n```\n\n## 备注\n1.  推荐只采集核心交换和接入层设备，汇聚层设备不要放，因为太多的trunk口没什么用.\n2.  macarpbak目录为自动生成，程序会在生成allarpmac.html 之后向本文件夹中拷贝一份留作备用，以方便以后查找, 需要定期清理。\n3.  macarp目录为自动生成， 存放allmac 和allarp的备份数据，需要定期清理。\n4.  配置文件中的ip顺序是有讲究的，核心交换，汇聚交换，接入层交换, 这样的排列可以让生成的结果更易读。\n\n\n## 数据文件\n程序会通过模拟登陆的方式获取网络设备的arp表和MAC表,取到的ARP信息记录在allarp.txt 中，MAC信息记录在allmac.txt \n\n\n## 采集的信息以文本存储\n\n### arp信息库\n```bash\n库文件： allarp.txt\n格式：\nMgmt:10.64.0.16 fcfb.fb9e.1041 10.64.3.75 Vlan2   // Mgmt:设备ip  mac  ip  vlan(未用到)\n```\n\n\n### MAC信息库\n```\n文件名：allmac.txt\n格式：\nMgmt:10.64.0.16 58bf.ea74.72b0 DYNAMIC 1 Gi1/0/15 GW:-    // Mgmt:设备ip  mac  dynamic  vlan   interface  Gateway(现在统一为-， 以后可以开发成其他含义的字段)\n```\n\n### HTML展示\n```\n文件名：allarpmac.html\n格式：见1-UDT简易UI\n环境需求：apache ,nginx 等 \n```\n\n\n## 总结\nallarpmac.html 是对采集的数据进行了简单的展示(IP -\u003e MAC -\u003e SwitchPort)，很丑但凑活能用. 在展现方面在下边还有两个小项目的优化，分别以不同的方式展示了采集回来的数据。\n1.  php+python  (IP -\u003e MAC -\u003e SwitchPort)\n2.  golang      (SwirthPort -\u003e MAC -\u003e IP)\n\n\n## TODO\n1.  模拟登陆的方式获取arp和mac信息, 使用 screen-length disable 可取消翻页(感谢JD大泳老师github上的作品)，这个功能在第一版设计的时候竟没有考虑到，如有兴趣者可进行分支修改。\n2.  2017年3月, 本程序已经完成的go语言的重构，采集信息的方式由模拟登陆变成了snmp,存储方式也由文本变成了ETCD，并对外提供RESTful接口，后期可能公布源码。\n\n\n\n* * *\n\n# 1-UDT简易UI(选用)\n为了让采集得到的数据更加直观的展示，index.php 和 udt.py  两个文件为UDT提供了一个简易的UI， 可以在网页中搜索ip或者mac _( 一位网络工程师已逐渐走向全栈，请不要阻拦)_\n\n\n## 截图\n\u003cimg src=\"udt.png\" alt=\"udt\" \u003e\n\n\n\n```\n解释：\n ARP:703d.15e3.6dd7 ip:10.10.100.20 L3dev:10.10.8.1\u003c/p\u003e                      //这其实是一条三层信息，L3dev指这条arp信息所在的设备\n L2dev:10.10.8.1 type:Dynamic vlan:100 interface:Bridge.Aggregation19\u003c/p\u003e    //这是一条二层信息，红色的mac地址，出现在10.10.88.1这台设备上，接口是Bridge.Aggregation19（集联口）。\n L2dev:10.10.82.3 type:Learned vlan:100 interface:GigabitEthernet1/0/41\u003c/p\u003e   //这是一条二层信息，红色的mac地址，还出现在了10.10.82.3这个交换机的G1/0/41口。\n\n从以上信息可以解读到，10.10.100.20(703d.15e3.6dd7)  这个设备连接在 10.10.82.3这台接入层交换机的G1/0/41口，vlan 100 。\n\n```\n\n\n\n## 按钮的作用\n1. search   对最近的一次采集结果进行搜索\n2. history  在所有的备份文件中搜索（当你想知道某个ip是否被占用也可以用这个功能）\n3. update   触发一次后台的getMacArp操作，获取最新的arp和mac信息。\n\n\n\n\n\n## 注意\n1. history按钮会对macarpbak中的“所有”备份文件进行搜索，为了避免展示内容过长可以定期清理这些备份文件, 当显示超过500条目时，页面会有提示。\n2. 面页中 “红色”部分其实就是arp信息，L3dev指的是这条arp信息所在的设备,  L2dev 表示红色mac地址所在的设备. \n3. 要让index.php 跑起来你需要一个web环境，例如apache ,此处不多讲。\n4. 没有三层信息的设备在allarpmac.html中是不显示的。\n\n\n\n## 排错\n1.  网页的按钮update不起作用，可能是文件或者目录权限导致。\n2.  通过这种方式可以直接测试程序是否有问题。排除php的干扰。\n```\nexample:\npython udt.py 192.168.102.134 search   在最近的arpmac库中搜索ip\npython udt.py 192.168.102.134 history  在所有arpmac库中搜索ip\npython udt.py 00ef.ccrg.a3ff search    在最近的arpmac库中搜索mac\npython udt.py 00ef.ccrg.a3ff history   在所有arpmac库中搜索mac\n```\n\n* * *\n\n# 2-UDT的简易UI(选用)\n\n## 介绍\n1.  可以看作是UDT的go版的简易UI\n2.  和php版本的UI相比，这个版本展示的信息更全，显示的更加形象。\n3.  引入了mac地址翻译功能，可以看出网卡的厂家\n\n\n\n## 特性介绍\n1. 以arp库文件和mac库文件作为源，分析出Interface -\u003e mac -\u003e IP 的对应关系， 这个和allarpmac.html 的生成过程刚好相反，好处在于没有IP信息的mac也会被展示出来。\n2. 一个mac地址对应多个IP的情况被很好的展现。\n3. MAC地址解析成厂家的依据是这个文件：ieee_mac.txt ，可去官方网站更新\n\n\n\n\n## 启动方法\n```\ngo build  VserverMap.go\n./VserverMap\n\n注意：golang的安装方法此处不做介绍\n```\n\n## 使用方法\n```\n1. http://localhost:8080/mac   Interface -\u003emac-\u003eIp    \n2. http://localhost:8080/      Interface -\u003e IP\n\n备注：go的强大之处可见一斑，分分钟就能搭建一个网页展示\n```\n\n\n\n## 截图\n\u003cimg src=\"vm.png\" alt=\"vservermap\" \u003e\n\n\n\n##  举例子\n```\n\nMgmt:192.168.24.71-GigabitEthernet2/0/10\n-+1866.daf8.5844(Dell Inc.)\n--+192.168.30.170\n解读：这种情况最为普遍，交换机192.168.24.71的2/0/10口下有一个mac地址1866.daf8.5844，并且可以被成功是被为dell厂商，对应的ip为192.168.30.170\n\n\nMgmt:10.2.1.15-GigabitEthernet1/0/19\n-+5ab0.461d.f641\n--+10.10.10.12\n-+c81f.66c2.c2d3(Dell Inc.)\n--+10.10.10.11\n-+d2d2.0eb8.2d49\n--+10.10.10.13\n解读： 这种情况可能是c81f.66c2.c2d3（10.10.10.11）物理机上启动了两个虚拟机分别是5ab0.461d.f641（10.10.10.12）和d2d2.0eb8.2d49（10.10.10.13）\n\n\nMgmt:172.16.4.3-GigabitEthernet2/0/15\n-+b82a.72dc.3dcb\n--+21.15.118.66\n--+21.15.118.60\n--+21.15.118.6\n解读： 交换机172.16.4.3的2/0/15口下有一个mac地址b82a.72dc.3dcb，这个mac对应了三个IP，说明可能有虚IP的情况。\n\n\n\n\nMgmt:192.168.254.6-GigabitEthernet2/0/19\n-+c81f.66fa.d90f(Dell Inc.)\n--+no ip find\n解读： 这种情况很可能是这个服务器没有位置IP，所以只获取了二层信息，没有三层信息。\n\n```\n\n\n## 数据结构设计\n```\n1. 用map的key存放信息有天然去重的功效,并且可以检索，这个是数组无法比拟的（至少现在数组没有去重的函数）\n2. 一个接口下会有多个mac，并且mac可能重复: 这种情况， 外层key存放Interface，内层key存放mac很合理。\n3. 一个mac地址会对应多个IP地址,   这种情况，外层key存放mac ，内层key存放Ip很合理。\n4. 内层的map只用到了key没有用到value，以后可以开发使用。\n\ntype MapMap struct {\n        mapp map[string]map[string]int  \n}\n\n5.  外层键值为string，内容为map； \n6.  内层键值为string，内容为0\n7.  FillMacInterface  外层键值Interface  内层键值mac  内容为空, 满足一个接口下多个mac（自动去重），并存入多个不同端口\n8.  FillMacIp         外层键值Mac        内层键值Ip   内容为空，满足一个mac对应多个ip（自动去重），并存入多个不同mac\n9.  FillIeeeMac       外层键值Mac前缀    内层键值厂家名字  内容为空，  其实这里没有去重的必要，但是用key检索value还是比较快的。\n```\n\n## 函数介绍\n1.  FillMacInterface从allmac.txt中过滤出端口和mac的对应关系,存入双重的map关系,记录了  Interface -\u003e mac  的一对多关系\n2.  FillMacIp从allarp.txt 中过滤出mac和ip的对应关系, 存入双重的map结构. 记录了mac -\u003e IP  的一对多关系。\n3.  FillIeeeMac，从ieeemac.txt数据库中，过滤出mac地址前缀和厂家的关系存入双map结构，记录了 mac前缀 -\u003e  厂家的关系。\n\n\n\n### IEEE 指定的MAC地址规范下载\nhttps://regauth.standards.ieee.org/standards-ra-web/pub/view.html#registries\n\n\n### 缺陷\n如果物理服务器有两块网卡，宿主走一个网卡，虚拟机走另外一个网卡，这种情况用本程序就无法找到虚拟机所在的宿主了。\n\n\n\n------\n\n\n\n## 作者介绍\nyihongfei  QQ:413999317   \n\nCCIE 38649\n\n\n## 寄语\n为网络自动化运维尽绵薄之力\n\n","funding_links":[],"categories":["Python (1887)","Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhongfeioo%2FUserDeviceTracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhongfeioo%2FUserDeviceTracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhongfeioo%2FUserDeviceTracker/lists"}