
एक OpenFlow स्निफ़र जो प्रोडक्शन नेटवर्कों में नेटवर्क समस्या निवारण में सहायता करता है।
OFP_Sniffer एक OpenFlow स्निफ़र है जिसका उपयोग समस्या निवारण और सीखने के उद्देश्यों के लिए किया जाता है।
वर्तमान में संस्करण 1.2 पर, यह सभी OpenFlow 1.0 संदेशों को विच्छेदित करता है, InfluxDB, Grafana और Slack के साथ काम करता है। OpenFlow 1.3 OFP_Sniffer संस्करण 1.3 पर उपलब्ध होगा (जल्द ही जारी किया जाएगा)।
यह सीधे Linux शेल पर काम करता है और वायर पर या libpcap फ़ाइलों से सभी OpenFlow संदेशों को विच्छेदित करता है। OFP_Sniffer का उपयोग करके, आप X11 या Wireshark खोले बिना आसानी से OpenFlow संदेशों और उनसे जुड़ी त्रुटियों (यदि कोई हो) को ट्रैक कर सकते हैं। OFP_Sniffer को AmLight SDN तैनाती (www.sdn.amlight.net) का समर्थन करने के लिए Python 3.6 में लिखा गया था। AmLight SDN Internet2 FlowSpace Firewall, OESS और On.Lab ONOS का उपयोग करता है, और इन ऐप्स का परीक्षण किया गया है और पूरी तरह से समर्थित हैं।
एक कमांड लाइन इंटरफ़ेस टूल के रूप में, इसके कुछ इनपुट पैरामीटर हैं:
# ./ofp_sniffer.py -h
Usage:
./ofp_sniffer.py [-p min|full] [-f pcap_filter] [-F filter_file] [-i dev] [-r pcap_file]
-p : print all TCP/IP headers. Default: min
-f pcap_filter or --pcap-filter=pcap_filter: add a libpcap filter
-F filters_file.json or --filters-file=filters.json
-i interface or --interface=interface. Default: eth0
-r captured.pcap or --src-file=captured.pcap
-T topology.json or --topology-file=topology.json
-w file or --save-to-file=file: save output to file provided
-o or --print-ovs : print using ovs-ofctl format
-h or --help : prints this help
-c or --no-colors: removes colors
-v or --version : prints version
-O WARN:CRIT or --oess-fvd=WARN:CRIT: monitor OESS FVD status
-N or --notify-via-slack: send notifications via Slack. Param is the Slack channel
-S or --enable-statistics: creates statistics
संस्करण 1.0 से शुरू करके, विशिष्ट आवश्यकताओं को संभालने के लिए ऐप्स का समर्थन किया जाता है, जैसे OESS FVD संदेशों को ट्रैक करना या REST के माध्यम से सांख्यिकी बनाना और NMSes (जैसे, Zabbix) में एकीकृत करना।
अधिक जानकारी: https://amlight.net/wp-content/uploads/2015/03/wpeif-2016-ofpsniffer.pdf
##################### स्थापना ######################
Requires Python 3.6
git clone https://github.com/amlight/ofp_sniffer.git
cd ofp_sniffer
pip3.6 install -r docs/requirements.txt
sudo ./ofp_sniffer.py
##################### उदाहरण #########################
उदाहरण नीचे दिए गए हैं:
---------------------- -------------------------
| Mininet | | OVS-OFCTL 2.3.0 |
| 192.168.56.101:6634| <-------> | eth1 - 192.168.56.102 |
---------------------- -------------------------
# ovs-ofctl dump-flows tcp:192.168.56.101:6634
cookie=0x0, duration=2183.377s, table=0, n_packets=0, n_bytes=0, idle_age=2183, in_port=1,dl_vlan=2 actions=output:2
# ./ofp_sniffer.py -i eth1 -f " or port 6634"
Sniffing device eth1
2015-09-13 11:47:38.655503 192.168.56.102:37450 -> 192.168.56.101:6634 Size: 74
OpenFlow Version: 1.0(1) Type: Hello(0) Length: 8 XID: 1
1 OpenFlow Hello
2015-09-13 11:47:38.656964 192.168.56.101:6634 -> 192.168.56.102:37450 Size: 74
OpenFlow Version: 1.0(1) Type: Hello(0) Length: 8 XID: 174
174 OpenFlow Hello
2015-09-13 11:47:38.657638 192.168.56.102:37450 -> 192.168.56.101:6634 Size: 86
OpenFlow Version: 1.0(1) Type: Vendor(4) Length: 20 XID: 2
2 OpenFlow Vendor : NICIRA(0x2320)
2 OpenFlow Vendor Data: 12 2
2015-09-13 11:47:38.657870 192.168.56.102:37450 -> 192.168.56.101:6634 Size: 74
OpenFlow Version: 1.0(1) Type: BarrierReq(18) Length: 8 XID: 3
3 OpenFlow Barrier Request
2015-09-13 11:47:38.659270 192.168.56.101:6634 -> 192.168.56.102:37450 Size: 74
OpenFlow Version: 1.0(1) Type: BarrierRes(19) Length: 8 XID: 3
3 OpenFlow Barrier Reply
# ovs-ofctl add-flow tcp:192.168.56.101:6634 "dl_dst=10:00:00:01:20:00,dl_type=0x88bc actions=mod_vlan_vid:14,output:2"
# ./ofp_sniffer.py -i eth1 -f " or port 6634"
2015-09-13 11:49:08.171463 192.168.56.102:37451 -> 192.168.56.101:6634 Size: 154
OpenFlow Version: 1.0(1) Type: FlowMod(14) Length: 88 XID: 2
2 OpenFlow Match - wildcards: 3678439 dl_type: 0x88bc dl_dst: 10:00:00:01:20:00
2 OpenFlow Body - Cookie: 0x00 Command: Add(0) Idle/Hard Timeouts: 0/0 Priority: 32768 Buffer ID: 0xffffffff Out Port: 65535 Flags: Unknown Flag(0)
2 OpenFlow Action - Type: SetVLANID Length: 8 VLAN ID: 14 Pad: 0
2 OpenFlow Action - Type: OUTPUT Length: 8 Port: 2 Max Length: 0
# ovs-ofctl del-flows tcp:192.168.56.101:6634 "dl_type=0x88bc,dl_dst=10:00:00:01:20:00, "
2015-09-13 11:50:43.636925 192.168.56.102:37454 -> 192.168.56.101:6634 Size: 138
OpenFlow Version: 1.0(1) Type: FlowMod(14) Length: 72 XID: 2
2 OpenFlow Match - wildcards: 3678439 dl_type: 0x88bc dl_dst: 10:00:00:01:20:00
2 OpenFlow Body - Cookie: 0x00 Command: Delete(3) Idle/Hard Timeouts: 0/0 Priority: 32768 Buffer ID: 0xffffffff Out Port: 65535 Flags: Unknown Flag(0)
# ovs-ofctl add-flow tcp:192.168.56.101:6634 "dl_dst=10:00:00:01:20:00,dl_type=0x88bc actions=mod_vlan_vid:14,output:2"
2015-09-13 11:52:58.563737 192.168.56.102:37455 -> 192.168.56.101:6634 Size: 154
OpenFlow Version: 1.0(1) Type: FlowMod(14) Length: 88 XID: 2
2 OpenFlow Match - wildcards: 3678439 dl_type: 0x88bc dl_dst: 10:00:00:01:20:00
2 OpenFlow Body - Cookie: 0x00 Command: Add(0) Idle/Hard Timeouts: 0/0 Priority: 32768 Buffer ID: 0xffffffff Out Port: 65535 Flags: Unknown Flag(0)
2 OpenFlow Action - Type: SetVLANID Length: 8 VLAN ID: 14 Pad: 0
2 OpenFlow Action - Type: OUTPUT Length: 8 Port: 2 Max Length: 0
फ़िल्टर का उपयोग करना:
विकल्प -F ./filters.json का उपयोग करते समय, आपके पास कुछ विकल्प होंगे:
"rejected_of_types": उन OpenFlow संदेश प्रकारों का चयन करने के लिए उपयोग किया जाता है जिन्हें आप नहीं देखना चाहते। आप OpenFlow संस्करण के आधार पर अलग-अलग फ़िल्टर परिभाषित कर सकते हैं।
Ethertype द्वारा फ़िल्टर:
यदि आप PacketOut या PacketIn संदेशों द्वारा ले जाए जा रहे किसी विशिष्ट Ethertype की तलाश कर रहे हैं, तो आप अन्य सभी को अस्वीकार कर सकते हैं, जिससे आपको आसान विज़ुअलाइज़ेशन मिलता है।
उदाहरण:
"filters":{
"ethertypes": {
"lldp" : 0,
"fvd" : 0,
"arp" : 1,
"others": [ "88b5" ]
},
"packetIn_filter": {
"switch_dpid": "any",
"in_port": "any"
},
"packetOut_filter": {
"switch_dpid": "any",
"out_port": "any"
}
}
}
ethertype अनुभाग में, 1 का अर्थ है फ़िल्टर करें, 0 का अर्थ है इसे प्रिंट करें। दिए गए उदाहरण में, ARP संदेश नहीं दिखाए जाएंगे, जबकि OESS FVD और LLDP दिखाए जाएंगे। आप "others" अनुभाग में Ethertype का हेक्स नंबर (0x के बिना) जोड़ सकते हैं, बस कॉमा (",") लगाकर।
"packetIn_filter": यह परिभाषित करने के लिए उपयोग किया जाता है कि आप कौन से PacketIn + LLDP संदेश देखना चाहते हैं। आप प्रति स्विच और/या प्रति पोर्ट परिभाषित कर सकते हैं। स्विच के लिए, आपको उस datapath_id का उपयोग करना होगा जैसा कि आपके द्वारा उपयोग किए जा रहे एप्लिकेशन द्वारा देखा जाता है। उदाहरण के लिए, कुछ ऐप्स c_id फ़ील्ड को of:dpid_id से भरते हैं, अन्य dpid:dpid_id से। पोर्ट के लिए, OpenFlow port_id का उपयोग करें, न कि पोर्ट का नाम। उदाहरण के लिए, Brocade पर, eth1/1 == 1 है। इसलिए eth1/1 के बजाय 1 का उपयोग करें।
"packetOut_filter": यह परिभाषित करने के लिए उपयोग किया जाता है कि आप कौन से PacketOut + LLDP संदेश देखना चाहते हैं। आप प्रति स्विच और/या प्रति पोर्ट परिभाषित कर सकते हैं। स्विच के लिए, आपको उस datapath_id का उपयोग करना होगा जैसा कि आपके द्वारा उपयोग किए जा रहे एप्लिकेशन द्वारा देखा जाता है। उदाहरण के लिए, कुछ ऐप्स c_id फ़ील्ड को of:dpid_id से भरते हैं, अन्य dpid:dpid_id से। पोर्ट के लिए, OpenFlow port_id का उपयोग करें, न कि पोर्ट का नाम। उदाहरण के लिए, Brocade पर, eth1/1 == 1 है। इसलिए eth1/1 के बजाय 1 का उपयोग करें।
OpenFlow प्रॉक्सी के लिए समर्थन:
OpenFlow प्रॉक्सी का उपयोग करते समय, आपके द्वारा स्निफ़ करने के लिए चुने गए इंटरफ़ेस के आधार पर, आप दो संभावनाओं में से एक देखेंगे:
IP_Controller <-> IP_Proxy IP_Proxy <-> IP_Switch
यह पहचानना मुश्किल है कि कौन सा कंट्रोलर किस स्विच से बात कर रहा है। इस समस्या निवारण को आसान बनाने के लिए, OpenFlow स्निफ़र स्वचालित रूप से {(IP, port): name_switch} का एक शब्दकोश बनाने के लिए सभी PacketOut + LLDP संदेशों की निगरानी करता है। यदि यह आपका मामला है, तो फ़ाइल docs/topology.json बदलें। अगली बार जब आप स्निफ़र चलाएंगे, तो आपको IP और कोष्ठकों में प्रॉक्सी के पीछे का उपकरण दिखाई देगा। उदाहरण:
2015-12-16 15:37:41.563621 200.0.207.79(andes1):7801 -> 190.103.184.135:6633 Size: 157 Bytes
OpenFlow Version: 1.0(1) Type: PacketIn(10) Length: 103 XID: 0
0 PacketIn: buffer_id: 0xffffffff total_len: 85 in_port: 49 reason: OFPR_NO_MATCH(0) pad: 0
0 Ethernet: Destination MAC: ff:ff:ff:ff:ff:ff Source MAC: de:ad:be:ef:ba:11 Protocol: 0x8100
0 Ethernet: Prio: 0 CFI: 0 VID: 3720
0 LLDP: Chassis Type(1) Length: 7 SubType: 4 ID: of:cc4e249102000000
0 LLDP: Port Type(2) Length: 5 SubType: 2 ID: 2
0 LLDP: TTL(3) Length: 2 Seconds: 120
0 LLDP: END(0) Length: 0
2015-12-16 15:37:41.564414 190.103.184.133(andes1):56132 -> 190.103.187.72:6633 Size: 165 Bytes
OpenFlow Version: 1.0(1) Type: PacketIn(10) Length: 99 XID: 0
0 PacketIn: buffer_id: 0xffffffff total_len: 81 in_port: 49 reason: OFPR_NO_MATCH(0) pad: 0
0 Ethernet: Destination MAC: ff:ff:ff:ff:ff:ff Source MAC: de:ad:be:ef:ba:11 Protocol: 0x8942
0 LLDP: Chassis Type(1) Length: 7 SubType: 4 ID: of:cc4e249102000000
0 LLDP: Port Type(2) Length: 5 SubType: 2 ID: 2
0 LLDP: TTL(3) Length: 2 Seconds: 120
0 LLDP: END(0) Length: 0
नाम (andes1) एक स्विच को दर्शाता है जिसे "andes1" कहा जाता है जिसका DPID cc4e249126000000 है। ध्यान दें कि उदाहरण में दिखाया गया DPID समान नहीं है, क्योंकि एक PacketIn संदेश को एक उदाहरण के रूप में उपयोग किया जा रहा है। PacketIn "andes1" के पड़ोसियों का DPID दिखाता है।
मुझे उम्मीद है कि यह कोड आपकी मदद करेगा।
प्रश्न/सुझाव: AmLight Dev Team [email protected]