बर्कले पैकेट फ़िल्टर

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

यह भी देखें

 * ईबीपीएफ
 * डाटा लिंक लेयर
 * प्रूफ-कैरिंग कोड
 * एक्सप्रेस डेटा पथ

बाहरी संबंध

 * – an example of conventional BPF
 * eBPF.io - Introduction, Tutorials & Community Resources
 * bpfc, a Berkeley Packet Filter compiler, Linux BPF JIT disassembler (part of netsniff-ng)
 * BPF Documentation, for Linux kernel
 * Linux filter documentation, for both cBPF and eBPF bytecode formats