个人工具

Quick HOWTO : Ch22 : Monitoring Server Performance/zh

来自Ubuntu中文

跳转至: 导航, 搜索


简介

你能够使用Linux的图形化工具来容易地监视系统的网络性能。在下面的章节中,你将会学到怎样使用包括MRTG(基于SNMP的,用来监视网络流量的工具)和Webalizer(分析网站命中率的工具)在内的一些工具。

简单网络管理协议

许多服务器、路由器和防火墙在他们的对象标志符(OIDs)里保记录这他们的操作上的统计数据,你可以通过简单网络管理协议(SNMP)来细心的检索他们。为了方便使用,设备制造商为他们的设备提供了管理信息库文件MIB,该文件定义了设备对象标志符OID的功能。在这两句中有许多新的术语需要被理解,因此让我们花一点时间弄清楚他们。

OIDs 和 MIBs

OIDs 由SNMP标准定义的结构化管理信息树来确定。该树开始于根结点root,通过分支和叶继承下去,每一个子结点添加他们自己的引用值到一个由单独的时间区分的路径。图 22-1显示了OID结构,企业OID分支的路径首先通过org,dod,internet,和private branches,因此相应的OID路径是1.3.6.1.4.1。

图22-1 SNMP OID 结构

Snmp.gif

管理信息库(MIBs)是用文字定义每个OID分支.表22-1展示了常用的OIDs与它们的MIBs的对应关系.例如,org MIB定义了dod层必需的所有最高层的OIDs。dod下层的internet MIB定义了directory、mgmt、experimental、和private branches中的最高层OIDs。这种MIB信息对SNMP管理程序非常有用,你可以点击某个OID来看它的值、类型和描述。

Table 22-1 OIDs 和相对应的MIBs

OID MIB
1.3 org
1.3.6 dod
1.3.6.1 internet
1.3.6.1.1 directory
1.3.6.1.2 mgmt
1.3.6.1.3 experimental
1.3.6.1.4 private
1.3.6.1.4.1 enterprises

用可读性更高的MIB别名来替代OID分支中的数字,你可以更好的识别该OID。例如,你可以将OID 1.3.6.1.4.1.9.9.109.1.1.1.1.5看成enterprises.9.9.109.1.1.1.1.5.即你可以用enterprises的分支名来替代它的OID数字(1.3.6.1.4.1)

记住,只有分支中的最底端即叶子的OID值才有实际的可读性。将OIDs看成硬盘上的目录结构一样。每个分支就等同于子目录,最底端(叶子)就好比一个文件。

linux下的snmpget命令输出单个叶子的值,snmpwalk命令则会输出分支下面所有叶子的值。晚些时候再讨论这些命令;现在你只需要知道的是命令的输出通常情况下不会列出整个OID,只会列出它所属的MIB文件和该文件中的别名,例如:

SNMPv2-MIB::sysUpTime.0

这里OID值属于SNMPv2-MIB文件,使用sysUpTime别名中的零位置

设备厂商通常在enterprises MIB下分配他们自己的OID分支,为方便管理他们还必须提供以全局OIDs方式表示的信息。例如,NIC接口数据吞吐量应该放在通用树上的某个预先定义好的位置,可是定制的处理器卡上的内存使用值会被定义在某个MIB中,该MIB在厂商自己的OID分支下。

SNMP Community字符串

作为一种安全措施, 你需要知道 SNMP 密码, 即 community字符串,来查询 OID. 有多种community 字符串,最常用的是只读字符串用来提供对统计和系统参数的访问. 多数情况下设置为 "public;"为避免被猜出你应该修改它 . 读写community字符串不仅用来查看统计数据和系统参数,而且用来修改系统参数。

SNMP 版本

目前SNMP有三个版本.

  1. SNMP版本1: 第一个实现版本, 版本1的目的是设计出一种协议以在不消耗太多系统资源的情况下提供设备统计信息和错误报告. 安全方面仅限于 community 字符串和基于IP地址的访问控制. 数据通讯没有加密.
  2. SNMP 版本 2: 第二个版本的 SNMP协议, 通常称为v2c,扩展了所支持的错误码, 增加了跟踪数据的计数器, 具备批量查询能力,可以更高效的加载返回数据包. SNMP v2c 与版本1兼容.
  3. SNMP版本3: 这个版本比前面的版本提供了更多的安全和远程配置能力. 访问控制不仅限于community字符串来提供只读或者读写访问,引入了用户名和口令. 可以为每一个用户提供MIB库的OID视图. 提供 SNMP数据加密和数据错误检测.

请记住他们的差异, 因为做SNMP查询时你需要指定版本号.

SNMP查询

在一个服务器上配置SNMP并不难, 不过也需要一些琐碎的步骤.

在Linux Server上安装SNMP工具

如果你想用你的linux通过MRTG或者其他工具去查询你的网络设备,其他服务器甚至本机, 你需要安装SNMP工具包net-snmp-utils .这个包需要其他的一些包, 因此最好用自动的软件包更新工具例如 yum 或者 apt 来安装.

查找这些包时,文件名一般是包名名称加上版本号,例如net-snmp-utils-5.1.1-2.i386.rpm. (如果你需要一个安装工具请参阅第六章, , "Installing Linux Software").

SNMP工具命令语法

SNMP工具包在你的系统中安装了一些新的命令来执行SNMP查询,其中以查询单个OID值的snmpget命令和获取整个MIB库内容的snmpwalk命令最为著名.这两个命令都需要你使用-c操作符指定community字符串. 它们也需要你用-v 1, -v 2c, 或者 -v 3 操作符来分别指定SNMP查询的协议版本。命令的第一个参数是目标设备的名称或者IP地址,其他的参数列出了需要查询的MIB库。

下面的例子使用SNMP版本1和community字符串craz33guy来获取本机interface MIB的所有值:

[root@bigboy tmp]# snmpwalk -v 1 -c craz33guy localhost interface
...
...
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: eth1
...
...
IF-MIB::ifPhysAddress.1 = STRING:
IF-MIB::ifPhysAddress.2 = STRING: 0:9:5b:2f:9e:d5
IF-MIB::ifPhysAddress.3 = STRING: 0:b0:d0:46:32:71
...
...
[root@bigboy tmp]#

在检查 snmpwalk 命令输出时,你会看到第二个网卡的名称是 eth0, MAC 地址是 0:9:5b:2f:9e:d5. 你现在可以用snmpget命令获取MAC地址:

[root@bigboy tmp]# snmpget -v 1 -c const1payted localhost ifPhysAddress.2
IF-MIB::ifPhysAddress.2 = STRING: 0:9:5b:2f:9e:d5
[root@bigboy tmp]#

你可以用命令 ifconfig 来确认网卡 eth0 的信息; 第一行应该显示 MAC 地址:

[root@bigboy tmp]# ifconfig -a eth0
eth0 Link encap:Ethernet HWaddr 00:09:5B:2F:9E:D5 
 inet addr:216.10.119.244 Bcast:216.10.119.255 Mask:255.255.255.240
...
...
[root@bigboy tmp]#

接下来你会看到如何在你的Linux服务器上配置SNMP来获得上述结果.

Configuring Simple SNMP on a Linux Server

Fedora缺省安装 net-snmp 包作为 SNMP 服务器. 这个包的配置文件是 /etc/snmp/snmpd.conf ,其中可以设置community字符串和其他参数.net-snmp配置文件的版本很复杂. 我建议备份这个文件并使用一个只有一行字符串的简化版本,内容是关键字 rocommunity加上community 字符串. 如下所示.

1) 保存老的配置文件

[root@bigboy tmp]# cd /etc/snmp/
[root@bigboy snmp]# mv snmpd.conf snmpd.conf.old
[root@bigboy snmp]# vi snmpd.conf

2)在新的配置文件中输入下列文字来设置只读community字符串为 craz33guy.

rocommunity craz33guy

3) 用chkconfig命令配置Linux在每次重启动时启动SNMP服务:

[root@bigboy root]# chkconfig snmpd on
[root@bigboy root]#

4) 启动SNMP 加载这个配置文件.

[root@bigboy root]# service snmpd start
Starting snmpd: [ OK ]
[root@bigboy root]#

5) 用snmpwalk命令测试是否 SNMP可以读MIB库system 和interface .

[root@bigboy snmp]# snmpwalk -v 1 -c craz33guy localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux bigboy 2.4.18-14 #1 Wed Sep 4 11:57:57 EDT 2002 i586
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysUpTime.0 = Timeticks: (425) 0:00:04.25
SNMPv2-MIB::sysContact.0 = STRING: root@localhost
SNMPv2-MIB::sysName.0 = STRING: bigboy
...
...
...
[root@bigboy snmp]# snmpwalk -v 1 -c craz33guy localhost interface
IF-MIB::ifNumber.0 = INTEGER: 3
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: wlan0
IF-MIB::ifDescr.3 = STRING: eth0 
...
...
...
[root@bigboy snmp]# 

现在你知道在你的Linux服务器上SNMP工作正常, 你可以配置 SNMP统计采集软件, 例如MRTG, 来建立你的流量统计图.

其他设备上的SNMP

在上面例子中, 你已经轮询了本机数据. 你可以轮询其他支持并启动了SNMP的网络设置. 你所需要的是IP地址和SNMP只读字符串就可以得到类似的结果. 下面是查询IP地址为192.168.1.1设备的例子.

[root@bigboy snmp]# snmpwalk -v 1 -c chir1qui 192.168.1.1 interface

注意: 当使用snmpwalk 和 snmpget 命令时, 记得为你使用的SNMP版本使用正确的版本开关 (-v 1, -v 2c, or -v 3)。

基本SNMP安全

SNMP的安全措施非常依赖于你所使用的 SNMP 版本. 本小节列出了保护你的MIB数据的基本步骤.

SNMP版本1 和版本2

这个两个最为广泛支持的SNMP版本并不加密你的community字符串密码,因此你不应该在不安全网络例如互联网上执行查询. 而且你应该用防火墙或者snmp.conf中的SNMP安全特性来确保你采用了所有必要的安全措施,以使查询只来自于被信任的IP地址。不采用防火墙的情况下,附录1"Miscellaneous Linux Topics"中列出了TCP wrapper特性,你可以配置TCP wrapper来限制对特定服务器的访问 。 如果你需要, snmpd.conf文件支持基于受信任的主机和网络的MIB库访问限制。 snmpd.conf 有两个安全小节; 文件头部有一个小节是严格限制的访问控制,后面是一个不严格限制的小节. 下面例子是不严格限制小节.为了让它正常工作,你必须注释掉文件头部严格限制的文字.


## sec.name source community
## ======== ====== =========
com2sec local localhost craz33guy
com2sec network_1 172.16.1.0/24 craz33guy
com2sec network_2 192.168.2.0/24 craz33guy

## Access.group.name sec.model sec.name
## ================= ========= ========
group MyROGroup_1 v1 local
group MyROGroup_1 v1 network_1
group MyROGroup_2 v2c network_2

## MIB.view.name incl/excl MIB.subtree mask
## ============== ========= =========== ====
view all-mibs included .1 80

## MIB 
## group.name context sec.model sec.level prefix read write notif
## ========== ======= ========= ========= ====== ==== ===== =====
access MyROGroup_1 "" v1 noauth exact all-mibs none none
access MyROGroup_2 "" v2c noauth exact all-mibs none none

在我们的例子中:

  • 只有三个网络 (localhost, 172.16.1.0/24, and 192.168.1.0/24) 允许访问服务器,并采用community字符串 craz33guy .
  • 每个网络属于采用SNMP版本1的组 MyROGroup_1 或者属于采用SNMP版本2的组 MyROGroup_2
  • 服务器上所有MIB被定义为视图all-mibs.
  • 访问控制语句确保只有已经定义的网络才能只读访问所有 MIB. MyROGroup_1 只能采用版本1访问,MyROGroup_2 只能采用版本2访问
  • 通过SNMP修改MIB将被拒绝,因为访问控制语句中写权限为"none" .

这些预防措施在宿主网络环境中是不必要的,因为宿主网络中通过NAT防火墙限制了网络设备的范围.

SNMP版本3

SNMP 的第三个版本 SNMPv3是一个比前面的版本更加安全的选择 ,因为它加密了所有的数据并且采用用户名口令组合来验证客户端. 用户名在文件/etc/snmp/snmpd.conf 中, 对应的自动生成的密码在/var/net-snmp/snmpd.conf 文件中. 下面是生成过程:

1. 安装软件包 net-snmp-devel ,它带有让你生成密码的工具. 如果你需要软件安装工具, 请参阅第六章, "Installing Linux Software")

2. 停止snmpd 进程.

[root@bigboy tmp]# service snmpd stop
Stopping snmpd: [ OK ]
[root@bigboy tmp]#

3. 使用命令net-snmp-config 自动在/etc/snmp/snmpd.conf 和 /var/net-snmp/snmpd.conf 文件中创建用户名和密码. 下面例子中只读(-ro)用户"username4snmpv3"的认证密码"rootsrockreggae" 采用MD5算法加密. 数据是未加密的.

[root@bigboy tmp]# net-snmp-config --create-snmpv3-user -ro \
-a MD5 -A rootsrockreggae username4snmpv3

adding the following line to /var/net-snmp/snmpd.conf:
 createUser username4snmpv3 MD5 "rootsrockreggae" DES
adding the following line to /etc/snmp/snmpd.conf:
 rouser username4snmpv3
[root@bigboy tmp]# service snmpd start
Starting snmpd: [ OK ]
[root@bigboy tmp]#

4. 为了加密数据我们再次使用net-snmp-config创建用户. 用户名是"securev3user" ,认证口令是 "mandeville" 但是这次数据将采用 DES算法加密,密钥是 "savlamar".

[root@bigboy tmp]# net-snmp-config --create-snmpv3-user -ro \
-a MD5 -A mandeville -x DES -X savlamar securev3user

adding the following line to /var/net-snmp/snmpd.conf:
 createUser securev3user MD5 "mandeville" DES savlamar
adding the following line to /etc/snmp/snmpd.conf:
 rouser securev3user
[root@bigboy tmp]#

5.启动 snmpd 进程.

[root@bigboy tmp]# service snmpd start
Starting snmpd: [ OK ]
[root@bigboy tmp]#

6. 首先我们将从远程主机smallfry执行查询. 我们指定认证密码和认证方法, 我们使用 -l 标识表示进行身份认证,但是数据不加密 ( authNoPriv 选项).

[root@smallfry ~]# snmpget -v 3 -u username4snmpv3 -l authNoPriv \
-a MD5 -A rootsrockreggae 192.168.2.200 SNMPv2-MIB::sysORDescr.8

SNMPv2-MIB::sysORDescr.8 = STRING: The management information definitions for the SNMP User-based Security Model.
[root@smallfry ~]#

查询返回结果是可读字符串, "The management information definitions for the SNMP User-based Security Model". 这个未加密字符串可以通过 tshark抓包工具在服务器网卡上看到.

[root@bigboy tmp]# tshark -n -i eth1 -x port 161
Capturing on eth1
...
...
...

 0.005889 192.168.1.100 -> 192.168.1.50 SNMP get-response

0000 00 c0 4f 46 0c 2e 00 b0 d0 46 32 71 08 00 45 00 ..OF.....F2q..E.
0010 00 f0 00 00 40 00 40 11 b3 b2 c0 a8 02 c8 c0 a8 ....@.@.........
0020 02 32 00 a1 80 0a 00 dc 87 38 30 81 d1 02 01 03 .2.......80.....
0030 30 11 02 04 45 a2 23 54 02 03 00 ff e3 04 01 01 0...E.#T........
0040 02 01 03 04 38 30 36 04 0d 80 00 1f 88 80 71 11 ....806.......q.
0050 68 72 0e b1 e7 45 02 01 12 02 01 39 04 0f 75 73 hr...E.....9..us
0060 65 72 6e 61 6d 65 34 73 6e 6d 70 76 33 04 0c 46 ername4snmpv3..F
0070 6c 74 26 51 4d aa 65 61 59 06 1a 04 00 30 7f 04 lt&QM.eaY....0..
0080 0d 80 00 1f 88 80 71 11 68 72 0e b1 e7 45 04 00 ......q.hr...E..
0090 a2 6c 02 04 43 4e da d7 02 01 00 02 01 00 30 5e .l..CN........0^
00a0 30 5c 06 0a 2b 06 01 02 01 01 09 01 03 08 04 4e 0\..+..........N
00b0 54 68 65 20 6d 61 6e 61 67 65 6d 65 6e 74 20 69 The management i
00c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 64 65 66 69 6e nformation defin
00d0 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 53 itions for the S
00e0 4e 4d 50 20 55 73 65 72 2d 62 61 73 65 64 20 53 NMP User-based S
00f0 65 63 75 72 69 74 79 20 4d 6f 64 65 6c 2e ecurity Model.

4 packets captured
[root@bigboy tmp]#

7. 接下来我们将执行一个查询,返回结果加密 ( authPriv 选项).

[root@smallfry ~]# snmpget -v 3 -u securev3user -l authPriv \
-a MD5 -A mandeville -x DES -X savlamar 192.168.2.200 \

SNMPv2-MIB::sysORDescr.8
SNMPv2-MIB::sysORDescr.8 = STRING: The management information definitions for the SNMP User-based Security Model.
[root@smallfry ~]# 

这个查询返回同样的字符串, 但是 tshark 抓包工具只能看到加密数据, 只有用户名是可读的.

[root@bigboy tmp] # tshark -n -i eth1 -x port 161
Capturing on eth1
...
...
...
 0.003675 192.168.1.200 -> 192.168.1.50 SNMP Source port: 161 Destination port: 32778 [UDP CHECKSUM INCORRECT]

0000 00 c0 4f 46 0c 2e 00 b0 d0 46 32 71 08 00 45 00 ..OF.....F2q..E.
0010 01 00 00 00 40 00 40 11 b3 a2 c0 a8 02 c8 c0 a8 ....@.@.........
0020 02 32 00 a1 80 0a 00 ec 87 48 30 81 e1 02 01 03 .2.......H0.....
0030 30 11 02 04 17 52 82 96 02 03 00 ff e3 04 01 03 0....R..........
0040 02 01 03 04 3e 30 3c 04 0d 80 00 1f 88 80 71 11 ....>0<.......q.
0050 68 72 0e b1 e7 45 02 01 11 02 02 00 8e 04 0c 73 hr...E.........s
0060 65 63 75 72 65 76 33 75 73 65 72 04 0c 01 b2 00 ecurev3user.....
0070 6e 23 07 83 dc a2 b6 d6 3d 04 08 00 00 00 11 4e n#......=......N
0080 df 19 a3 04 81 88 36 dd e0 ce e0 52 19 ff 58 7e ......6....R..X~
0090 be fa d1 96 20 2b 28 65 59 30 e8 d4 cb 18 9f 8f .... +(eY0......
00a0 1e 5b a3 d6 ae f7 4a 86 bd ed 2a 4b a8 df 52 fb .[....J...*K..R.
00b0 00 b4 a8 37 3d 74 9e 6d 1d 56 9a ba f2 13 fa 72 ...7=t.m.V.....r
00c0 4d 47 fb 88 7b d3 54 e1 9d b3 66 f0 29 ab 8a 55 MG..{.T...f.)..U
00d0 6f 77 65 40 87 ab 0c 51 d9 0e bf 33 7f 9a cb ea [email protected]....
00e0 37 50 3c 8e 65 dd 8f 3c 49 71 96 59 f9 d3 a8 23 7P<.e..<Iq.Y...#
00f0 81 c6 1b b2 c2 d0 57 9b 98 1b 89 1e ca 77 3d 84 ......W......w=.
0100 6f af b6 9b 86 3a 2f 66 44 1a 41 51 03 bc o....:/fD.AQ..

4 packets captured
[root@bigboy tmp] #

8. 你的密码和权限信息存储在 /var/net-snmp/snmpd.conf 文件中,采用你用net-snmp-config命令时显示的格式。下面是一个例子

# File: /var/net-snmp/snmpd.conf before SNMP starts

createUser securev3user MD5 "mandeville" DES savlamar
createUser username4snmpv3 MD5 "rootsrockreggae" DES

snmpd后台进程重启动时将完全加密这个文件中的SNMP密码数据, 这有助于进一步增强安全性. 如下所示:

# File: /var/net-snmp/snmpd.conf after SNMP starts

usmUser 1 3 0x80001f88780711168720eb1e745
0x73656375626576337573657200 
0x73656375726576337573657200 
NULL .1.3.6.1.6.3.10.1.1.2 0xd951
ac1d95033f4afgf31243eb6907df .1.3.6.1.6.3.10.1.2.2
0xf1f4bb00452211d27b50c273c09031ac 0x00
usmUser 1 3 0x80001f8880711168720eb1e745 
0x757365726e61657534736e6d70763300 
0x757365726e616d6534736e6d70763300 
NULL .1.3.6.1.6.3.10.
1.1.2 0x5e35c9f5352519aa4f53eded09bbdddd 
.1.3.6.1.6.3.10.1.2.2 0x5e35c9f5122519aa4f53eded09bbdddd ""
setserialno 1464593474

练习使用 net-snmp-config 命令,你将逐渐熟悉它编辑SNMP配置文件的语法。 如有疑问,你可以不带任何参数使用这个命令,你会获得完整的语法列表:

[root@bigboy tmp]# net-snmp-config 
...
...
 SNMP Setup commands:

 --create-snmpv3-user [-ro] [-A authpass] [-X privpass]
 [-a MD5|SHA] [-x DES|AES] [username]
...
...
[root@bigboy tmp]#

随着经验的增加, 你将逐渐足够自信来手工编辑这个配置文件

如你所见, SNMPv3比前面的版本更加安全,若有可能应该作为你的SNMP第一选择。

简单 SNMP 问题解决

如果你的SNMP查询失败,请做以下检查:

  • 重启snmpd进程使配置文件生效. 记住,当snmpd进程启动时确保只有它自己在读 snmpd.conf 文件。
  • 你使用了正确的 community 字符串.
  • 防火墙没有阻止从SNMP Client到SNMP目标的SNMP查询。
  • 你的SNMP 安全策略允许从你的网络进行查询.
  • 你的SNMP目标主机上的任何TCP wrapper允许从你的SNMP客户端执行SNMP查询。通常在被NAT保护的宿主网络上,你的 TCP wrappers文件 (/etc/hosts.allow) 和 (/etc/hosts.deny) 应该为空.
  • 客户端和目标设置之间的网络路由正确. 一个简单的ping或者traceroute 测试可以用来验证这一点.
  • SNMP客户端上snmpd后台进程在运行.
  • 你使用了正确的 SNMP 版本.
  • 你的 /var/log/messages file文件没有包含启动snmpd时报告的错误

确保SNMP查询功能正常很重要,因为许多其他支持程序,例如我后面会讨论到的MRTG,依靠它们才能正常工作.