लिनक्स iptables ssh पोर्ट फ़ॉरवर्डिंग (मार्टियन रिजेक्शन)


12

मेरे पास अपने घर नेटवर्क के लिए NAT का प्रदर्शन करने वाला एक Linux गेटवे है। मेरे पास एक और नेटवर्क है, जिसे मैं पैकेट को पारदर्शी रूप से अग्रेषित करना चाहता हूं, लेकिन केवल विशिष्ट आईपी / पोर्ट से (यानी वीपीएन नहीं)। यहाँ कुछ उदाहरण IP और बंदरगाहों के साथ काम करना है:

Source          Router          Remote Gateway     Remote Target
192.168.1.10 -> 192.168.1.1 ->  1.2.3.4        ->  192.168.50.50:5000

मैं चाहूंगा कि सोर्स मशीन रिमोट टारगेट पर विशिष्ट पोर्ट्स से बात करने में सक्षम हो जैसे कि यह सीधे राउटर से रूटेबल था। राउटर पर, eth0 निजी नेटवर्क है और eth1 इंटरनेट का सामना कर रहा है। रिमोट गेटवे एक और लिनक्स मशीन है जिसे मैं ssh कर सकता हूं और यह सीधे रिमोट टारगेट पर जा सकती है।

एक सरल समाधान पर मेरा प्रयास राउटर पर ssh पोर्ट अग्रेषण सेट करना है, जैसे:

ssh -L 5000:192.168.50.50:5000 1.2.3.4

यह राउटर के लिए ठीक काम करता है, जो अब स्थानीय रूप से 5000 पोर्ट से कनेक्ट कर सकता है। इसलिए "टेलनेट लोकलहोस्ट 5000" को 192.168.50.50 और 2000 से अपेक्षित रूप से जोड़ा जाएगा।

अब मैं अब स्थापित ssh सुरंग के माध्यम से स्रोत और कीप से यातायात को पुनर्निर्देशित करना चाहता हूं। मैंने इसके लिए NAT नियम का प्रयास किया:

iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000

और चूंकि राउटर पहले से ही मेरा NAT गेटवे है, इसलिए इसमें पहले से ही जरूरी पोस्टिंग नियम है:

-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

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

सबसे अच्छा जवाब मैं लिनक्स कर्नेल में मार्टियन पैकेट अस्वीकृति से संबंधित पा सकता हूं:

iptables, लूपबैक से पोर्ट को रीडायरेक्ट कैसे करें?

मैंने मार्टिंस के लॉगिंग को सक्षम किया है और पुष्टि की है कि कर्नेल इन पैकेटों को मार्टियन के रूप में अस्वीकार कर रहा है। सिवाय इसके कि वे नहीं हैं: मुझे पता है कि ये पैकेट किस लिए हैं, वे कहाँ से हैं और वे कहाँ जा रहे हैं (मेरी ssh सुरंग)।

वहां प्रस्तुत "राउंडअबाउट" समाधान उस मूल प्रश्न पर लागू होता है, लेकिन मेरे मामले के लिए लागू नहीं होता है।

हालाँकि, इस प्रश्न को लिखते / शोध करते समय, मैंने SSH स्रोत IP बाइंडिंग का उपयोग करके अपनी समस्या के आसपास काम किया है:

ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000

चूंकि मैं लूपबैक का उपयोग नहीं कर रहा हूं, यह मार्टियन अस्वीकृति के आसपास हो जाता है।

मैं अभी भी दो कारणों से यहां प्रश्न पोस्ट कर रहा हूं:

  1. इस उम्मीद में कि भविष्य में ऐसा ही कुछ करने की कोशिश करने वाला व्यक्ति अपनी खोजों में इसे खोज सकता है और यह काम उनकी मदद कर सकता है।
  2. मैं अभी भी अपने ssh पोर्ट फॉरवर्ड कनेक्शन को केवल लूपबैक के लिए बाध्य रखने और iptables के माध्यम से उन्हें रूट करने में सक्षम होने के विचार को पसंद करता हूं। चूंकि मुझे ठीक से पता है कि ये पैकेट क्या हैं और वे कहां जा रहे हैं, तो क्या मुझे उनके लिए इस तरह से झंडा लगाने का कोई रास्ता नहीं होना चाहिए ताकि लिनक्स शहीद फ़िल्टरिंग उन्हें अस्वीकार न करें? इस विषय पर मेरी सभी खोज rp_filter की ओर ले जाती है, जिसने मेरे परीक्षण में बिल्कुल भी मदद नहीं की। और यहां तक ​​कि अगर यह काम किया, यह सटीक पैकेट मैं अनुमति देने के लिए कोशिश कर रहा हूँ के लिए विशिष्ट नहीं है।

मैं अपने प्रश्न को योगदान देने में दिलचस्पी रखता हूं और सामान्य खोज में किसी और को बचाने के लिए काम करता हूं, खोज के घंटों को मैंने केवल मृत सिरों के साथ आने के लिए किया है, साथ ही साथ उम्मीद है कि कोई मेरे प्रश्न का लूपबैक / मार्टियन हिस्सा है जो अभी भी खुला है मेरे लिए।


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

क्या net.ipv4.conf.default.rp_filter = 0 और net.ipv4.conf.all.rp_filter = 0 को आपके /etc/sysctl.conf में डालने और "sudo sysctl -p" करने से आपकी समस्या हल होती है?
रुई एफ रिबेरो

मैंने उन दोनों को सीधे लागू करने की कोशिश की, अर्थात। 'sysctl net.ipv4.conf.default.rp_filter = 0', मेरे विशिष्ट निजी इंटरफ़ेस के लिए एक भी शामिल है। मैंने पुष्टि की है कि वे 'sysctl -a' के माध्यम से सेट हैं, हालांकि, 127.0.0.1 के लिए मार्टियन पैकेट अभी भी अस्वीकार किए जा रहे हैं। और यहां तक ​​कि अगर यह काम किया, तो मेरे सभी इंटरफेस को मार्टियंस के लिए खोलना वह नहीं है जो मैं चाहता हूं। न ही मैं एक भी (ऐल्बिएट प्राइवेट) इंटरफेस खोलना चाहता हूं। मुझे पता है कि मैं कौन से मार्शल पैकेट की अनुमति देना चाहता हूं और एक iptables NAT / मंगल की अभिव्यक्ति के लिए इच्छा / उम्मीद कर रहा हूं ताकि मैं इसे पूरा कर सकूं।
मार्क

आप net.ipv4.conf.default.rp_filter = 2 और कुछ अन्य iptables नियम चाहते हैं
रुई एफ रिबेरो

जवाबों:


1

डीएनएटी को 127.0.0.1.1000 करने के साथ मुद्दा यह है कि जब रिमोट साइड प्रतिक्रिया करता है, तो ये पैकेट रूटिंग इंजन में वापस आ जाते हैं जैसे कि वे स्थानीय रूप से उत्पन्न हुए थे (127.0.0.1 से) लेकिन उनके पास एक बाहरी गंतव्य पता है। SNAT / MASQUERADE ने बाहरी इंटरफ़ेस से मेल खाते हुए उन्हें पकड़ा और उन्हें फिर से लिखा, लेकिन पैकेट के लिए किए जाने वाले राउटिंग निर्णय पहले उस इंटरफ़ेस पर आने के लिए होते हैं, और वे इन पैकेटों को अस्वीकार कर देते हैं जो डिफ़ॉल्ट रूप से फर्जी होते हैं। रूटिंग इंजन गारंटी नहीं दे सकता है कि आप बाद में फिर से लिखना चाहते हैं।

स्रोत के विनिर्देशन विनिर्देश !से पहले तर्क का उपयोग करते हुए 192.168.1.10 से आने वाले अन्य लोगों की तुलना में आप जो कुछ भी कर सकते हैं वह करने के लिए 192.168.1.1 के लिए किसी भी बाहरी कनेक्शन को अस्वीकार कर दें -s। यदि आप टीसीपी रिसेट को रिजेक्शन मैकेनिज्म ( -j REJECT --reject-with tcp-resetडिफॉल्ट ICMP डेस्टिनेशन के बजाय पहुंच से बाहर) के रूप में उपयोग करते हैं, तो यह काफी हद तक उस स्थिति के समान होगा जहां कुछ भी उस पते पर नहीं सुन रहा था: पोर्ट संयोजन जहां तक ​​बाहरी दुनिया का संबंध है।


0

मैं राउटर से रिमोटगेटवे तक एक सुरंग बनाने के लिए ओपनवीपीएन का उपयोग करूंगा।

फिर मैं राउटर पर, एक मार्ग जोड़ूंगा:

मार्ग एड -हॉस्ट रिमोटटेगेट जीडब्ल्यू रिमोटगेटवे-वीपीएनड्रेस

सरल iptables नियम का उपयोग करें जहाँ भी आप उस पोर्ट को सीमित करना पसंद करते हैं जिसे आप स्रोत को प्राप्त करने की अनुमति देते हैं।

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