मेरे पास अपने घर नेटवर्क के लिए 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
चूंकि मैं लूपबैक का उपयोग नहीं कर रहा हूं, यह मार्टियन अस्वीकृति के आसपास हो जाता है।
मैं अभी भी दो कारणों से यहां प्रश्न पोस्ट कर रहा हूं:
- इस उम्मीद में कि भविष्य में ऐसा ही कुछ करने की कोशिश करने वाला व्यक्ति अपनी खोजों में इसे खोज सकता है और यह काम उनकी मदद कर सकता है।
- मैं अभी भी अपने ssh पोर्ट फॉरवर्ड कनेक्शन को केवल लूपबैक के लिए बाध्य रखने और iptables के माध्यम से उन्हें रूट करने में सक्षम होने के विचार को पसंद करता हूं। चूंकि मुझे ठीक से पता है कि ये पैकेट क्या हैं और वे कहां जा रहे हैं, तो क्या मुझे उनके लिए इस तरह से झंडा लगाने का कोई रास्ता नहीं होना चाहिए ताकि लिनक्स शहीद फ़िल्टरिंग उन्हें अस्वीकार न करें? इस विषय पर मेरी सभी खोज rp_filter की ओर ले जाती है, जिसने मेरे परीक्षण में बिल्कुल भी मदद नहीं की। और यहां तक कि अगर यह काम किया, यह सटीक पैकेट मैं अनुमति देने के लिए कोशिश कर रहा हूँ के लिए विशिष्ट नहीं है।
मैं अपने प्रश्न को योगदान देने में दिलचस्पी रखता हूं और सामान्य खोज में किसी और को बचाने के लिए काम करता हूं, खोज के घंटों को मैंने केवल मृत सिरों के साथ आने के लिए किया है, साथ ही साथ उम्मीद है कि कोई मेरे प्रश्न का लूपबैक / मार्टियन हिस्सा है जो अभी भी खुला है मेरे लिए।