ช่วงนี้ได้รับงานจากลูกค้า ให้ทำโปรแกรมเก็บค่า MAC Address ของเครื่องทุกเครื่องที่ต่อเข้ากับ Switch ลงในฐานข้อมูล เพื่อสามารถดึงข้อมูลมาดูย้อนหลังว่า มี MAC Address อะไร ต่ออยู่ที่พอร์ตไหนบ้างของ Switch
หลังจากค้นคว้าทดลองอยู่พอสมควร ได้ผลลัพธ์ตามที่ต้องการแล้ว เลยขอนำมาเรียบเรียง โดยจะอธิบายเฉพาะวิธีการใช้คำสั่ง snmpwalk เพื่อดึงค่า MAC Address จาก Cisco Catalyst Switch
หมายเหตุ ค่า MIB ที่ใช้ เป็นมาตรฐาน น่าจะใช้กับ Switch ยี่ห้ออื่นๆ ได้ด้วย ลองไปทดสอบกันดูนะครับ
เก็บ MAC Address Table ของ VLAN 1
MIB ที่ใช้เก็บ MAC Address Table จะมีชื่อว่า “dot1dTpFdbEntry” (oid: .1.3.6.1.2.1.17.4.3.1) โดยจะมีหลายๆ ตารางเพื่อเก็บสถานะต่างๆ โดยตารางที่เราสนใจคือ “dot1dTpFdbPort” (oid: .1.3.6.1.2.1.17.4.3.1.2) ซึ่งจะเก็บ MAC Address กับ Interface Index (ifIndex)
ตัวอย่างการใช้ snmpwalk เพื่อดึงค่าจาก dot1dTpFdbPort
[user@server]$ snmpwalk -Ofn -v 1 -c public 192.168.1.1 .1.3.6.1.2.1.17.4.3.1.2 .1.3.6.1.2.1.17.4.3.1.2.0.11.22.33.44.1 = INTEGER: 47 .1.3.6.1.2.1.17.4.3.1.2.0.11.22.33.44.2 = INTEGER: 48 ...
หมายเหตุ ผลลัพธ์ที่ได้เป็นตัวเลขสมมติ
ผลลัพธ์ที่ได้จากการรันคำสั่ง snmpwalk จะเป็นค่า oid ของ “dot1dTpFdbPort” ต่อด้วยตัวเลขอีก 6 byte คั่นด้วยเครื่องหมายจุด ซึ่งตัวเลขแต่ละตัวนี้สามารถเปลี่ยนเป็นเลขฐาน 16 เพื่อเป็นค่า MAC Address ได้ และสุดท้ายของแต่ละบรรทัดมี Interface Index (ifIndex) กำกับ
เช่น 0.11.22.33.44.1 เมื่อแปลงเป็นตัวเลขฐาน 16 ทั้ง 6 byte ก็จะได้เป็น MAC Address 00:0b:16:21:2c:01 ต่ออยู่ที่ interface index 47
ถ้าเปรียบเทียบผลลัพธ์ที่ได้ กับคำสั่ง “show mac-address-table” บน Switch จะเห็นว่า ได้ผลลัพธ์ที่ได้มานั้นไม่ครบถ้วน ซึ่งจริงๆ แล้ว การใช้คำสั่งในรูปแบบด้านบนเราจะได้ MAC Address เฉพาะที่อยู่ใน VLAN 1 เท่านั้น
เก็บ MAC Address Table ของ VLAN อื่นๆ
ถ้าต้องการจะดึงค่า MAC Address Table ของ VLAN อื่นๆ ด้วย ต้องรันคำสั่ง snmpwalk โดยเปลี่ยน community string ที่ใช้ให้เป็น community string index ซึ่งอยู่ในรูปแบบ [community-string]@[vlan-id]
ตัวอย่างการใช้ snmpwalk เพื่อดึงค่า MAC Address ของ VLAN 888 โดยใช้ community string index
[user@server]$ snmpwalk -Ofn -v 1 -c public@888 192.168.1.1 .1.3.6.1.2.1.17.4.3.1.2 .1.3.6.1.2.1.17.4.3.1.2.0.16.55.66.77.12 = INTEGER: 13 .1.3.6.1.2.1.17.4.3.1.2.0.16.55.66.77.92 = INTEGER: 2 .1.3.6.1.2.1.17.4.3.1.2.0.16.55.66.77.32 = INTEGER: 9 ...
หมายเหตุ ผลลัพธ์ที่ได้เป็นตัวเลขสมมติ
แปลงค่า interface index เป็น interface name
จากตัวอย่างที่ผ่านมา interface index ที่ได้ จะเป็นตัวเลข ถ้าเราต้องการทราบว่า interface index นี้คือ interface อะไร สามารถทำได้โดยใช้คำสั่ง snmpget ตรวจสอบกับ MIB ที่มีชื่อว่า ifDescr (oid: .1.3.6.1.2.1.2.2.1.2)
ตัวอย่างการใช้คำสั่ง snmpget เพื่อหาว่า interface index ที่ต้องการคือ interface อะไร
[user@server]$ snmpget -Ofn -v 1 -c public 192.168.1.1 .1.3.6.1.2.1.2.2.1.2.13 .1.3.6.1.2.1.2.2.1.2.13 = STRING: FastEthernet0/13
สรุปผลลัพธ์
ผลลัพธ์จาก snmpwalk และ snmpget จากตัวอย่างด้านบน
[user@server]$ snmpwalk -Ofn -v 1 -c public@888 192.168.1.1 .1.3.6.1.2.1.17.4.3.1.2 .1.3.6.1.2.1.17.4.3.1.2.0.16.55.66.77.12 = INTEGER: 13
[user@server]$ snmpget -Ofn -v 1 -c public 192.168.1.1 .1.3.6.1.2.1.2.2.1.2.13 .1.3.6.1.2.1.2.2.1.2.13 = STRING: FastEthernet0/13
เราก็จะได้คำตอบว่า MAC Address (0.16.55.66.77.12 => 00:10:37:42:4d:0c) ซึ่งอยู่ใน VLAN 888 ต่อเข้ากับพอร์ต FastEthernet0/13 ของ Switch ที่มี ip address: 192.168.1.1
ข้อมูลอ้างอิง
มันหาได้แต่ MAC ของขา Interface
4.Get the bridge port to ifIndex mapping, dot1dBasePortIfIndex (.1.3.6.1.2.1.17.1.4.1.2).