这个占用了大量带宽的IP到底在哪?谁在用?我真想直接封了它!
不管是公司内部网络之间的WAN连接,还是共享NAT/Proxy上网,带宽被占满是最烦人的一件事情。轻则上不去网,重则影响公司业务,而所有这些最终都会指向公司网管。虽然可以通过cisco上的ip accounting / netflow,Linux上的iftop/bandwidthd或者抓包等找到那个可恶的IP,可这IP到底在哪???谁在用???甚至当你花费半天力气找到始作俑者时,往往面对一张装作无知的脸孔:我什么都没干啊。艹。。。
现在有办法快速找到这个可恶的家伙,而且,需要他乖乖的跑到你这里来问:我怎么上不了网了?你可以骄傲的问:哼哼,你干坏事了吧。。。
我们所需要做的,就是安装Netdisco
如上图,Netdisco可以清晰的显示 IP地址 - MAC地址 - 机器名 - 工作组 - 用户名 之间的对应关系,包括连到公司网络的时间等。
注:Netdisco适应绝大多数网络环境,而且客户端越多越能凸显出Netdisco的便利性。
硬件环境:
1台3层网络交换机(只有2层的也可以,步骤相同,但客户机设置上有个不入流的小技巧),我用的是Cisco设备
1台Linux主机,我用的是Fedora 14
Cisco上配置管理IP地址、开启SNMP
conf t
interface Vlan1
ip address ip_addr netmask
no shut
conf t snmp-server community "community名称" RO (或者RW)
Linux上安装Netdisco
yum install netdisco
Netdisco的配置
/usr/sbin/netdisco_config - 这是1个自动配置脚本
这行时间比较长,特别是Populating the OUI database for netdisco这步
会有些提问,输入密码等
提示give admin port control? 输入y
提示give admin admin rights?输入y
提示Full user name?输入y
如果上面没有输入,最后访问
http://linux_ip_address/netdisco时会没有administration panel,解决办法是
/usr/share/netdisco/netdisco -u
提示输入核心设备IP地址;
提示输入snmp community字符串(网内全部网络设备设备最好使用相同的snmp community,简单;当然也可直接编辑配置文件添加不同的snmp community),电脑等在NetDisco里算作node
安装完成后运行netdisco -r “核心交换机ip” (注:这步好像配置脚本会自动做,记不清楚了)
对大型网络,可能要1~几个小时才能完成。
最后会报告哪些不成功,一般是由于SNMP community名称不同或者没配置SNMP。对于不同community的,可以运行vi /etc/netdisco.conf,在community一行加入这些community名称,然后运行命令netdisco -d 设备ip 即可。
最后,访问http://ip_addr/netdisco,输入前面自己定义的用户名和密码就可以了。(Netdisco号称可以直接关闭交换机端口,不过还是建议大家登录到交换机上去关闭。)
现在,当你发现某个IP在干坏事的时候,直接上交换机关了这个端口就可以了,千万注意别错关了老板的;-)
常见问题
1,如果出现这个错误:
Starting netdisco admin daemon:Can't locate netdisco.pm in @INC (@INC contains: /usr/sbin /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5 /usr/share/perl5 /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi /usr/local/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl /usr/lib/perl5/site_perl .) at /usr/sbin/netdisco line 27.
BEGIN failed--compilation aborted at /usr/sbin/netdisco line 27.
解决办法:
copy 1份netdisco.pm到/usr/local/lib/perl5或者/usr/local/share/perl5目录
用netdisco_config script 的时候,提示输入netdisco database密码的时候输入"netdisco"或者root的密码;
脚本运行后在手动重启httpd 1次。
2,前面说到如果没有3层交换机只有2层交换机怎么办?其实也能办,就是在客户端设置DNS的时候,把第1个DNS设置为2层交换机的IP地址。这个办法真 不太入流,但是也真奏效。
3,Netdisco用的是pgsql数据库,如果对数据库熟悉,可以抓取其中的数据并实现更多的功能,比如,实现802.1x的接入控制等。
-sh-4.1$ psql netdisco psql (8.4.9) Type "help" for help.
netdisco=> \d -- 查看表 List of relations Schema | Name | Type | Owner --------+------------------------+----------+---------- public | admin | table | netdisco public | admin_job_seq | sequence | netdisco public | device | table | netdisco public | device_ip | table | netdisco public | device_module | table | netdisco public | device_port | table | netdisco public | device_port_log | table | netdisco public | device_port_log_id_seq | sequence | netdisco public | device_port_power | table | netdisco public | device_port_ssid | table | netdisco public | device_port_vlan | table | netdisco public | device_port_wireless | table | netdisco public | device_power | table | netdisco public | device_vlan | table | netdisco public | log | table | netdisco public | log_id_seq | sequence | netdisco public | node | table | netdisco public | node_ip | table | netdisco public | node_monitor | table | netdisco public | node_nbt | table | netdisco public | node_wireless | table | netdisco public | oui | table | netdisco public | process | table | netdisco public | sessions | table | netdisco public | subnets | table | netdisco public | user_log | table | netdisco public | user_log_entry_seq | sequence | netdisco public | users | table | netdisco (28 rows)
netdisco=> select * from device_ip;
等等等等。。。