बर्कले पैकेट फ़िल्टर: Difference between revisions

From Vigyanwiki
No edit summary
Line 1: Line 1:
बर्कले पैकेट फ़िल्टर (बीपीएफ) एक ऐसी तकनीक है जिसका उपयोग कुछ कंप्यूटर ऑपरेटिंग सिस्टम में प्रोग्राम के लिए किया जाता है, जिसमें अन्य बातों के अलावा, नेटवर्क ट्रैफ़िक का विश्लेषण करने की आवश्यकता होती है। यह डेटा लिंक परतों को एक अप्रशिक्षित अंतरापृष्ठ प्रदान करता है, अप्रशिक्षित लिंक-लेयर पैकेट को भेजने और प्राप्त करने की अनुमति देता है।<ref name="bpf93" /> इसके अलावा, यदि नेटवर्क इंटरफ़ेस के लिए ड्राइवर प्रोमिसक्यूअस मोड का समर्थन करता है, तो यह इंटरफ़ेस को उस मोड में डालने की अनुमति देता है ताकि नेटवर्क पर सभी पैकेट प्राप्त किए जा सकें, यहां तक कि अन्य होस्ट के लिए भी नियत किए जा सकें।{{Short description|Interface to data link layers on a Unix-like system}}
बर्कले पैकेट फ़िल्टर (बीपीएफ) एक ऐसी तकनीक है जिसका उपयोग कुछ कंप्यूटर ऑपरेटिंग सिस्टम में प्रोग्राम के लिए किया जाता है, जिसमें अन्य बातों के अलावा, नेटवर्क ट्रैफ़िक का विश्लेषण करने की आवश्यकता होती है। यह डेटा लिंक परतों को एक अप्रशिक्षित अंतरापृष्ठ प्रदान करता है, अप्रशिक्षित लिंक-लेयर पैकेट को भेजने और प्राप्त करने की अनुमति देता है।<ref name="bpf93">{{cite web
| url=http://www.tcpdump.org/papers/bpf-usenix93.pdf
| title=The BSD Packet Filter: A New Architecture for User-level Packet Capture
| first1=Steven
| last1=McCanne
| first2=Van
| last2=Jacobson
| date=1992-12-19}}</ref> इसके अलावा, यदि नेटवर्क इंटरफ़ेस के लिए ड्राइवर प्रोमिसक्यूअस मोड का समर्थन करता है, तो यह इंटरफ़ेस को उस मोड में डालने की अनुमति देता है ताकि नेटवर्क पर सभी पैकेट प्राप्त किए जा सकें, यहां तक कि अन्य होस्ट के लिए भी नियत किए जा सकें।{{Short description|Interface to data link layers on a Unix-like system}}
बीपीएफ फ़िल्टरिंग पैकेट का समर्थन करता है, एक यूज़रस्पेस प्रक्रिया को फ़िल्टर प्रोग्राम की आपूर्ति करने की अनुमति देता है जो निर्दिष्ट करता है कि कौन से पैकेट प्राप्त करना चाहते हैं। उदाहरण के लिए, एक टीसीपीडंप ([[tcpdump]]) प्रक्रिया केवल उन पैकेटों को प्राप्त करना चाहती है जो एक टीसीपी कनेक्शन आरंभ करते हैं। बीपीएफ केवल उन पैकेटों को लौटाता है जो उस फिल्टर को पास करते हैं जो प्रक्रिया प्रदान करती है। यह [[ऑपरेटिंग सिस्टम]] कर्नेल से अवांछित पैकेटों को प्रक्रिया में कॉपी करने से बचाता है, प्रदर्शन में काफी सुधार करता है। फ़िल्टर प्रोग्राम एक वर्चुअल मशीन के लिए निर्देशों के रूप में होता है, जिसे कर्नेल में जस्ट-इन-टाइम (जेआईटी) तंत्र द्वारा मशीन कोड में समझा या संकलित किया जाता है और निष्पादित किया जाता है।{{Infobox software
बीपीएफ फ़िल्टरिंग पैकेट का समर्थन करता है, एक यूज़रस्पेस प्रक्रिया को फ़िल्टर प्रोग्राम की आपूर्ति करने की अनुमति देता है जो निर्दिष्ट करता है कि कौन से पैकेट प्राप्त करना चाहते हैं। उदाहरण के लिए, एक टीसीपीडंप ([[tcpdump]]) प्रक्रिया केवल उन पैकेटों को प्राप्त करना चाहती है जो एक टीसीपी कनेक्शन आरंभ करते हैं। बीपीएफ केवल उन पैकेटों को लौटाता है जो उस फिल्टर को पास करते हैं जो प्रक्रिया प्रदान करती है। यह [[ऑपरेटिंग सिस्टम]] कर्नेल से अवांछित पैकेटों को प्रक्रिया में कॉपी करने से बचाता है, प्रदर्शन में काफी सुधार करता है। फ़िल्टर प्रोग्राम एक वर्चुअल मशीन के लिए निर्देशों के रूप में होता है, जिसे कर्नेल में जस्ट-इन-टाइम (जेआईटी) तंत्र द्वारा मशीन कोड में समझा या संकलित किया जाता है और निष्पादित किया जाता है।{{Infobox software
| name = Berkeley Packet Filter
| name = Berkeley Packet Filter
Line 6: Line 13:
| screenshot =  
| screenshot =  
| caption =  
| caption =  
| developer = Steven McCanne,<br />Van Jacobson
| developer = स्टीवन मैककेन,<br />वैन जैकबसन
| released = {{Start date and age|1992|12|19}}
| released = {{Start date and age|1992|12|19}}
| latest release version =  
| latest release version =  
Line 14: Line 21:
| repo =  
| repo =  
| programming language =  
| programming language =  
| operating system = [[Unix-like]] ([[FreeBSD]], [[OpenBSD]], [[NetBSD]], [[DragonFly BSD]], [[macOS]], [[Oracle Solaris]] 11 and later, [[AIX]], [[Tru64]], [[Linux]], [[PlayStation 4 system software|Orbis]]), [[Microsoft Windows|Windows]]
| operating system = [[यूनिक्स-लाइक]] ([[फ्रीबीएसडी]], [[ओपनबीएसडी]], [[नेटबीएसडी]], [[ड्रैगनफ्लाई बीएसडी]], [[मैकओएस]], [[ओरेकल सोलारिस]]<nowiki> 11 और बाद में, [ [AIX]], </nowiki>[[Tru64]], [[लिनक्स]], [[प्लेस्टेशन 4 सिस्टम सॉफ्टवेयर|ऑर्बिस]]), [[माइक्रोसॉफ्ट विंडोज|विंडोज]]
| platform =  
| platform =  
| size =  
| size =  
Line 27: Line 34:


[[लिनक्स]] कर्नेल बीपीएफ फ़िल्टरिंग तंत्र का एक विस्तारित संस्करण प्रदान करता है, जिसे ईबीपीएफ कहा जाता है, जो एक जेआईटी तंत्र का उपयोग करता है, और पैकेट फ़िल्टरिंग के साथ-साथ कर्नेल में अन्य उद्देश्यों के लिए उपयोग किया जाता है। ईबीपीएफ माइक्रोसॉफ्ट विंडोज के लिए भी उपलब्ध है।<ref>{{cite web|date=2021-05-11|title=Microsoft embraces Linux kernel's eBPF super-tool, extends it for Windows|url=https://www.theregister.com/2021/05/11/microsoft_linux_ebpf/|url-status=live|publisher=[[The Register]]|archive-url=https://web.archive.org/web/20210511072812/https://www.theregister.com/2021/05/11/microsoft_linux_ebpf/ |archive-date=2021-05-11 }}</ref>
[[लिनक्स]] कर्नेल बीपीएफ फ़िल्टरिंग तंत्र का एक विस्तारित संस्करण प्रदान करता है, जिसे ईबीपीएफ कहा जाता है, जो एक जेआईटी तंत्र का उपयोग करता है, और पैकेट फ़िल्टरिंग के साथ-साथ कर्नेल में अन्य उद्देश्यों के लिए उपयोग किया जाता है। ईबीपीएफ माइक्रोसॉफ्ट विंडोज के लिए भी उपलब्ध है।<ref>{{cite web|date=2021-05-11|title=Microsoft embraces Linux kernel's eBPF super-tool, extends it for Windows|url=https://www.theregister.com/2021/05/11/microsoft_linux_ebpf/|url-status=live|publisher=[[The Register]]|archive-url=https://web.archive.org/web/20210511072812/https://www.theregister.com/2021/05/11/microsoft_linux_ebpf/ |archive-date=2021-05-11 }}</ref>
== कच्चा डेटा-लिंक इंटरफ़ेस ==
== रॉ डेटा-लिंक इंटरफेस ==
बीपीएफ छद्म उपकरण प्रदान करता है जो एक नेटवर्क इंटरफेस के लिए बाध्य हो सकता है; डिवाइस से पढ़ता है नेटवर्क इंटरफ़ेस पर प्राप्त पैकेटों से भरे बफ़र्स को पढ़ेगा, और डिवाइस को लिखता है नेटवर्क इंटरफ़ेस पर पैकेट इंजेक्ट करेगा।
बीपीएफ छद्म उपकरण प्रदान करता है जो एक नेटवर्क इंटरफेस के लिए बाध्य हो सकता है; डिवाइस से पढ़ता है नेटवर्क इंटरफ़ेस पर प्राप्त पैकेटों से भरे बफ़र्स को पढ़ेगा, और डिवाइस को लिखता है नेटवर्क इंटरफ़ेस पर पैकेट इंजेक्ट करेगा।


2007 में, [[रॉबर्ट वाटसन (कंप्यूटर वैज्ञानिक)]] और क्रिश्चियन पेरोन ने [[FreeBSD]] ऑपरेटिंग सिस्टम में BPF कार्यान्वयन के लिए शून्य-कॉपी बफर एक्सटेंशन जोड़े,<ref>{{cite web
2007 में, [[रॉबर्ट वाटसन (कंप्यूटर वैज्ञानिक)|रॉबर्ट वाटसन]] और क्रिश्चियन पेरोन ने फ्रीबीएसडी ऑपरेटिंग सिस्टम में बीपीएफ कार्यान्वयन के लिए शून्य-कॉपी बफर एक्सटेंशन जोड़े,<ref>{{cite web
| url=https://www.freebsd.org/cgi/man.cgi?query=bpf
| url=https://www.freebsd.org/cgi/man.cgi?query=bpf
| title=bpf(4) Berkeley Packet Filter
| title=bpf(4) Berkeley Packet Filter
| date=2010-06-15
| date=2010-06-15
| publisher=[[FreeBSD]]}}</ref> BPF डिवाइस के माध्यम से प्राप्त सभी पैकेट डेटा के लिए दो प्रतियों की आवश्यकता से बचने के लिए डिवाइस ड्राइवर में कर्नेल पैकेट कैप्चर की अनुमति सीधे उपयोगकर्ता प्रोसेस मेमोरी में लिखने के लिए हैंडलर को बाधित करता है। जबकि एक प्रति उपयोगकर्ता प्रक्रियाओं के लिए रसीद पथ में बनी हुई है, यह विभिन्न बीपीएफ डिवाइस उपभोक्ताओं की स्वतंत्रता को बरकरार रखती है, साथ ही साथ पैकेट डेटा को कॉपी करने के बजाय बीपीएफ बफर में हेडर की पैकिंग की अनुमति देती है।<ref>{{cite web
| publisher=[[FreeBSD]]}}</ref> आवश्यकता से बचने के लिए डिवाइस ड्राइवर इंटरप्ट हैंडलर में कर्नेल पैकेट कैप्चर को सीधे यूजर प्रोसेस मेमोरी में लिखने की अनुमति देता है। बीपीएफ डिवाइस के माध्यम से प्राप्त सभी पैकेट डेटा के लिए दो प्रतियों के लिए। जबकि एक प्रति उपयोगकर्ता प्रक्रियाओं के लिए रसीद पथ में रहती है, यह विभिन्न बीपीएफ डिवाइस उपभोक्ताओं की स्वतंत्रता को बरकरार रखती है, साथ ही पूरे पैकेट डेटा की नकल करने के बजाय बीपीएफ बफर में हेडर की पैकिंग की अनुमति देती है।<ref>{{cite web
| url=http://www.watson.org/~robert/freebsd/2007asiabsdcon/20070309-devsummit-zerocopybpf.pdf
| url=http://www.watson.org/~robert/freebsd/2007asiabsdcon/20070309-devsummit-zerocopybpf.pdf
| title=Zero-Copy BPF
| title=Zero-Copy BPF
Line 42: Line 49:
| last2=Peron
| last2=Peron
| date=2007-03-09}}</ref>
| date=2007-03-09}}</ref>


== फ़िल्टरिंग ==
== फ़िल्टरिंग ==
BPF की फ़िल्टरिंग क्षमताओं को BPF वर्चुअल मशीन के लिए एक मशीनी भाषा के लिए एक दुभाषिया के रूप में लागू किया जाता है, एक 32-[[अंश]] मशीन जिसमें निश्चित-लंबाई के निर्देश, एक [[संचायक (कंप्यूटिंग)]], और एक [[सूचकांक रजिस्टर]] होता है। उस भाषा में प्रोग्राम पैकेट से डेटा प्राप्त कर सकते हैं, पैकेट से डेटा पर [[अंकगणित]]ीय संचालन कर सकते हैं, और परिणामों के परिणामों के आधार पर पैकेट को स्वीकार या अस्वीकार करते हुए परिणामों में स्थिरांक या पैकेट में डेटा के खिलाफ परिणामों की तुलना कर सकते हैं या बिट्स का परीक्षण कर सकते हैं। परीक्षण।
बीपीएफ की फ़िल्टरिंग क्षमताओं को बीपीएफ वर्चुअल मशीन के लिए एक मशीनी भाषा के लिए एक दुभाषिया के रूप में लागू किया जाता है, एक 32-बिट मशीन जिसमें निश्चित-लंबाई के निर्देश, एक संचायक और एक [[सूचकांक रजिस्टर]] होता है। उस भाषा में प्रोग्राम पैकेट से डेटा प्राप्त कर सकते हैं, पैकेट से डेटा पर अंकगणितीय संचालन कर सकते हैं, और परिणाम की तुलना स्थिरांक या पैकेट में डेटा के विरुद्ध या परिणामों में परीक्षण बिट्स से कर सकते हैं, उन परीक्षणों के परिणामों के आधार पर पैकेट को स्वीकार या अस्वीकार करना है।


BPF को अक्सर लोड (ld) और स्टोर (str) निर्देशों को ओवरलोड करके बढ़ाया जाता है।
बीपीएफ को अक्सर लोड (एलडी) और स्टोर (एसटीआर) निर्देशों को "ओवरलोडिंग" करके बढ़ाया जाता है।  


कर्नेल-स्पेस के लिए लिखे जाने के बावजूद, पारंपरिक यूनिक्स-जैसे BPF कार्यान्वयन का उपयोग यूजरस्पेस में किया जा सकता है। यह [[preprocessor]] स्थितियों का उपयोग करके पूरा किया जाता है।
कर्नेल स्थान के लिए लिखे जाने के बावजूद, पारंपरिक यूनिक्स-जैसे बीपीएफ कार्यान्वयन का उपयोग यूजरस्पेस में किया जा सकता है। यह प्रीप्रोसेसर स्थितियों का उपयोग करके पूरा किया जाता है।


=== {{Anchor|EBPF}}एक्सटेंशन और अनुकूलन ===
=== एक्सटेंशन और ऑप्टिमाइज़ेशन (विस्तार और अनुकूलन) ===
कुछ प्रोजेक्ट BPF इंस्ट्रक्शन सेट या मूल से भिन्न निष्पादन तकनीकों का उपयोग करते हैं।
कुछ प्रोजेक्ट बीपीएफ निर्देश समूह या निष्पादन तकनीक का उपयोग मूल से अलग करते हैं।


FreeBSD, [[NetBSD]], और [[WinPcap]] सहित कुछ प्लेटफ़ॉर्म, प्रदर्शन को बेहतर बनाने के लिए BPF निर्देशों को देशी कोड में बदलने के लिए जस्ट-इन-टाइम संकलन|जस्ट-इन-टाइम (JIT) कंपाइलर का उपयोग करते हैं। लिनक्स में एक बीपीएफ जेआईटी कंपाइलर शामिल है जो डिफ़ॉल्ट रूप से अक्षम है।
फ्रीबीएसडी, नेटबीएसडी, और विनकैप सहित कुछ प्लेटफ़ॉर्म, प्रदर्शन को बेहतर बनाने के लिए बीपीएफ निर्देशों को देशी कोड में बदलने के लिए जस्ट-इन-टाइम (जेआईटी) कंपाइलर का उपयोग करते हैं। लिनक्स में एक बीपीएफ जेआईटी कंपाइलर शामिल है जो पूर्व निर्धारित रूप से अक्षम है।


उसी वर्चुअल मशीन भाषा के लिए कर्नेल-मोड दुभाषियों का उपयोग अन्य ऑपरेटिंग सिस्टमों में कच्चे डेटा लिंक परत तंत्र में किया जाता है, जैसे कि [[Tru64 यूनिक्स]], और [[लिनक्स कर्नेल]] में सॉकेट फिल्टर के लिए और WinPcap और [[Npcap]] पैकेट कैप्चर तंत्र में।
उसी वर्चुअल मशीन भाषा के लिए कर्नेल-मोड दुभाषियों का उपयोग अन्य ऑपरेटिंग सिस्टमों में रॉ डेटा लिंक लेयर तंत्र में किया जाता है, जैसे कि ट्रू64 [[Tru64 यूनिक्स|यूनिक्स]], और [[लिनक्स कर्नेल]] में सॉकेट फिल्टर के लिए और विनपैक और एनपीकैप पैकेट कैप्चर तंत्र में भी किया जाता है।


संस्करण 3.18 के बाद से, लिनक्स कर्नेल में दस 64-बिट रजिस्टरों के साथ एक विस्तारित बीपीएफ वर्चुअल मशीन शामिल है, जिसे विस्तारित बीपीएफ (ईबीपीएफ) कहा जाता है। इसका उपयोग गैर-नेटवर्किंग उद्देश्यों के लिए किया जा सकता है, जैसे कि ईबीपीएफ प्रोग्राम को विभिन्न [[ट्रेसपॉइंट]]्स से जोड़ने के लिए।<ref>{{cite web
संस्करण 3.18 के बाद से, लिनक्स कर्नेल में एक विस्तारित बीपीएफ वर्चुअल मशीन शामिल है जिसमें दस 64-बिट रजिस्टर हैं, जिन्हें विस्तारित बीपीएफ (ईबीपीएफ) कहा जाता है। इसका उपयोग गैर-नेटवर्किंग उद्देश्यों के लिए किया जा सकता है, जैसे कि ईबीपीएफ कार्यक्रमों को विभिन्न [[ट्रेसपॉइंट|ट्रेस]] बिंदुओं से जोड़ने के लिए।<ref>{{cite web
  | url = https://kernelnewbies.org/Linux_3.18#bpf.28.29_syscall_for_eBFP_virtual_machine_programs
  | url = https://kernelnewbies.org/Linux_3.18#bpf.28.29_syscall_for_eBFP_virtual_machine_programs
  | title = Linux kernel 3.18, Section 1.3. bpf() syscall for eBFP virtual machine programs
  | title = Linux kernel 3.18, Section 1.3. bpf() syscall for eBFP virtual machine programs
Line 73: Line 79:
  | date = July 2, 2014 | access-date = January 19, 2015
  | date = July 2, 2014 | access-date = January 19, 2015
  | author = Jonathan Corbet | publisher = [[LWN.net]]
  | author = Jonathan Corbet | publisher = [[LWN.net]]
}}</ref> कर्नेल संस्करण 3.19 के बाद से, eBPF फ़िल्टर को [[नेटवर्क सॉकेट]] से जोड़ा जा सकता है,<ref>{{cite web
}}</ref> कर्नेल संस्करण 3.19 के बाद से, ईबीपीएफ फिल्टर सॉकेट्स से जुड़े जा सकते हैं,<ref>{{cite web
  | url = http://kernelnewbies.org/Linux_3.19#head-e1397cd703dde28f199acad3632093686fb51ea9
  | url = http://kernelnewbies.org/Linux_3.19#head-e1397cd703dde28f199acad3632093686fb51ea9
  | title = Linux kernel 3.19, Section 11. Networking
  | title = Linux kernel 3.19, Section 11. Networking
Line 83: Line 89:
  | date = December 10, 2014 | access-date = February 13, 2015
  | date = December 10, 2014 | access-date = February 13, 2015
  | author = Jonathan Corbet | publisher = [[LWN.net]]
  | author = Jonathan Corbet | publisher = [[LWN.net]]
}}</ref> और, कर्नेल संस्करण 4.1 के बाद से, प्रवेश और निकास नेटवर्किंग डेटा पथ के लिए [[टीसी (लिनक्स)]] क्लासिफायर के लिए।<ref>{{cite web
}}</ref> और, कर्नेल संस्करण 4.1 के बाद से, प्रवेश और निकास नेटवर्किंग डेटा पथ के लिए ट्रैफिक कंट्रोल क्लासिफायर के लिए।<ref>{{cite web
  | url = http://kernelnewbies.org/Linux_4.1#head-c64a7aa1ccb73618b4a7b5f3bef64ff435738098
  | url = http://kernelnewbies.org/Linux_4.1#head-c64a7aa1ccb73618b4a7b5f3bef64ff435738098
  | title = Linux kernel 4.1, Section 11. Networking
  | title = Linux kernel 4.1, Section 11. Networking
Line 93: Line 99:
  | date = April 24, 2017 | access-date = April 23, 2018
  | date = April 24, 2017 | access-date = April 23, 2018
  | website = cilium.readthedocs.io
  | website = cilium.readthedocs.io
}}</ref> मूल और अप्रचलित संस्करण को पूर्वव्यापी प्रभाव से बदलकर क्लासिक BPF (cBPF) कर दिया गया है। आजकल, लिनक्स कर्नेल केवल ईबीपीएफ चलाता है और लोड किए गए सीबीपीएफ बायटेकोड को प्रोग्राम निष्पादन से पहले कर्नेल में ईबीपीएफ प्रतिनिधित्व में पारदर्शी रूप से अनुवादित किया जाता है।<ref>{{Cite web|url=https://docs.cilium.io/en/v1.6/bpf/|title=BPF and XDP Reference Guide — Cilium 1.6.5 documentation|website=docs.cilium.io|access-date=2019-12-18}}</ref> डिनायल-ऑफ़-सर्विस हमलों को रोकने के लिए चलाने से पहले सभी बायटेकोड सत्यापित किए जाते हैं। लिनक्स 5.3 तक, सत्यापनकर्ता ने संभावित असीमित निष्पादन समय को रोकने के लिए लूप के उपयोग को प्रतिबंधित किया; परिबद्ध निष्पादन समय के साथ लूप्स को अब हाल ही के कर्नेल में अनुमति दी गई है।<ref>{{cite web
}}</ref> मूल और अप्रचलित संस्करण को पूर्वव्यापी प्रभाव से क्लासिक बीपीएफ (सीबीपीएफ) में बदल दिया गया है। आजकल, लिनक्स कर्नेल केवल ईबीपीएफ चलाता है और लोडेड सीबीपीएफ बायटेकोड प्रोग्राम निष्पादन से पहले कर्नेल में एक ईबीपीएफ प्रस्तुति में पारदर्शी रूप से अनुवादित होता है।<ref>{{Cite web|url=https://docs.cilium.io/en/v1.6/bpf/|title=BPF and XDP Reference Guide — Cilium 1.6.5 documentation|website=docs.cilium.io|access-date=2019-12-18}}</ref> डिनायल-ऑफ़-सर्विस हमलों को रोकने के लिए चलने से पहले सभी बाइटकोड सत्यापित किए जाते हैं। लिनक्स 5.3 तक, सत्यापनकर्ता ने संभावित असीमित निष्पादन समय को रोकने के लिए, लूप के उपयोग को प्रतिबंधित कर दिया; परिबद्ध निष्पादन समय के साथ लूप्स को अब हाल ही के कर्नेल में अनुमति दी गई है।<ref>{{cite web
  | url = https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=2589726d12a1b12eaaa93c7f1ea64287e383c7a5
  | url = https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=2589726d12a1b12eaaa93c7f1ea64287e383c7a5
  | title = bpf: introduce bounded loops
  | title = bpf: introduce bounded loops
Line 99: Line 105:
  | website = git.kernel.org
  | website = git.kernel.org
}}</ref>
}}</ref>
बीपीएफ के लिए एक उपयोगकर्ता-मोड दुभाषिया को [[pcap]] [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]] के libpcap/WinPcap/Npcap कार्यान्वयन के साथ प्रदान किया जाता है, ताकि, उस फ़िल्टरिंग तंत्र के लिए कर्नेल-मोड समर्थन के बिना सिस्टम पर पैकेट कैप्चर करते समय, पैकेट को उपयोगकर्ता मोड में फ़िल्टर किया जा सके; pcap API का उपयोग करने वाला कोड दोनों प्रकार के सिस्टम पर काम करेगा, हालाँकि, उन सिस्टम पर जहाँ फ़िल्टरिंग उपयोगकर्ता मोड में की जाती है, फ़िल्टर किए जाने वाले पैकेट सहित सभी पैकेट, कर्नेल से यूज़र स्पेस में कॉपी किए जाते हैं। उस दुभाषिया का उपयोग तब भी किया जा सकता है जब pcap का उपयोग करके कैप्चर किए गए पैकेट वाली फ़ाइल को पढ़ा जाता है।
एक अन्य उपयोगकर्ता-मोड दुभाषिया uBPF है, जो JIT और eBPF (बिना cBPF) का समर्थन करता है। गैर-लिनक्स सिस्टम में ईबीपीएफ समर्थन प्रदान करने के लिए इसका कोड पुन: उपयोग किया गया है।<ref>{{cite web |title=generic-ebpf/generic-ebpf |url=https://github.com/generic-ebpf/generic-ebpf |website=GitHub |date=28 April 2022 |language=en}}</ref> विंडोज़ पर माइक्रोसॉफ्ट का eBPF uBPF और PREVAIL औपचारिक सत्यापनकर्ता पर निर्मित है।<ref>{{cite web |title=microsoft/ebpf-for-windows: eBPF implementation that runs on top of Windows |url=https://github.com/microsoft/ebpf-for-windows |website=GitHub |publisher=Microsoft |date=11 May 2021}}</ref> rBPF, uBPF का रस्ट रीराइट, सोलाना (ब्लॉकचैन प्लेटफॉर्म) ब्लॉकचैन प्लेटफॉर्म द्वारा निष्पादन इंजन के रूप में उपयोग किया जाता है।<ref>{{Cite web | url=https://docs.solana.com/developing/on-chain-programs/overview | title=Overview &#124; Solana Docs }}</ref>


बीपीएफ के लिए एक उपयोगकर्ता-मोड दुभाषिया को लिबपैक/विनपैक/एनपीकेपी एपीआई के कार्यान्वयन के साथ प्रदान किया जाता है, ताकि, उस फ़िल्टरिंग तंत्र के लिए कर्नेल-मोड समर्थन के बिना सिस्टम पर पैकेट कैप्चर करते समय, पैकेट को उपयोगकर्ता मोड में फ़िल्टर किया जा सके; पीसीएपी एपीआई का उपयोग करने वाला कोड दोनों प्रकार के सिस्टम पर काम करेगा, हालाँकि, उन सिस्टम पर जहाँ फ़िल्टरिंग उपयोगकर्ता मोड में की जाती है, फ़िल्टर किए जाने वाले पैकेट सहित सभी पैकेट, कर्नेल से यूज़र स्पेस में कॉपी किए जाते हैं। उस दुभाषिया का उपयोग तब भी किया जा सकता है जब पीसीएपी का उपयोग करके कैप्चर किए गए पैकेट वाली फ़ाइल को पढ़ा जाता है।


एक अन्य उपयोगकर्ता-मोड दुभाषिया यूबीपीएफ है, जो जेआईटी और ईबीपीएफ (सीबीपीएफ के बिना) का समर्थन करता है। इसके कोड को गैर-लिनक्स सिस्टम में ईबीपीएफ समर्थन प्रदान करने के लिए पुन: उपयोग किया गया है।<ref>{{cite web |title=generic-ebpf/generic-ebpf |url=https://github.com/generic-ebpf/generic-ebpf |website=GitHub |date=28 April 2022 |language=en}}</ref> विंडोज पर माइक्रोसॉफ्ट का ईबीपीएफ यूबीपीएफ और प्रचलित होना औपचारिक सत्यापनकर्ता पर बना है।<ref>{{cite web |title=microsoft/ebpf-for-windows: eBPF implementation that runs on top of Windows |url=https://github.com/microsoft/ebpf-for-windows |website=GitHub |publisher=Microsoft |date=11 May 2021}}</ref> आरबीपीएफ, यूबीपीएफ का एक रस्ट रीराइट, सोलाना ब्लॉकचैन प्लेटफॉर्म द्वारा निष्पादन इंजन के रूप में उपयोग किया जाता है।<ref>{{Cite web | url=https://docs.solana.com/developing/on-chain-programs/overview | title=Overview &#124; Solana Docs }}</ref>
== प्रोग्रामिंग ==
== प्रोग्रामिंग ==
क्लासिक बीपीएफ आमतौर पर मैच के पैटर्न का वर्णन करने वाले कुछ बहुत ही उच्च-स्तरीय पाठ्य नियम से एक कार्यक्रम द्वारा उत्सर्जित होता है। ऐसा ही एक प्रतिनिधित्व [[libpcap]] में पाया जाता है।<ref>{{cite web |title=BPF syntax |url=https://biot.com/capstats/bpf.html |website=biot.com}}</ref> क्लासिक बीपीएफ और ईबीपीएफ को या तो सीधे [[मशीन कोड]] के रूप में लिखा जा सकता है, या पाठ्य प्रतिनिधित्व के लिए असेंबली भाषा का उपयोग किया जा सकता है। उल्लेखनीय असेंबलरों में लिनक्स कर्नेल शामिल हैं {{code|bpf_asm}} उपकरण (सीबीपीएफ), {{code|bpfc}} (सीबीपीएफ), और {{code|ubpf}} असेंबलर (ईबीपीएफ)। {{code|bpftool}} }} कमांड बीपीएफ के दोनों स्वादों के लिए डिस्सेबलर के रूप में भी कार्य कर सकता है। असेंबली लैंग्वेज एक दूसरे के साथ जरूरी नहीं हैं।
क्लासिक बीपीएफ आमतौर पर मैच के पैटर्न का वर्णन करने वाले कुछ बहुत ही उच्च-स्तरीय पाठ्य नियम से एक कार्यक्रम द्वारा उत्सर्जित होता है। ऐसा ही एक प्रतिनिधित्व लिबकैप में पाया जाता है।<ref>{{cite web |title=BPF syntax |url=https://biot.com/capstats/bpf.html |website=biot.com}}</ref> क्लासिक बीपीएफ और ईबीपीएफ को या तो सीधे [[मशीन कोड]] के रूप में लिखा जा सकता है या टेक्स्टुअल प्रतिनिधित्व के लिए असेंबली भाषा का उपयोग किया जा सकता है। उल्लेखनीय असेंबलरों में लिनक्स कर्नेल का बीपीएफ_एएसएम टूल (सीबीपीएफ), बीपीएफसी (सीबीपीएफ) और यूबीपीएफ असेंबलर (ईबीपीएफ) शामिल हैं। बीपीएफटूल कमांड बीपीएफ के दोनों फ्लेवर के लिए डिस्सेबलर के रूप में भी कार्य कर सकता है। असेम्बली भाषाएँ आवश्यक रूप से एक दूसरे के अनुकूल नहीं हैं।
 
ईबीपीएफ बाइटकोड हाल ही में उच्च स्तरीय भाषाओं का लक्ष्य बन गया है। [[LLVM]] ने 2014 में eBPF समर्थन जोड़ा, और 2019 में GNU कंपाइलर संग्रह का पालन किया। दोनों टूलकिट C (प्रोग्रामिंग भाषा) और अन्य समर्थित भाषाओं को eBPF में संकलित करने की अनुमति देते हैं। P4 (प्रोग्रामिंग लैंग्वेज) का एक सबसेट भी BCC, एक LLVM- आधारित कंपाइलर किट का उपयोग करके eBPF में संकलित किया जा सकता है।<ref>{{cite web |title=Dive into BPF: a list of reading material |url=https://qmonnet.github.io/whirl-offload/2016/09/01/dive-into-bpf/ |website=qmonnet.github.io}}</ref>
 


ईबीपीएफ बाइटकोड हाल ही में उच्च स्तरीय भाषाओं का लक्ष्य बन गया है। एलएलवीएम ([[LLVM]]) ने 2014 में ईबीपीएफ समर्थन जोड़ा, और 2019 में जीसीसी का अनुसरण किया। दोनों टूलकिट सी और अन्य समर्थित भाषाओं को ईबीपीएफ में संकलित करने की अनुमति देते हैं। पी4 के एक उपसमुच्चय को बीसीसी, एक एलएलवीएम -आधारित संकलक किट का उपयोग करके ईबीपीएफ में संकलित किया जा सकता है।<ref>{{cite web |title=Dive into BPF: a list of reading material |url=https://qmonnet.github.io/whirl-offload/2016/09/01/dive-into-bpf/ |website=qmonnet.github.io}}</ref>
== इतिहास ==
== इतिहास ==
मूल पेपर 1992 में [[लॉरेंस बर्कले प्रयोगशाला]] में [[स्टीवन मैककैन]] और [[जैकबसन से]] द्वारा लिखा गया था।<ref name="bpf93">{{cite web
मूल पेपर 1992 में [[स्टीवन मैककैन]] और वैन [[जैकबसन से|जैकबसन]] द्वारा [[लॉरेंस बर्कले प्रयोगशाला]] में लिखा गया था।<ref name="bpf93" /><ref>{{cite web
| url=http://www.tcpdump.org/papers/bpf-usenix93.pdf
| title=The BSD Packet Filter: A New Architecture for User-level Packet Capture
| first1=Steven
| last1=McCanne
| first2=Van
| last2=Jacobson
| date=1992-12-19}}</ref><ref>{{cite web
| url=https://www.usenix.org/conference/usenix-winter-1993-conference/bsd-packet-filter-new-architecture-user-level-packet
| url=https://www.usenix.org/conference/usenix-winter-1993-conference/bsd-packet-filter-new-architecture-user-level-packet
| title=The BSD Packet Filter: A New Architecture for User-level Packet Capture
| title=The BSD Packet Filter: A New Architecture for User-level Packet Capture
Line 127: Line 123:
| date=January 1993
| date=January 1993
| publisher=[[USENIX]]}}</ref>
| publisher=[[USENIX]]}}</ref>
अगस्त 2003 में, [[एससीओ समूह]] ने सार्वजनिक रूप से दावा किया कि लिनक्स कर्नेल उनके स्वामित्व वाले यूनिक्स कोड का उल्लंघन कर रहा था।<ref>{{cite web|url=http://brucep.webfarmhosting.com/VegasSlideShow/frame.htm|title=SCOsource update|at=15 Obfuscated Copying|archive-url=https://web.archive.org/web/20030825025745/http://brucep.webfarmhosting.com/VegasSlideShow/frame.htm|archive-date=August 25, 2003|access-date=September 5, 2019|url-status=dead}}</ref> प्रोग्रामर्स को जल्दी पता चला कि उन्होंने जो एक उदाहरण दिया वह बर्कले पैकेट फ़िल्टर था, जो वास्तव में एससीओ के पास कभी नहीं था।<ref>{{cite web|url=http://perens.com/Articles/SCO/SCOSlideShow.html|title=Analysis of SCO's Las Vegas Slide Show|author=Bruce Perens|author-link=Bruce Perens|archive-url=https://web.archive.org/web/20090217185248/http://perens.com/Articles/SCO/SCOSlideShow.html|archive-date=February 17, 2009}}</ref> एससीओ ने गलती की व्याख्या या स्वीकार नहीं किया है लेकिन एससीओ-लिनक्स विवाद अंततः जवाब देने के लिए मजबूर कर सकता है।<ref>{{cite web |url=https://www.gnu.org/philosophy/sco/sco-without-fear.en.html |title=SCO: Without Fear and Without Research |last=Moglen |first=Eben |date=November 24, 2003 |website=GNU Operating System |publisher=The Free Software Foundation |access-date=September 5, 2019 }}</ref>{{Update inline|?=yes|date=November 2021}}


अगस्त 2003 में, [[एससीओ समूह]] ने सार्वजनिक रूप से दावा किया कि लिनक्स कर्नेल उनके स्वामित्व वाले यूनिक्स कोड का उल्लंघन कर रहा था।<ref>{{cite web|url=http://brucep.webfarmhosting.com/VegasSlideShow/frame.htm|title=SCOsource update|at=15 Obfuscated Copying|archive-url=https://web.archive.org/web/20030825025745/http://brucep.webfarmhosting.com/VegasSlideShow/frame.htm|archive-date=August 25, 2003|access-date=September 5, 2019|url-status=dead}}</ref> प्रोग्रामर्स को जल्दी पता चला कि उन्होंने जो एक उदाहरण दिया वह बर्कले पैकेट फ़िल्टर था, जो वास्तव में एससीओ के स्वामित्व में कभी नहीं था।<ref>{{cite web|url=http://perens.com/Articles/SCO/SCOSlideShow.html|title=Analysis of SCO's Las Vegas Slide Show|author=Bruce Perens|author-link=Bruce Perens|archive-url=https://web.archive.org/web/20090217185248/http://perens.com/Articles/SCO/SCOSlideShow.html|archive-date=February 17, 2009}}</ref> एससीओ ने गलती की व्याख्या या स्वीकार नहीं किया है लेकिन चल रही कानूनी कार्रवाई अंततः एक जवाब को मजबूर कर सकती है।<ref>{{cite web |url=https://www.gnu.org/philosophy/sco/sco-without-fear.en.html |title=SCO: Without Fear and Without Research |last=Moglen |first=Eben |date=November 24, 2003 |website=GNU Operating System |publisher=The Free Software Foundation |access-date=September 5, 2019 }}</ref>


== सुरक्षा चिंताएं ==
== सुरक्षा चिंताएं ==
[[स्पेक्टर (सुरक्षा भेद्यता)]] हमला अन्य कर्नेल प्रक्रियाओं से डेटा निकालने के लिए लिनक्स कर्नेल के eBPF दुभाषिया या JIT कंपाइलर का लाभ उठा सकता है।<ref>{{cite web
[[स्पेक्टर (सुरक्षा भेद्यता)|स्पेक्टर]] अटैक अन्य कर्नेल प्रक्रियाओं से डेटा निकालने के लिए लिनक्स कर्नेल के ईबीपीएफ इंटरप्रेटर या जेआईटी कंपाइलर का लाभ उठा सकता है।<ref>{{cite web
  | url = https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html
  | url = https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html
  | title = Reading privileged memory with a side-channel
  | title = Reading privileged memory with a side-channel
  | date = January 3, 2018 | access-date = January 20, 2018
  | date = January 3, 2018 | access-date = January 20, 2018
  | website = Project Zero team at Google
  | website = Project Zero team at Google
}}</ref> कर्नेल में एक जेआईटी सख्त सुविधा इस भेद्यता को कम करती है।<ref>{{Cite web|title=bpf: introduce BPF_JIT_ALWAYS_ON config|url=https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=290af86629b25ffd1ed6232c4e9107da031705cb|url-status=live|access-date=2021-09-20|website=git.kernel.org|archive-url=https://web.archive.org/web/20201019213843/https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=290af86629b25ffd1ed6232c4e9107da031705cb |archive-date=2020-10-19 }}</ref>
}}</ref> कर्नेल में एक जेआईटी हार्डनिंग फीचर इस भेद्यता को कम करता है।<ref>{{Cite web|title=bpf: introduce BPF_JIT_ALWAYS_ON config|url=https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=290af86629b25ffd1ed6232c4e9107da031705cb|url-status=live|access-date=2021-09-20|website=git.kernel.org|archive-url=https://web.archive.org/web/20201019213843/https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=290af86629b25ffd1ed6232c4e9107da031705cb |archive-date=2020-10-19 }}</ref>
चीनी कंप्यूटर सुरक्षा समूह पंगु लैब ने कहा कि [[राष्ट्रीय सुरक्षा एजेंसी]] ने एक जटिल लिनक्स [[पिछले दरवाजे (कंप्यूटिंग)]] के हिस्से के रूप में नेटवर्क संचार को छिपाने के लिए बीपीएफ का इस्तेमाल किया।<ref>{{cite web
 
चीनी कंप्यूटर सुरक्षा समूह पंगु लैब ने कहा कि एनएसए ने एक जटिल लिनक्स बैकडोर के हिस्से के रूप में नेटवर्क संचार को छिपाने के लिए बीपीएफ का उपयोग किया था।<ref>{{cite web
  | url = https://www.theregister.com/2022/02/23/chinese_nsa_linux/
  | url = https://www.theregister.com/2022/02/23/chinese_nsa_linux/
  | title = Anatomy of suspected top-tier decade-hidden NSA backdoor
  | title = Anatomy of suspected top-tier decade-hidden NSA backdoor
Line 143: Line 140:
  | website = The Register
  | website = The Register
}}</ref>
}}</ref>
== यह भी देखें ==


== यह भी देखें ==
* ईबीपीएफ
* ईबीपीएफ
* सूचना श्रंखला तल
* डाटा लिंक लेयर
* [[सबूत ले जाने वाला कोड]]
* प्रूफ-कैरिंग कोड
* [[एक्सप्रेस डेटा पथ]]
* [[एक्सप्रेस डेटा पथ]]


== संदर्भ ==
== संदर्भ ==
{{Reflist|30em}}
{{Reflist|30em}}
==अग्रिम पठन==
==अग्रिम पठन==
* {{cite web
* {{cite web
Line 164: Line 158:
| last2=Jacobson
| last2=Jacobson
| date=1992-12-19}}
| date=1992-12-19}}
== बाहरी संबंध ==
== बाहरी संबंध ==
* {{man|4|bpf|FreeBSD}} &ndash; an example of conventional BPF
* {{man|4|bpf|FreeBSD}} &ndash; an example of conventional BPF

Revision as of 11:01, 24 February 2023

बर्कले पैकेट फ़िल्टर (बीपीएफ) एक ऐसी तकनीक है जिसका उपयोग कुछ कंप्यूटर ऑपरेटिंग सिस्टम में प्रोग्राम के लिए किया जाता है, जिसमें अन्य बातों के अलावा, नेटवर्क ट्रैफ़िक का विश्लेषण करने की आवश्यकता होती है। यह डेटा लिंक परतों को एक अप्रशिक्षित अंतरापृष्ठ प्रदान करता है, अप्रशिक्षित लिंक-लेयर पैकेट को भेजने और प्राप्त करने की अनुमति देता है।[1] इसके अलावा, यदि नेटवर्क इंटरफ़ेस के लिए ड्राइवर प्रोमिसक्यूअस मोड का समर्थन करता है, तो यह इंटरफ़ेस को उस मोड में डालने की अनुमति देता है ताकि नेटवर्क पर सभी पैकेट प्राप्त किए जा सकें, यहां तक कि अन्य होस्ट के लिए भी नियत किए जा सकें।

बीपीएफ फ़िल्टरिंग पैकेट का समर्थन करता है, एक यूज़रस्पेस प्रक्रिया को फ़िल्टर प्रोग्राम की आपूर्ति करने की अनुमति देता है जो निर्दिष्ट करता है कि कौन से पैकेट प्राप्त करना चाहते हैं। उदाहरण के लिए, एक टीसीपीडंप (tcpdump) प्रक्रिया केवल उन पैकेटों को प्राप्त करना चाहती है जो एक टीसीपी कनेक्शन आरंभ करते हैं। बीपीएफ केवल उन पैकेटों को लौटाता है जो उस फिल्टर को पास करते हैं जो प्रक्रिया प्रदान करती है। यह ऑपरेटिंग सिस्टम कर्नेल से अवांछित पैकेटों को प्रक्रिया में कॉपी करने से बचाता है, प्रदर्शन में काफी सुधार करता है। फ़िल्टर प्रोग्राम एक वर्चुअल मशीन के लिए निर्देशों के रूप में होता है, जिसे कर्नेल में जस्ट-इन-टाइम (जेआईटी) तंत्र द्वारा मशीन कोड में समझा या संकलित किया जाता है और निष्पादित किया जाता है।

Berkeley Packet Filter
Developer(s)स्टीवन मैककेन,
वैन जैकबसन
Initial releaseDecember 19, 1992; 31 years ago (1992-12-19)
Operating systemयूनिक्स-लाइक (फ्रीबीएसडी, ओपनबीएसडी, नेटबीएसडी, ड्रैगनफ्लाई बीएसडी, मैकओएस, ओरेकल सोलारिस 11 और बाद में, [ [AIX]], Tru64, लिनक्स, ऑर्बिस), विंडोज

बीपीएफ का उपयोग कभी-कभी संपूर्ण इंटरफ़ेस के बजाय केवल फ़िल्टरिंग तंत्र के संदर्भ में किया जाता है। कुछ प्रणालियाँ, जैसे कि लिनक्स और ट्रू64 यूनिक्स, बीपीएफ कच्चे इंटरफ़ेस के अलावा डेटा लिंक परत के लिए एक कच्चा इंटरफ़ेस प्रदान करती हैं, लेकिन उस कच्चे इंटरफ़ेस के लिए बीपीएफ फ़िल्टरिंग तंत्र का उपयोग करती हैं। बीपीएफ फ़िल्टरिंग तंत्र अधिकांश यूनिक्स-जैसे ऑपरेटिंग सिस्टम पर उपलब्ध है।

लिनक्स कर्नेल बीपीएफ फ़िल्टरिंग तंत्र का एक विस्तारित संस्करण प्रदान करता है, जिसे ईबीपीएफ कहा जाता है, जो एक जेआईटी तंत्र का उपयोग करता है, और पैकेट फ़िल्टरिंग के साथ-साथ कर्नेल में अन्य उद्देश्यों के लिए उपयोग किया जाता है। ईबीपीएफ माइक्रोसॉफ्ट विंडोज के लिए भी उपलब्ध है।[2]

रॉ डेटा-लिंक इंटरफेस

बीपीएफ छद्म उपकरण प्रदान करता है जो एक नेटवर्क इंटरफेस के लिए बाध्य हो सकता है; डिवाइस से पढ़ता है नेटवर्क इंटरफ़ेस पर प्राप्त पैकेटों से भरे बफ़र्स को पढ़ेगा, और डिवाइस को लिखता है नेटवर्क इंटरफ़ेस पर पैकेट इंजेक्ट करेगा।

2007 में, रॉबर्ट वाटसन और क्रिश्चियन पेरोन ने फ्रीबीएसडी ऑपरेटिंग सिस्टम में बीपीएफ कार्यान्वयन के लिए शून्य-कॉपी बफर एक्सटेंशन जोड़े,[3] आवश्यकता से बचने के लिए डिवाइस ड्राइवर इंटरप्ट हैंडलर में कर्नेल पैकेट कैप्चर को सीधे यूजर प्रोसेस मेमोरी में लिखने की अनुमति देता है। बीपीएफ डिवाइस के माध्यम से प्राप्त सभी पैकेट डेटा के लिए दो प्रतियों के लिए। जबकि एक प्रति उपयोगकर्ता प्रक्रियाओं के लिए रसीद पथ में रहती है, यह विभिन्न बीपीएफ डिवाइस उपभोक्ताओं की स्वतंत्रता को बरकरार रखती है, साथ ही पूरे पैकेट डेटा की नकल करने के बजाय बीपीएफ बफर में हेडर की पैकिंग की अनुमति देती है।[4]

फ़िल्टरिंग

बीपीएफ की फ़िल्टरिंग क्षमताओं को बीपीएफ वर्चुअल मशीन के लिए एक मशीनी भाषा के लिए एक दुभाषिया के रूप में लागू किया जाता है, एक 32-बिट मशीन जिसमें निश्चित-लंबाई के निर्देश, एक संचायक और एक सूचकांक रजिस्टर होता है। उस भाषा में प्रोग्राम पैकेट से डेटा प्राप्त कर सकते हैं, पैकेट से डेटा पर अंकगणितीय संचालन कर सकते हैं, और परिणाम की तुलना स्थिरांक या पैकेट में डेटा के विरुद्ध या परिणामों में परीक्षण बिट्स से कर सकते हैं, उन परीक्षणों के परिणामों के आधार पर पैकेट को स्वीकार या अस्वीकार करना है।

बीपीएफ को अक्सर लोड (एलडी) और स्टोर (एसटीआर) निर्देशों को "ओवरलोडिंग" करके बढ़ाया जाता है।

कर्नेल स्थान के लिए लिखे जाने के बावजूद, पारंपरिक यूनिक्स-जैसे बीपीएफ कार्यान्वयन का उपयोग यूजरस्पेस में किया जा सकता है। यह प्रीप्रोसेसर स्थितियों का उपयोग करके पूरा किया जाता है।

एक्सटेंशन और ऑप्टिमाइज़ेशन (विस्तार और अनुकूलन)

कुछ प्रोजेक्ट बीपीएफ निर्देश समूह या निष्पादन तकनीक का उपयोग मूल से अलग करते हैं।

फ्रीबीएसडी, नेटबीएसडी, और विनकैप सहित कुछ प्लेटफ़ॉर्म, प्रदर्शन को बेहतर बनाने के लिए बीपीएफ निर्देशों को देशी कोड में बदलने के लिए जस्ट-इन-टाइम (जेआईटी) कंपाइलर का उपयोग करते हैं। लिनक्स में एक बीपीएफ जेआईटी कंपाइलर शामिल है जो पूर्व निर्धारित रूप से अक्षम है।

उसी वर्चुअल मशीन भाषा के लिए कर्नेल-मोड दुभाषियों का उपयोग अन्य ऑपरेटिंग सिस्टमों में रॉ डेटा लिंक लेयर तंत्र में किया जाता है, जैसे कि ट्रू64 यूनिक्स, और लिनक्स कर्नेल में सॉकेट फिल्टर के लिए और विनपैक और एनपीकैप पैकेट कैप्चर तंत्र में भी किया जाता है।

संस्करण 3.18 के बाद से, लिनक्स कर्नेल में एक विस्तारित बीपीएफ वर्चुअल मशीन शामिल है जिसमें दस 64-बिट रजिस्टर हैं, जिन्हें विस्तारित बीपीएफ (ईबीपीएफ) कहा जाता है। इसका उपयोग गैर-नेटवर्किंग उद्देश्यों के लिए किया जा सकता है, जैसे कि ईबीपीएफ कार्यक्रमों को विभिन्न ट्रेस बिंदुओं से जोड़ने के लिए।[5][6][7] कर्नेल संस्करण 3.19 के बाद से, ईबीपीएफ फिल्टर सॉकेट्स से जुड़े जा सकते हैं,[8][9] और, कर्नेल संस्करण 4.1 के बाद से, प्रवेश और निकास नेटवर्किंग डेटा पथ के लिए ट्रैफिक कंट्रोल क्लासिफायर के लिए।[10][11] मूल और अप्रचलित संस्करण को पूर्वव्यापी प्रभाव से क्लासिक बीपीएफ (सीबीपीएफ) में बदल दिया गया है। आजकल, लिनक्स कर्नेल केवल ईबीपीएफ चलाता है और लोडेड सीबीपीएफ बायटेकोड प्रोग्राम निष्पादन से पहले कर्नेल में एक ईबीपीएफ प्रस्तुति में पारदर्शी रूप से अनुवादित होता है।[12] डिनायल-ऑफ़-सर्विस हमलों को रोकने के लिए चलने से पहले सभी बाइटकोड सत्यापित किए जाते हैं। लिनक्स 5.3 तक, सत्यापनकर्ता ने संभावित असीमित निष्पादन समय को रोकने के लिए, लूप के उपयोग को प्रतिबंधित कर दिया; परिबद्ध निष्पादन समय के साथ लूप्स को अब हाल ही के कर्नेल में अनुमति दी गई है।[13]

बीपीएफ के लिए एक उपयोगकर्ता-मोड दुभाषिया को लिबपैक/विनपैक/एनपीकेपी एपीआई के कार्यान्वयन के साथ प्रदान किया जाता है, ताकि, उस फ़िल्टरिंग तंत्र के लिए कर्नेल-मोड समर्थन के बिना सिस्टम पर पैकेट कैप्चर करते समय, पैकेट को उपयोगकर्ता मोड में फ़िल्टर किया जा सके; पीसीएपी एपीआई का उपयोग करने वाला कोड दोनों प्रकार के सिस्टम पर काम करेगा, हालाँकि, उन सिस्टम पर जहाँ फ़िल्टरिंग उपयोगकर्ता मोड में की जाती है, फ़िल्टर किए जाने वाले पैकेट सहित सभी पैकेट, कर्नेल से यूज़र स्पेस में कॉपी किए जाते हैं। उस दुभाषिया का उपयोग तब भी किया जा सकता है जब पीसीएपी का उपयोग करके कैप्चर किए गए पैकेट वाली फ़ाइल को पढ़ा जाता है।

एक अन्य उपयोगकर्ता-मोड दुभाषिया यूबीपीएफ है, जो जेआईटी और ईबीपीएफ (सीबीपीएफ के बिना) का समर्थन करता है। इसके कोड को गैर-लिनक्स सिस्टम में ईबीपीएफ समर्थन प्रदान करने के लिए पुन: उपयोग किया गया है।[14] विंडोज पर माइक्रोसॉफ्ट का ईबीपीएफ यूबीपीएफ और प्रचलित होना औपचारिक सत्यापनकर्ता पर बना है।[15] आरबीपीएफ, यूबीपीएफ का एक रस्ट रीराइट, सोलाना ब्लॉकचैन प्लेटफॉर्म द्वारा निष्पादन इंजन के रूप में उपयोग किया जाता है।[16]

प्रोग्रामिंग

क्लासिक बीपीएफ आमतौर पर मैच के पैटर्न का वर्णन करने वाले कुछ बहुत ही उच्च-स्तरीय पाठ्य नियम से एक कार्यक्रम द्वारा उत्सर्जित होता है। ऐसा ही एक प्रतिनिधित्व लिबकैप में पाया जाता है।[17] क्लासिक बीपीएफ और ईबीपीएफ को या तो सीधे मशीन कोड के रूप में लिखा जा सकता है या टेक्स्टुअल प्रतिनिधित्व के लिए असेंबली भाषा का उपयोग किया जा सकता है। उल्लेखनीय असेंबलरों में लिनक्स कर्नेल का बीपीएफ_एएसएम टूल (सीबीपीएफ), बीपीएफसी (सीबीपीएफ) और यूबीपीएफ असेंबलर (ईबीपीएफ) शामिल हैं। बीपीएफटूल कमांड बीपीएफ के दोनों फ्लेवर के लिए डिस्सेबलर के रूप में भी कार्य कर सकता है। असेम्बली भाषाएँ आवश्यक रूप से एक दूसरे के अनुकूल नहीं हैं।

ईबीपीएफ बाइटकोड हाल ही में उच्च स्तरीय भाषाओं का लक्ष्य बन गया है। एलएलवीएम (LLVM) ने 2014 में ईबीपीएफ समर्थन जोड़ा, और 2019 में जीसीसी का अनुसरण किया। दोनों टूलकिट सी और अन्य समर्थित भाषाओं को ईबीपीएफ में संकलित करने की अनुमति देते हैं। पी4 के एक उपसमुच्चय को बीसीसी, एक एलएलवीएम -आधारित संकलक किट का उपयोग करके ईबीपीएफ में संकलित किया जा सकता है।[18]

इतिहास

मूल पेपर 1992 में स्टीवन मैककैन और वैन जैकबसन द्वारा लॉरेंस बर्कले प्रयोगशाला में लिखा गया था।[1][19]

अगस्त 2003 में, एससीओ समूह ने सार्वजनिक रूप से दावा किया कि लिनक्स कर्नेल उनके स्वामित्व वाले यूनिक्स कोड का उल्लंघन कर रहा था।[20] प्रोग्रामर्स को जल्दी पता चला कि उन्होंने जो एक उदाहरण दिया वह बर्कले पैकेट फ़िल्टर था, जो वास्तव में एससीओ के स्वामित्व में कभी नहीं था।[21] एससीओ ने गलती की व्याख्या या स्वीकार नहीं किया है लेकिन चल रही कानूनी कार्रवाई अंततः एक जवाब को मजबूर कर सकती है।[22]

सुरक्षा चिंताएं

स्पेक्टर अटैक अन्य कर्नेल प्रक्रियाओं से डेटा निकालने के लिए लिनक्स कर्नेल के ईबीपीएफ इंटरप्रेटर या जेआईटी कंपाइलर का लाभ उठा सकता है।[23] कर्नेल में एक जेआईटी हार्डनिंग फीचर इस भेद्यता को कम करता है।[24]

चीनी कंप्यूटर सुरक्षा समूह पंगु लैब ने कहा कि एनएसए ने एक जटिल लिनक्स बैकडोर के हिस्से के रूप में नेटवर्क संचार को छिपाने के लिए बीपीएफ का उपयोग किया था।[25]

यह भी देखें

संदर्भ

  1. 1.0 1.1 McCanne, Steven; Jacobson, Van (1992-12-19). "The BSD Packet Filter: A New Architecture for User-level Packet Capture" (PDF).
  2. "Microsoft embraces Linux kernel's eBPF super-tool, extends it for Windows". The Register. 2021-05-11. Archived from the original on 2021-05-11.
  3. "bpf(4) Berkeley Packet Filter". FreeBSD. 2010-06-15.
  4. Watson, Robert N. M.; Peron, Christian S. J. (2007-03-09). "Zero-Copy BPF" (PDF).
  5. "Linux kernel 3.18, Section 1.3. bpf() syscall for eBFP virtual machine programs". kernelnewbies.org. December 7, 2014. Retrieved September 6, 2019.
  6. Jonathan Corbet (September 24, 2014). "The BPF system call API, version 14". LWN.net. Retrieved January 19, 2015.
  7. Jonathan Corbet (July 2, 2014). "Extending extended BPF". LWN.net. Retrieved January 19, 2015.
  8. "Linux kernel 3.19, Section 11. Networking". kernelnewbies.org. February 8, 2015. Retrieved February 13, 2015.
  9. Jonathan Corbet (December 10, 2014). "Attaching eBPF programs to sockets". LWN.net. Retrieved February 13, 2015.
  10. "Linux kernel 4.1, Section 11. Networking". kernelnewbies.org. June 21, 2015. Retrieved October 17, 2015.
  11. "BPF and XDP Reference Guide". cilium.readthedocs.io. April 24, 2017. Retrieved April 23, 2018.
  12. "BPF and XDP Reference Guide — Cilium 1.6.5 documentation". docs.cilium.io. Retrieved 2019-12-18.
  13. "bpf: introduce bounded loops". git.kernel.org. June 19, 2019. Retrieved August 19, 2022.
  14. "generic-ebpf/generic-ebpf". GitHub (in English). 28 April 2022.
  15. "microsoft/ebpf-for-windows: eBPF implementation that runs on top of Windows". GitHub. Microsoft. 11 May 2021.
  16. "Overview | Solana Docs".
  17. "BPF syntax". biot.com.
  18. "Dive into BPF: a list of reading material". qmonnet.github.io.
  19. McCanne, Steven; Jacobson, Van (January 1993). "The BSD Packet Filter: A New Architecture for User-level Packet Capture". USENIX.
  20. "SCOsource update". 15 Obfuscated Copying. Archived from the original on August 25, 2003. Retrieved September 5, 2019.
  21. Bruce Perens. "Analysis of SCO's Las Vegas Slide Show". Archived from the original on February 17, 2009.
  22. Moglen, Eben (November 24, 2003). "SCO: Without Fear and Without Research". GNU Operating System. The Free Software Foundation. Retrieved September 5, 2019.
  23. "Reading privileged memory with a side-channel". Project Zero team at Google. January 3, 2018. Retrieved January 20, 2018.
  24. "bpf: introduce BPF_JIT_ALWAYS_ON config". git.kernel.org. Archived from the original on 2020-10-19. Retrieved 2021-09-20.
  25. "Anatomy of suspected top-tier decade-hidden NSA backdoor". The Register. February 23, 2022. Retrieved February 24, 2022.

अग्रिम पठन

बाहरी संबंध