Cách sử dụng Bộ công cụ Net-SNMP để quản lý và giám sát server
Một phần lớn của việc trở thành administrator hệ thống là thu thập thông tin chính xác về server và cơ sở hạ tầng của bạn. Có một số công cụ và tùy chọn để thu thập và xử lý loại thông tin này. Nhiều người trong số họ được xây dựng dựa trên một công nghệ gọi là SNMP .SNMP là viết tắt của giao thức quản lý mạng đơn giản. Đây là một cách mà các server có thể chia sẻ thông tin về trạng thái hiện tại của chúng và cũng là một kênh mà qua đó administrator có thể sửa đổi các giá trị được định nghĩa . Mặc dù bản thân giao thức rất đơn giản, nhưng cấu trúc của các chương trình thực hiện SNMP có thể rất phức tạp.
 Trong các hướng dẫn trước,  ta  đã thảo luận về những điều cơ bản của giao thức SNMP và cách cài đặt và cấu hình các thành phần SNMP trên  server  Ubuntu 14.04 . Trong hướng dẫn này,  ta  sẽ giới thiệu cho các bạn cách sử dụng cơ bản của nhiều công cụ đi kèm với bộ net-snmp mà  ta  đang làm việc.
Ta sẽ thảo luận về cách tận dụng cấu hình mà ta đã cài đặt trong hướng dẫn cuối cùng để thực sự thu thập thông tin và thao tác với các server từ xa. Hướng dẫn này giả định bạn có hai server được cài đặt như ở phần cuối của hướng dẫn cài đặt và cấu hình .
Sử dụng lệnh ứng dụng SNMP
 Bộ công cụ net-snmp mà  ta  đang sử dụng chứa khá nhiều tiện ích hữu ích cho việc truy vấn hoặc đặt giá trị OID trên  server  từ xa.  May mắn là  hầu hết các công cụ đều tận dụng một tập hợp các cú pháp được chia sẻ và có các kiểu sử dụng tương tự.  Ta  sẽ đi qua cách sử dụng cơ bản của một số trong số những cái phổ biến hơn bên dưới.
 Vì mục đích của hướng dẫn này,  ta   giả định  bạn đã quen thuộc với phần xác thực mà bạn cần cung cấp các lệnh net-snmp .  Ta  sẽ đề cập đến tất cả thông tin authentication_info dưới dạng thông tin authentication_info trong các phần bên dưới.
Nếu bạn đã cài đặt cấu hình snmp.conf cho ứng dụng client của bạn như đã thảo luận ở đây, bạn có thể xóa phần này của lệnh vì chi tiết xác thực sẽ được đọc từ file cấu hình của bạn.
 Nếu bạn không có file  snmp.conf , bạn  cần  thay thế “authentic_info” trong mỗi lệnh bằng thông tin cần thiết để kết nối với daemon từ xa của bạn. Đối với account  demo mà  ta   cài đặt  trong loạt bài này, có thể sử dụng các giá trị sau:
-u demo -l authPriv -a MD5 -x DES -A my_new_password -X my_new_password Thay thế các giá trị của bạn khi chạy các lệnh này nếu bạn đang ở trong một môi trường khác.
Đến đây bạn đã biết chi tiết xác thực bạn cần , hãy làm quen với một số lệnh có sẵn.
Lấy các giá trị OID đơn với SnmpGet
 Đây có lẽ là lệnh cơ bản nhất để truy vấn thông tin bằng SNMP. Sử dụng các cờ xác thực cơ bản đã được thảo luận trước đó, lệnh snmpget  được dùng  để đọc giá trị của bất kỳ OID nào mà  user  có quyền truy cập.
Cách sử dụng cơ bản là chỉ định một OID số đã biết. Ví dụ: ta có thể truy xuất mô tả hệ thống bằng lệnh :
snmpget authentication_info host 1.3.6.1.2.1.1.1.0 Vì  ta  đã cài đặt gói snmp-mibs-downloader trên máy tính người quản lý  của bạn  trong hướng dẫn cuối cùng,  ta  cũng có thể tham khảo các OID phổ biến theo tên của chúng. Ví dụ,  ta  có thể nhận được cùng một thông tin  bằng lệnh :
snmpget authentication_info host sysDescr.0 Truy xuất Giá trị OID Có sẵn Tiếp theo với SnmpGetNext
Lệnh này được sử dụng để lấy giá trị của OID sau giá trị đã cho. Vì database MIB là một hệ thống phân cấp có thể đi bộ, các giá trị của nó có thể được truy xuất tuần tự. Bằng cách tận dụng thuộc tính này, ta có thể tìm ra giá trị (và nhãn OID) cho đối tượng tiếp theo từ bất kỳ đối tượng nào trong cây.
 Ví dụ,  ta  đã thấy ở trên cách lấy mô tả hệ thống. Để tìm ra OID tiếp theo và giá trị của nó,  ta  có thể gọi lệnh tương tự, nhưng lần này với lệnh snmpgetnext :
snmpgetnext authentication_info host sysDescr.0 SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10 Điều này trả về ObjectID của hệ thống, là đối tượng tuần tự tiếp theo trong cây. Ta có thể lặp đi lặp lại điều này bằng cách sử dụng OID trả về để lấy từng đối tượng tuần tự:
snmpgetnext authentication_info host sysObjectID.0 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (114216) 0:19:02.16 Chúng có thể sử dụng OID chuỗi hoặc OID số, giống như trước đây.
Sử dụng SnmpWalk để truy xuất một phần của hệ thống phân cấp MIB
 Để lấy tất cả các OID theo một OID được chỉ định, bạn có thể sử dụng lệnh snmpwalk .  Kết quả sẽ trả về  toàn bộ cây tồn tại bên dưới điểm được chỉ định.
 Ví dụ:  ta  có thể lấy tất cả các giá trị trong phần system của cây  bằng lệnh :
snmpwalk authentication_info host system SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (126926) 0:21:09.26 SNMPv2-MIB::sysContact.0 = STRING: admin@example.com SNMPv2-MIB::sysName.0 = STRING: target SNMPv2-MIB::sysLocation.0 = STRING: Sitting on the Dock of the Bay SNMPv2-MIB::sysServices.0 = INTEGER: 72 . . . Lệnh này hoạt động bằng cách tự động đưa ra các yêu cầu SNMP getNext tới server lưu trữ cho đến khi nó có thể xây dựng toàn bộ cây bên dưới giá trị được yêu cầu.
Nếu bạn muốn truy xuất về cơ bản toàn bộ cây MIB, bạn có thể ra lệnh trên root:
snmpwalk authentication_info host . Thao tác này sẽ trả về toàn bộ cây mà user đã cung cấp có thể truy cập.
 Điều này  được dùng , cùng với grep để tìm kiếm các tên OID cụ thể. Ví dụ: bạn có thể biết rằng sysUpTime.0 OID trả về độ dài của  trình  SNMP đã hoạt động trên các  server  từ xa, nhưng bạn có thể tò mò xem bản thân  server  đó đã trực tuyến trong bao lâu.
  Ta  có thể sử dụng lệnh snmpwalk để lấy toàn bộ hệ thống phân cấp của OID và sau đó lọc nó bằng grep để tìm bất kỳ thứ gì có "thời gian hoạt động" trong tên.  Ta  sẽ sử dụng cờ -i để tắt phân biệt chữ hoa chữ thường trong tìm kiếm  của bạn :
snmpwalk authentication_info host . | grep -i uptime Bạn sẽ nhận được phản hồi giống như sau:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (113856) 0:18:58.56 SNMPv2-MIB::sysORUpTime.1 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.2 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.3 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.4 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.5 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.6 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.7 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.8 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.9 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.10 = Timeticks: (0) 0:00:00.00 HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9741455) 1 day, 3:03:34.55 NOTIFICATION-LOG-MIB::nlmLogVariableID."default".1.1 = OID: DISMAN-EVENT-MIB::sysUpTimeInstance NET-SNMP-AGENT-MIB::nsModuleName."".8.1.3.6.1.2.1.1.3.127 = STRING: mibII/sysUpTime Sau khi thử một vài giá trị này,  ta  có thể phát hiện ra rằng hrSystemUptime.0 OID chứa giá trị thời gian hoạt động chính xác. Bây giờ, bất cứ lúc nào  ta  muốn bao lâu kể từ khi máy đó khởi động,  ta  có thể sử dụng OID đó:
snmpget authentication_info host hrSystemUptime.0 HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9795352) 1 day, 3:12:33.52  Như bạn thấy , snmpwalk có thể rất hữu ích để tìm ra các OID chính xác cho các giá trị.
Dịch giữa OID dạng số và chuỗi với SnmpTranslate
Một trong những lệnh hữu ích nhất trong bộ phần mềm không thực sự giao tiếp với server từ xa. Thay vào đó, nó chỉ giúp ta khám phá thông tin về hệ thống phân cấp MIB.
  Sử dụng trình  snmptranslate ,  ta  có thể dễ dàng chuyển đổi các kết quả số thành biểu diễn văn bản của chúng:
snmptranslate 1.3.6.1.2.1.1.1.0 SNMPv2-MIB::sysDescr.0 Điều này cung cấp cho module MIB xác định tên văn bản và tên cho chính OID.
  Ta  cũng có thể sử dụng công cụ để dịch theo hướng khác. Khi  ta  tìm ra MIB văn bản cho thời gian hoạt động của hệ thống ( hrSystemUptime.0 ),  ta  có thể đã tò mò về vị trí trên cây đã được xác định.  Ta  có thể vượt qua cờ -On để lấy địa chỉ số.
Hãy nhớ bao gồm module MIB được cung cấp khi nào bạn nhận được thông tin về OID:
snmptranslate -On HOST-RESOURCES-MIB::hrSystemUptime.0 .1.3.6.1.2.1.25.1.1.0 Bạn cũng có thể sử dụng công cụ này để biết thêm nhiều thông tin chi tiết khác về bất kỳ điểm nào. Ví dụ: với cờ -Td , bạn có thể nhận được mô tả đầy đủ, hoàn chỉnh với đường dẫn ở dưới cùng:
snmptranslate -Tp 1.3.6.1.2.1.1.1.0 SNMPv2-MIB::sysDescr.0 sysDescr OBJECT-TYPE   -- FROM   SNMPv2-MIB   -- TEXTUAL CONVENTION DisplayString   SYNTAX    OCTET STRING (0..255)    DISPLAY-HINT  "255a"   MAX-ACCESS    read-only   STATUS    current   DESCRIPTION   "A textual description of the entity.  This value should             include the full name and version identification of             the system's hardware type, software operating-system,             and networking software." ::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) system(1) sysDescr(1) 0 } Bạn có thể sửa đổi cách hiển thị  kết quả  bằng cách truyền tham số -O_ , trong đó “_” được thay thế bằng định dạng  kết quả . Bạn có thể xem danh sách đầy đủ trong phần “CÁC LỰA CHỌN ĐẦU RA” của trang người đàn ông snmpcmd , nhưng một số lựa chọn phổ biến hơn là:
| Cờ kết quả | Sự miêu tả | Thí dụ | 
|---|---|---|
| -Oa | Hiển thị trong chuỗi ASCII | SNMPv2-MIB :: sysDescr.0 | 
| -Nếu | Hiển thị đường dẫn văn bản đầy đủ đến OID | .iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0 | 
| -Trên | Hiển thị đường dẫn số đầy đủ đến OID | .1.3.6.1.2.1.1.1.0 | 
| -Os | Chỉ hiển thị biểu diễn OID dạng văn bản cuối cùng | sysDescr.0 | 
Lưu ý các tùy chọn định dạng trên cũng có thể được áp dụng với hầu hết các công cụ khác trong bộ này để định dạng kết quả theo cách bạn muốn.
Truy xuất dữ liệu dạng bảng với kết quả được định dạng với SnmpTable
 Một số thông tin được lưu trữ trong SNMP thực sự là dạng bảng. Mặc dù snmpwalk có khả năng hiển thị tất cả dữ liệu liên quan, nhưng định dạng này không lý tưởng cho một số mục đích sử dụng.
 Ví dụ: nếu  ta  sử dụng snmpwalk trên OID udpTable :
snmpwalk authentication_info host udpTable Ta sẽ nhận được điều này:
UDP-MIB::udpLocalAddress.0.0.0.0.161 = IpAddress: 0.0.0.0 UDP-MIB::udpLocalAddress.0.0.0.0.35679 = IpAddress: 0.0.0.0 UDP-MIB::udpLocalPort.0.0.0.0.161 = INTEGER: 161 UDP-MIB::udpLocalPort.0.0.0.0.35679 = INTEGER: 35679 Tuy nhiên, nếu  ta  đưa ra yêu cầu tương tự với snmptable :
snmptable authentication_info host udpTable Ta sẽ nhận được một bảng được định dạng độc đáo, như sau:
 udpLocalAddress udpLocalPort          0.0.0.0          161          0.0.0.0        35679 Đây là định dạng đẹp hơn nhiều và dễ sử dụng hơn cho người đọc.
Sửa đổi giá trị với SnmpSet
Lệnh này được sử dụng để ghi giá trị vào OID. Trong khi các lệnh khác cho đến nay được sử dụng để lấy thông tin, lệnh này được sử dụng để sửa đổi dữ liệu trên server .
 Trong khi lệnh snmpset kế thừa hầu hết cú pháp của nó từ các lệnh khác, nó yêu cầu một số thông tin bổ sung để đặt các giá trị. Cú pháp cơ bản giống như sau:
snmpset authentication_info host OID_to_modify data_type new_value Hầu hết các trường ở trên đều khá dễ hiểu. Tuy nhiên, các kiểu dữ liệu yêu cầu giải thích nhiều hơn một chút. Mỗi loại được đại diện bởi một ký tự duy nhất. Dưới đây là danh sách các loại có thể:
- i : Số nguyên
- u : Số nguyên không dấu
- s : Chuỗi
- x : Chuỗi thập lục phân
- d : Chuỗi thập phân
- n : Đối tượng rỗng
- o : ID đối tượng
- t : Tích tắc thời gian
- a : Địa chỉ IP
- b : Bits
 Vì  ta  đã  download  gói snmp-mibs-downloader , nên hầu hết thời gian bạn có thể gõ = thay vì một trong các số nhận dạng kiểu.
 Để chứng minh lệnh này,  ta  có thể  comment  một trong các giá trị được đặt trong file  snmpd.conf của  ta  trên máy tính tác nhân. Việc chỉ định các giá trị trong file  cấu hình về cơ bản sẽ mã hóa nó, ngăn bạn thay đổi giá trị bằng các phương pháp SNMP thông thường.
 Trên máy tính tác nhân, hãy mở file  /etc/snmp/snmpd.conf :
sudo nano /etc/snmp/snmpd.conf  Comment  về chỉ thị sysLocation :
#sysLocation  Sitting on the Dock of the Bay Lưu và đóng file . Bây giờ khởi động lại dịch vụ:
sudo service snmpd restart  Như vậy,  từ máy quản lý  của bạn ,  ta  có thể đặt OID sysLocation thành “Earth”  bằng lệnh  vào. Lưu ý “s” chỉ định rằng kiểu dữ liệu là một chuỗi:
snmpset authentication_info host sysLocation.0 s "Earth" SNMPv2-MIB::sysLocation.0 = STRING: Earth  Ta  có thể kiểm tra xem = type specifier có đặt đúng loại giá trị hay không bằng cách tinh chỉnh vị trí của  ta :
snmpset authentication_info host sysLocation.0 = "New York City" SNMPv2-MIB::sysLocation.0 = STRING: New York City Nó đã diễn giải chính xác giá trị của ta là một chuỗi thông thường.
Đưa ra yêu cầu một cách hiệu quả với SnmpBulkGet và SnmpBulkWalk
 snmpget các yêu cầu snmpget và snmpwalk lặp đi lặp lại có thể tạo ra khá nhiều lưu lượng mạng khi được sử dụng nhiều lần.
 Để giảm bớt vấn đề này, hai lệnh đồng hành được gọi là snmpbulkget và snmpbulkwalk đã được tạo. Những điều này sẽ đóng gói tất cả các giá trị trả về trong một giao dịch duy nhất chứ không phải là một giao dịch cho từng giá trị OID được trả về. Bạn cũng có thể chuyển nhiều OID cùng một lúc.
 Để sử dụng snmpbulkget , bạn chuyển vào một hoặc nhiều OID hoặc nhánh và bạn sẽ nhận được càng nhiều giá trị cho các OID bổ sung phù hợp trong gói:
snmpbulkget authentication_info host system SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (429891) 1:11:38.91 SNMPv2-MIB::sysContact.0 = STRING: call now SNMPv2-MIB::sysName.0 = STRING: target SNMPv2-MIB::sysLocation.0 = STRING: New York City SNMPv2-MIB::sysServices.0 = INTEGER: 72 SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance Một điều cần lưu ý là snmpbulkget hoạt động giống như một lệnh snmpgetnext ,  nghĩa là  nó loại bỏ đối tượng đã cho làm đối số. Trong ví dụ trên, thay vì cung cấp một đối tượng cụ thể,  ta  cung cấp một nhánh. Bạn có thể nghĩ snmpbulkget như một snmpwalk cuộc gọi, nhưng kết quả sẽ được trong một gói.
 Lệnh snmpbulkwalk hoạt động theo cách tương tự, nhưng sẽ tiếp tục thực hiện các lệnh BulkGet cho đến khi toàn bộ cây con được truy xuất.
Kết luận
  Như bạn thấy , sử dụng bộ net-snmp , bạn có thể truy xuất và thao tác dữ liệu theo nhiều cách khác nhau. Bằng cách viết kịch bản các hành động này hoặc tận dụng các tiện ích này trong các ứng dụng, bạn có thể xây dựng các môi trường quản lý và giám sát phức tạp.
Các tin liên quan
 

