लिनक्स में एक इंटरफेस के माध्यम से जाने के लिए सभी ट्रैफ़िक कैसे करें


12

मेरे पास एक स्व-लिखित इंटरफ़ेस tun0 ( TUN / TAP आधारित) है जो इसे प्राप्त करता है।
मुझे इस इंटरफ़ेस के माध्यम से प्रवाह करने के लिए सिस्टम के सभी ट्रैफ़िक की आवश्यकता है।
इंटरफ़ेस की भूमिका है:

  1. पैकेटों का पता लगाने के लिए उन्हें सेंसर और सुरंग बनाने की संभावना है।
  2. अन्य सभी ट्रैफ़िक को अछूता पास करें।

जैसा कि आपको लगता है कि मैं एक एंटीकेंसशिप टूल बनाने की कोशिश कर रहा हूं।
टनलिंग के बारे में निर्णय tun0 प्रक्रिया के अंदर लिया जाना चाहिए
क्योंकि केवल वहाँ हम विश्वसनीय DNS का उपयोग कर सकते हैं।

मुझे यह दिखाने के लिए आपकी सहायता की आवश्यकता है कि एक स्व-लिखित इंटरफ़ेस tun0 के माध्यम से सभी ट्रैफ़िक प्रवाह कैसे करें। अगर tun0 को परिवर्तनों की आवश्यकता है, तो मैं आपसे ऐसे परिवर्तन प्रदान करने के लिए कहता हूँ।

नीचे मैंने बताया है कि मैंने सभी ट्रैफ़िक को ट्यून 0 के माध्यम से जाने की कोशिश की और विफल हो गया (पिंग्स विफल)।

संकलन

  1. gcc tun0.c
  2. sudo ./a.out

का विन्यास

  1. sudo ip addr add 10.0.0.1/24 dev tun0
  2. तालिका बनाएं जॉन

    $ cat /etc/iproute2/rt_tables 
    #
    # reserved values
    #
    255     local
    254     main
    253     default
    0       unspec
    #
    # local
    #
    #1      inr.ruhep
    
    200 John
    

आदेश महत्वपूर्ण है:

  1. sudo ip rule add from all lookup John
  2. sudo ip route add default dev tun0 table John
  3. sudo ip rule add iif tun0 lookup main priority 500

    $ ip rule
    0:      from all lookup local 
    500:    from all iif tun0 lookup main 
    32765:  from all lookup John 
    32766:  from all lookup main 
    35000:  from all lookup default 
    

समस्या निवारण

  1. sudo tcpdump -i wlp2s0 -qtln icmpऔर फिर ping -I tun0 8.8.8.8पकड़े गए पैकेट को नहीं दिखाता है, इसका मतलब है कि iif tun0 lookup mainनियम के माध्यम से कोई भी पैकेट ट्यून से wlp2s0 तक प्रेषित नहीं किया जाता है ।

  2. जब मैंने हर जगह tun0साथ दिया loतब मेरे लिए काम किया।

भी कोशिश की

  1. रिवर्स पाथ फ़िल्टरिंग को बंद करना, rp_filter=0में/etc/sysctl.conf

उत्तर समस्या निवारण

iptables -I FORWARD -j LOG --log-prefix "filter/FORWARD " 
iptables -t nat -I OUTPUT -j LOG --log-prefix "nat/OUTPUT " 
iptables -t nat -I PREROUTING -j LOG --log-prefix "nat/PREROUTING " 
iptables -t nat -I POSTROUTING -j LOG --log-prefix "nat/POSTROUTNG "
tail -f /var/log/syslog

उत्तर से संशोधित स्रोत भी यहाँ हैं

जवाबों:


10

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

sysctl -w net.ipv4.ip_forward=1

उसके बाद, अगर आप को देखेंगे tcpdumpके लिए wlp2s0आप देख सकते हैं पैकेट स्रोत पते के साथ छोड़ 10.0.0.1और wlan इंटरफेस के स्रोत का पता नहीं (आप उम्मीद करेंगे क्या मुझे लगता है)। इसलिए हमें स्रोत का पता बदलने की आवश्यकता है और इसे स्रोत NAT कहा जाता है । Linux में नेटफिल्टर / आईटबल्स की मदद से यह आसान है :

iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.0.1 -j MASQUERADE

कृपया यह भी जांच लें कि आपकी FORWARDश्रृंखला में ACCEPTनीति है या आपको कुछ के साथ अग्रेषण की अनुमति देने की आवश्यकता होगी :

iptables -A FORWARD -i tun0 -o wlp2s0 -s 10.0.0.1 -j ACCEPT
iptables -A FORWARD -i wlp2s0 -o tun0 -d 10.0.0.1 -j ACCEPT

सब कुछ अब काम करना चाहिए: लिनक्स कर्नेल रूटिंग करता है, यह tun0इंटरफ़ेस से पैकेट को स्थानांतरित कर रहा है wlp2s0netfilter को आउटपुट पैकेट के लिए 10.0.0.1आपके wlp2s0इंटरफ़ेस असाइन किए गए पते पर स्रोत IP को बदलना चाहिए । यह सभी कनेक्शनों को याद करता है और जब उत्तर पैकेट वापस जाते हैं (यदि वे) तो यह wlp2s0निर्दिष्ट इंटरफ़ेस के गंतव्य पते को 10.0.0.1("कनवर्टर" सुविधा) में बदल देता है।
ठीक है, यह होना चाहिए, लेकिन यह नहीं है। ऐसा लगता है, नेटफिल्टर इस जटिल रूटिंग कॉन्फ़िगरेशन के साथ भ्रमित हो जाता है और यह तथ्य कि एक ही पैकेट पहले OUTPUTचेन के माध्यम से जाता है और फिर रूट किया जाता है और PREROUTINGचेन में आता है । कम से कम डेबियन 8 बॉक्स पर यह काम नहीं करता है।
नेटफिल्टर की समस्या निवारण का सबसे अच्छा तरीका है TRACE:

modprobe ipt_LOG
iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j TRACE

मैं केवल ICMP पैकेट के लिए अनुरेखण सक्षम करता हूं, आप अन्य फ़िल्टर का उपयोग डिबग करने के लिए कर सकते हैं।
यह दिखाएगा कि पैकेट किस टेबल और चेन से गुजरता है। और मैं देख सकता हूं कि पैकेट आगे FORWARDश्रृंखला नहीं है (और यह nat/POSTROUTINGश्रृंखला द्वारा पकड़ा नहीं जा रहा है जो वास्तव में करता है SNAT)।
इस काम को करने के लिए नीचे कई दृष्टिकोण दिए गए हैं।

APPROACH # 1

नेटफिल्टर को अन-कन्फ्यूज करने का सबसे अच्छा तरीका tun0.cएप्लीकेशन में पैकेट के सोर्स आईपी एड्रेस को बदलना है । यह सबसे प्राकृतिक तरीका भी है। हम की जरूरत है 10.0.0.2 को 10.0.0.1 बदल रास्ता बाहर पर और 10.0.0.1 को 10.0.0.2 तरह से पीठ पर।
मैंने tun0.cस्रोत पता परिवर्तन कोड के साथ संशोधित किया है। यहाँ नई फ़ाइल है और यहाँ आपके लिए पैचफ़ाइल है tun0.c। आईपी ​​हेडर में परिवर्तन से चेकसम सुधार भी शामिल है , इसलिए मैंने ओपनवीपीएन परियोजना से कुछ कोड लिया । यहाँ एक साफ रिबूट और tun0_changeip.cलॉन्च के बाद मेरे द्वारा निष्पादित कमांड की पूरी सूची है :

ifconfig tun0 inet 10.0.0.1/30 up
sysctl -w net.ipv4.ip_forward=1
ip route add default dev tun0 table John
ip rule add from all lookup John
ip rule add from 10.0.0.2 lookup main priority 500
iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.0.2 -j MASQUERADE

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

APPROACH # 2

SNATपैकेट पहुंच tun0इंटरफ़ेस से पहले ऐसा करना संभव है । हालांकि यह बहुत सही नहीं है। आपको निश्चित रूप से इस मामले में रिवर्स पाथ फ़िल्टरिंग को बंद करना होगा :

sysctl -w net.ipv4.conf.tun0.rp_filter=0
# It won't work without also changing the "all" value
sysctl -w net.ipv4.conf.all.rp_filter=0

अब, क्या करें SNAT: iptables -t nat -A POSTROUTING -o tun0 -s 10.0.0.1 -j SNAT --to-source ip.address.of.your.wlan.interface

यहां हम पैकेट को डिवाइस तक पहुंचने से ठीक पहले स्रोत का पता बदलते हैं tun0tun0.cकोड इन पैकेटों को "जैसा है" (बदले हुए स्रोत पते के साथ) को फिर से जारी करता है और उन्हें सफलतापूर्वक वेलन इंटरफ़ेस के माध्यम से रूट किया जाता है। लेकिन आपके पास वेलन इंटरफ़ेस पर एक गतिशील आईपी हो सकता है और MASQUERADEस्पष्ट रूप से इंटरफ़ेस पते को निर्दिष्ट नहीं करने के लिए उपयोग करना चाहता है । यहाँ आप कैसे उपयोग कर सकते हैं MASQUERADE:

iptables -t nat -A POSTROUTING -o tun0 -s 10.0.0.1 -j SNAT --to-source 10.0.55.1
iptables -t nat -A POSTROUTING -o wlp2s0 -s 10.0.55.1 -j MASQUERADE

कृपया " 10.0.55.1" IP पता नोट करें - यह अलग है। आप यहां किसी भी आईपी का उपयोग कर सकते हैं, इससे कोई फर्क नहीं पड़ता। पैकेट इंटरफ़ेस nat/POSTROUTINGपर श्रृंखला तक पहुंचते हैं wlp2s0यदि हम स्रोत आईपी को पहले बदलते हैं। और अब यह wlan इंटरफ़ेस के लिए एक स्थिर IP पर निर्भर नहीं है।

अप्रोच # ३

आप भी इस्तेमाल कर सकते हैं fwmark। इस तरह आप की जरूरत नहीं है SNATलेकिन आप केवल बाहर जाने वाले पैकेट पर कब्जा करेंगे:
पहले हम अक्षम करने की जरूरत है रिवर्स पथ को छानने के लिए tun0है क्योंकि यह पैकेट कि दूसरे नेटवर्क से संबंध रखते हैं अग्रेषित करेंगे:

sysctl -w net.ipv4.conf.tun0.rp_filter=0
# It won't work without also changing the "all" value
sysctl -w net.ipv4.conf.all.rp_filter=0

Now let's alter the routing rules a bit:
# Delete old rules
ip rule del iif tun0 lookup main
ip rule del from all lookup John

# Packets will start going from wlan interface so they will have source address of it
iptables -t mangle -A OUTPUT -o wlp2s0 -j MARK --set-mark 1
ip rule add fwmark 0x1 lookup John

रूटिंग और नेटफिल्टर के लिए यह एक और "हैक" है जो मेरे डेबियन 8 बॉक्स पर काम करता है, लेकिन फिर भी मैं पहले दृष्टिकोण को लेने की सलाह देता हूं क्योंकि यह अधिक प्राकृतिक है और किसी भी हैक का उपयोग नहीं करता है।


आप अपने एप्लिकेशन को पारदर्शी प्रॉक्सी के रूप में बनाने पर भी विचार कर सकते हैं । मुझे लगता है कि यह ट्यून डिवाइस से पैकेट का विश्लेषण करने के बजाय बहुत आसान होगा।


मैं का इस्तेमाल किया था -j SNAT, नहीं-s SNAT
ilyaigpetrov

यह काम करता है लेकिन प्रदर्शन बहुत रुक-रुक कर होता है (यह 10 सेकंड के लिए स्टाल हो सकता है फिर काम करना जारी रख सकता है)। मैं यह पता लगाने जा रहा हूं कि ऐसा क्यों होता है और इसे कैसे ठीक किया जाए।
इलियागपेट्रोव

1
क्षमा करें यह मेरा टाइपो था। मैंने अपने उत्तर में एक और दृष्टिकोण जोड़ा। प्रदर्शन के मुद्दे के बारे में कोई विचार नहीं है। वैसे, ट्रैफ़िक को फ़िल्टर और डायवर्ट करने के लिए iptables DNAT के साथ एक पारदर्शी प्रॉक्सी का उपयोग क्यों नहीं करना चाहिए?
tifssoft

मैं आपके चिह्न के दृष्टिकोण को पुन: पेश करने में सक्षम नहीं हूं, मैंने केवल इसे जोड़ा sudo ip rule add iif tun0 lookup main priority 500है लेकिन फिर भी यह काम नहीं किया। मुझे यह दृष्टिकोण पसंद है, अफ़सोस है कि मैं इसे पुन: पेश नहीं कर सकता।
इलिआगपेट्रोव

1
आपके नए दृष्टिकोण के लिए धन्यवाद, मैंने इसका चरण दर चरण अनुसरण किया और इसने पूरी तरह से काम किया। फिर भी मुझे समझ नहीं आ रहा है कि हमें ips बदलने की आवश्यकता क्यों है, सबसे महत्वपूर्ण बात यह काम करता है। यदि टीसीपी प्रॉक्सी के साथ मेरी योजना विफल हो जाती है, तो मैं आपके उत्तर पर वापस जा सकूंगा। आपने यहां बहुत सारी नेटवर्किंग कौशल दिखाए और मुझे संदेह नहीं है कि आपके कौशल को प्रतिष्ठित किया जाएगा। सौभाग्य!
ilaigpetrov
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.