这个占用了大量带宽的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;
 
等等等等。。。