दो नल इंटरफेस ब्रिजिंग


0

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

$ brctl showstp br0
br0
bridge id      8000.46846e0c0ff9
designated root    8000.46846e0c0ff9
root port         0            path cost          0
max age          20.00         bridge max age        20.00
hello time        2.00         bridge hello time      2.00
forward delay        15.00         bridge forward delay      15.00
ageing time         300.00
hello timer           1.98         tcn timer          0.00
topology change timer     0.00         gc timer         115.04
flags          


tap1 (1)
port id        8001            state            forwarding
designated root    8000.46846e0c0ff9   path cost        100
designated bridge  8000.46846e0c0ff9   message age timer      0.00
designated port    8001            forward delay timer   10.34
designated cost       0            hold timer         0.98
flags          

tap2 (2)
port id        8002            state            forwarding
designated root    8000.46846e0c0ff9   path cost        100
designated bridge  8000.46846e0c0ff9   message age timer      0.00
designated port    8002            forward delay timer    0.00
designated cost       0            hold timer         0.98
flags          

मेरे पास पुल बना br0है, दोनों के साथ tap1और tap2जोड़ा। मेरे पास एक प्रोग्राम है जो ARP पैकेट को tap1प्रयोग में ला रहा है libpcap। Wireshark सही ढंग से पैकेट में प्रवेश दिखाता है tap1। हालांकि, कोई भी पैकेट नहीं दिखा tap2। मैंने ebtables में follwing नियम जोड़ने की कोशिश की:

sudo ebtables -I INPUT --log --log-level debug

कोई भी पैकेट लॉग में नहीं दिखा। मैं किसी भी जानकारी की सराहना करेंगे।

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

मेरे पास केवल दो प्रक्रियाएं हैं। "रीड" प्रक्रिया में एक फ़ाइल डिस्क्रिप्टर खुला है tap2, और लगातार इसे पढ़ने की कोशिश करता है। लिखने की प्रक्रिया में एक फाइल डिस्क्रिप्टर खुला है tap1और ARP क्वेरी को भेजने के लिए उपयोगकर्ता संकेत का इंतजार करता है। ARP क्वेरी में एक यादृच्छिक स्रोत IP पता होता है। स्रोत मैक पता मैक पते के रूप में सेट किया गया है tap1। यहाँ tcpdump का आउटपुट दिया गया है:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap1, link-type EN10MB (Ethernet), capture size 262144 bytes
^[[A07:19:57.752990 ARP, Request who-has google-public-dns-a.google.com tell 0.0.248.17, length 28
    0x0000:  ffff ffff ffff ba9c 0589 16ad 0806 0001
    0x0010:  0800 0604 0001 ba9c 0589 16ad 0000 f811
    0x0020:  0000 0000 0000 0808 0808

मैंने कॉन्फ़िगर किया है tap1और tap2आईपी ​​पते नहीं हैं। क्या यह समस्या हो सकती है?

brctl addbr br0
ip tuntap add name tap1 mode tap
ip tuntap add name tap2 mode tap
brctl addif br0 tap1
brctl addif br0 tap2
ifconfig tap1 0.0.0.0 up
ifconfig tap2 0.0.0.0 up
ifconfig br0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255
ip link set br0 up
ip link set tap1 up
ip link set tap2 up

उत्तर के आधार पर, मैंने विभिन्न अनुप्रयोगों को संलग्न करने की जाँच की tap2। मैं यह नोटिस करता हूं: जब कोई एप्लिकेशन उपयोग नहीं कर रहा है tap1या tap2, दोनों इंटरफेस में LOWER_UP फ्लैग सेट नहीं है।

4: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 46:84:6e:0c:0f:f9 brd ff:ff:ff:ff:ff:ff
25: tap1: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN mode DEFAULT group default qlen 500
    link/ether ba:9c:05:89:16:ad brd ff:ff:ff:ff:ff:ff
26: tap2: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN mode DEFAULT group default qlen 500

जब मैं आवेदन शुरू करता हूं, LOWER_UP ध्वज सेट हो जाता है:

4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 46:84:6e:0c:0f:f9 brd ff:ff:ff:ff:ff:ff
25: tap1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 500
    link/ether ba:9c:05:89:16:ad brd ff:ff:ff:ff:ff:ff
26: tap2: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 500
    link/ether 46:84:6e:0c:0f:f9 brd ff:ff:ff:ff:ff:ff

मुझे खेद है कि यह लंबा हो रहा है, मैं बस उम्मीद कर रहा हूं कि इस मुद्दे की समझ बनाने के लिए पर्याप्त जानकारी है।

जवाबों:


1

बस मामले में, क्योंकि आपने कहा था कि आप कुल नॉब हैं: एक ट्यून (लेयर 3) या टैप (लेयर 2) इंटरफेस एक एप्लीकेशन का नेटवर्क इंटरफेस एंडपॉइंट है, और एप्लिकेशन इस नेटवर्क इंटरफेस से पैकेट को पढ़ और लिख सकता है। इस तरह के समापन बिंदुओं के लिए आप जो बनाते हैं ip tuntap add ...या पुराने tunctlहैं, वे लगातार नाम हैं , और आप आमतौर पर अभी भी एप्लिकेशन चलाएंगे, और जब तक आप एप्लिकेशन नहीं चलाते तब तक यह कुछ भी नहीं करेगा।

चूंकि एप्लिकेशन नेटवर्क इंटरफ़ेस के साथ डिज़ाइन के एक मामले के रूप में इंटरैक्ट करता है, इसलिए किसी तीसरे पक्ष के एप्लिकेशन के साथ "इंजेक्ट" पैकेट की आवश्यकता नहीं है, जब तक कि आप इस सामान्य इंटरैक्शन का "इंजेक्शन" नहीं करते हैं जिसका मैंने वर्णन किया था।

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

इसलिए यदि आप ऐसा करना चाहते हैं, और पैकेट बनाने और प्राप्त करने के लिए अपने स्वयं के एप्लिकेशन के साथ खेलना नहीं चाहते हैं, तो आपको एक ट्यून / टैप इंटरफ़ेस की आवश्यकता नहीं है।

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

और जैसा कि अपेक्षित था, टैप डिवाइस को ब्रिज करना ठीक काम करता है।

इसलिए मुझे लगता है कि समस्या उस पैकेट में है जिसे आप इंजेक्ट कर रहे हैं: गलत ईथरनेट पता, या कोई प्रसारण नहीं। tcpdump -xx ...जब आप ARP पैकेट इंजेक्ट करते हैं तो कृपया अपने प्रश्न को आउटपुट के साथ संपादित करें ।

या संभवतः आप नेटवर्क नेमस्पेस बनाना चाहते हैं और इसके बजाय दो वीथ-पेयर के दो एंडपॉइंट्स को पाटना चाहते हैं? यह बहुत सरल है।

संपादित करें

एआरपी पैकेट अच्छा लग रहा है। ऐसा लगता है कि कोई एप्लिकेशन जुड़ा नहीं है tap2। यदि आप करते हैं ip link, तो आपको एक LOWER_UPध्वज नहीं देखना चाहिए tap2। अनुमान: पुल का पता लगाता है कि डिवाइस केवल आंशिक रूप से ऊपर है, और इस पोर्ट पर पैकेट नहीं भेजता है।

एक साथ यह बजाय ऐसे tapकि है इससे जुड़े एक आवेदन, की तरह कुछ

sudo socat TUN:10.0.2.2/24,tun-name=tapx,tun-type=tap,iff-up - | hexdump -C

( 10.0.2.2/24पता कुछ भी नहीं करता है, लेकिन socatयदि आप एक पते को निर्दिष्ट नहीं करते हैं तो काम नहीं करेगा), और दूसरे टर्मिनल में

sudo ip link set tapx master br0

(कि जगह brctl addif), तो अपने पैकेट को कई बार इंजेक्ट करें और देखें कि क्या आपको पहली विंडो में एक हेक्सडंप मिला है। के LOWER_UPसाथ भी जांच करें ip link show dev tapx

BTW, ifconfigऔर brctlपुराने हैं। उपयोग करें ipऔर bridgeइसके बजाय।

पुल के बंदरगाहों को आईपी पते निर्दिष्ट नहीं करना, कोई फर्क नहीं पड़ता, क्योंकि पुल के बंदरगाहों में आईपी पते नहीं होते हैं (यदि उन्हें पुल के दास बनने से पहले उन्हें कुछ सौंपा गया था, तो उन्हें नजरअंदाज कर दिया जाता है)। जैसे देखें यहाँ


मैंने विवरण जोड़ दिया है। क्या आप कृपया कर सुनिश्चित करेंगे?
SPMP

उलटा सच है। tap2इसका उपयोग करते हुए एक एप्लिकेशन है, लेकिन नहीं tap1। जब भी कोई एप्लिकेशन इंटरफ़ेस से कनेक्ट होता है, LOWER_UP सेट हो जाता है। क्या यह समस्या का संकेत है?
17MP पर SPMP

अब तक की मदद के लिए धन्यवाद! मैंने उत्तर को स्वीकार नहीं किया है, केवल अगर कोई इसे समझ सकता है।
SPMP
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.