Tcp host (linux) से आने वाले ट्रैफ़िक को "संपादित" करने का आसान तरीका


9

मुझे एक ज्ञात टीसीपी होस्ट से आने वाले ट्रैफ़िक में कुछ छोटे संशोधन करने की आवश्यकता है: कनेक्शन से निपटने की प्रक्रिया से पहले पोर्ट स्ट्रीम प्राप्त करें।

उदाहरण के लिए, 192.168.1.88 एक दूरस्थ होस्ट है जो एक वेब सर्वर चलाता है।
मुझे इसकी आवश्यकता है, जब मेरे स्थानीय होस्ट पर एक प्रक्रिया 192.168.1.88:80 (जैसे ब्राउज़र) से डेटा प्राप्त करती है, तो डेटा को पहली बार इस तरह से बदल दिया text-Aजाता है text-B:

  • 127.0.0.1: ... 192.168.1.88:80 से जुड़ता है
  • 127.0.0.1: ... 192.168.1.88:80 पर भेजता है:

    GET /
    
  • 192.168.1.88:80 127.0.0.1 पर भेजता है: ...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • वह डेटा कुछ हद तक सिस्टम द्वारा इंटरसेप्ट होता है और एक प्रोग्राम में जाता है जिसका आउटपुट है:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • सिस्टम 127.0.0.1 को हैंडल करने की प्रक्रिया में इतना परिवर्तित डेटा देता है: ..., जैसे कि यह 192.168.1.88:80 से आता है।

यह मानते हुए कि इस परिवर्तन ( sedउदाहरण के लिए) का उपयोग करने के लिए मेरे पास एक स्ट्रीम-आधारित तरीका है , आने वाली tcp स्ट्रीम को प्री-प्रोसेस करने का सबसे आसान तरीका क्या है?

मुझे लगता है कि इसमें शामिल होगा iptables, लेकिन मैं इसमें बहुत अच्छा नहीं हूं।

ध्यान दें कि एप्लिकेशन को मूल होस्ट से निपटने के लिए महसूस करना चाहिए, इसलिए प्रॉक्सी सेट करना एक समाधान नहीं है।


क्या ये HTTP अनुरोध हैं?
बहुपद

आपका प्रश्न पर्याप्त स्पष्ट नहीं है। आपको अधिक विवरण प्रदान करने की आवश्यकता है।
खालिद

1
आप इसे पैकेट स्तर पर नहीं कर सकते। एक पैकेट में "टेक्स्ट-" हो सकता है और अगले में "ए" हो सकता है। आपको एक अदृश्य प्रॉक्सी विकसित करनी होगी जो प्रोटोकॉल का पालन करे। (आपको प्रोटोकॉल का पालन करना होगा क्योंकि अगर आपको "टेक्स्ट-" मिलता है और यह "टेक्स्ट-ए" का हिस्सा है, तो आपको इसे पास करने से पहले अगले चंक के लिए इंतजार करना होगा या आपका फ़िल्टर काम नहीं करेगा। लेकिन अगर यह अंत है। एक तार्किक संदेश के लिए, आप इंतजार नहीं कर सकते क्योंकि आप हमेशा के लिए इंतजार करेंगे।) मेरा मानना ​​है कि ऐसा करने का कोई आसान तरीका नहीं है।
डेविड श्वार्ट्ज

पहले से ही स्टेटफुल पैकेट इंस्पेक्शन सिस्टम मौजूद हैं, जो एफ़टीपी ट्रैफ़िक की पुनर्लेखन कर सकता है ताकि यह NAT पर काम करे। कि जगह की तरह शुरू करने के लिए है।
pjc50 12

मुझे मुख्य रूप से http प्रतिक्रिया के साथ काम करने की आवश्यकता है, लेकिन यह अच्छा होगा यदि यह किसी एप्लिकेशन परत पर काम करता है।
etuardu

जवाबों:


21

जाल और iptables का उपयोग करें।

iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101

फिर भागो:

netsed tcp 10101 desthost 80 s/text-A/text-B

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

  • ब्लैक-बॉक्स प्रोटोकॉल ऑडिटिंग - जब भी दो या अधिक मालिकाना बक्से होते हैं, तो कुछ अनिर्दिष्ट प्रोटोकॉल का उपयोग करके संचार करते हैं। चल रहे प्रसारण में परिवर्तनों को लागू करने से, आप परीक्षण कर पाएंगे कि क्या परीक्षण किए गए आवेदन को सुरक्षित होने का दावा किया जा सकता है।

  • फ़ज जनरेटिंग एक्सपेरिमेंट, अखंडता परीक्षण - जब भी आप किसी एप्लिकेशन की स्थिरता परीक्षण करते हैं, तो यह देखने के लिए कि यह डेटा अखंडता की देखभाल कैसे करता है;

  • अन्य सामान्य उपयोग के मामले: भ्रामक स्थानान्तरण, सामग्री फ़िल्टरिंग, प्रोटोकॉल रूपांतरण - जो भी सर्वोत्तम कार्य आपके हाथ में है।


यह वास्तव में सरल और अच्छा है।
mbrownnyc

मुझे नहीं पता था netsed, यह मेरे उद्देश्य के लिए लगभग पूरी तरह से फिट बैठता है। केवल एक चीज मुझे नहीं मिलती है कि "स्थानीय पारदर्शी प्रॉक्सी" कैसे सेट करें (प्रश्न देखें)। शायद मुझे यह प्राप्त करने के लिए एक और (आभासी) नेटवर्क इंटरफ़ेस स्थापित करना चाहिए। वैसे, अभी के लिए यह सबसे संतोषजनक जवाब है।
etuardu

क्या आप एक सामान्य वितरण कर्नेल चला रहे हैं? यदि आप iptables समर्थन कर रहे हैं, तो संभवतः पहले से ही संकलित किया गया है। पारदर्शी प्रॉक्सी को सेट करने के लिए आपको बस अपने मेजबान / बंदरगाहों के लिए उपयुक्त विवरण भरने की आवश्यकता है। रीडमी पर एक नज़र डालें और देखें कि क्या यह कुछ विवरणों में भरता है। silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
Dfc

मैंने सोचा था कि एक समय में केवल एक पैकेट पर काम किया जाएगा? इसलिए यदि http अनुरोध दो पैकेटों में विभाजित हो गया तो प्रतिस्थापन के लिए regex मेल नहीं खाएगा और अनुरोध को सर्वर को बिना अनुमति के पास कर दिया जाएगा।
पॉलोस

1
ठीक है अब, अगर किसी को इस एक दिन की जरूरत है: ऐसा नहीं है कि मैं इसे पूरी तरह से समझता हूं, लेकिन वास्तव में OUTGOING पैकेट को संशोधित करने के लिए (जो ऐसा नहीं करना चाहता था), आपको संशोधित करना होगा OUTPUT, नहीं PREROUTING। इसके अलावा, -Dविकल्प -A मेरे लिए होना चाहिए था । भी, -jविकल्प के लिए, मुझे उपयोग करना था DNAT --to-destination (ip) या REDIRECT --to-port। अंत में, मैं नेट की विभाजन त्रुटि को ठीक नहीं कर सका। इन्हें
phil294


3

iptables+ libnetfilter_qu का उपयोग एक और विकल्प है जो आपकी इच्छा के अनुसार काम करेगा:

"... [पुनः आरंभ करें] कर्नेल nfnetlink_queue सबसिस्टम में बदल पैकेट।"

संभावना है कि यह आपको सबसे अधिक विस्तार देगा क्योंकि यह आपके लिए सॉफ्टवेयर को कोड करना है।

नहीं है आवरण एक अजगर उपलब्ध रूप में अच्छी तरह।


2
नमूना अनुप्रयोग जो netfilter_queue का उपयोग कर रहा है: github.com/rgerganov/nfqsed
rgerganov
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.