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