Thứ hai, 18/08/2014 | 00:00 GMT+7

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 SNMPcá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 snmpgetsnmpwalk 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à snmpbulkgetsnmpbulkwalk đã đượ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.


Tags:

Các tin liên quan