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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

सुरक्षा चिंताएं
स्पेक्टर (सुरक्षा भेद्यता) हमला अन्य कर्नेल प्रक्रियाओं से डेटा निकालने के लिए लिनक्स कर्नेल के eBPF दुभाषिया या 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