एक ही नेटवर्क में एक आईपी से दूसरे आईपी में पोर्ट कैसे करें?


77

मैं कुछ करना चाहते हैं NATमें iptables। ताकि, 192.168.12.87और आने वाले सभी पैकेट 80को 192.168.12.77पोर्ट के लिए भेज दिया जाएगा 80

यह iptables के साथ कैसे करें?

या

उसी को प्राप्त करने के लिए कोई अन्य तरीके?


@ मैथ्यूफ्लोरे, किसी कारण से, मुझे (192.168.12.87) से (192.168.12.77) सभी अपाचे अनुरोध को आगे बढ़ाने की आवश्यकता है।
बैठे

1
@ मैथ्यूफ़्लोरे, मेरे पास दो उत्पादन सर्वर हैं। एक सार्वजनिक स्थैतिक आईपी पते के साथ जुड़ा हुआ है। कुछ कनेक्टिविटी मुद्दों के कारण, मैं DB और अन्य प्रणालियों से कनेक्ट नहीं कर पा रहा हूं 192.168.12.87। इसलिए, मुझे सभी अनुरोधों को आगे बढ़ाने की जरूरत है 192.168.12.77
बैठा

@ चलो, मैं परिचित नहीं हूँ iptables। और, मैंने कुछ उदाहरण देखे। लेकिन, ऐसा लगता है कि दो ईथरनेट की आवश्यकता है। लिंक: Revsys.com/writings/quicktips/nat.html
बैठा

आप 192.168.12.77 से 192.168.12.77 (यदि आपका वेबसर्वर इसका समर्थन करता है) को
1944.168.12.77

जवाबों:


74

इन नियमों को काम करना चाहिए, यह मानते हुए कि iptablesसर्वर पर चल रहा है 192.168.12.87:

#!/bin/sh

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -t nat -F
iptables -X

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.12.77 --dport 80 -j SNAT --to-source 192.168.12.87

आपको पोर्ट 80 पर आने वाले ट्रैफिक को डीएनएटी करना होगा, लेकिन आपको ट्रैफिक को वापस करना भी होगा।


वैकल्पिक (और सर्वोत्तम दृष्टिकोण IMHO):

आपका वेब सर्वर (Apache, NGinx) क्या है, इस पर निर्भर करते हुए, आपको अपने फ्रंट-एंड सर्वर (192.168.12.87) पर एक HTTP प्रॉक्सी पर विचार करना चाहिए:


Ufw के रूप में लंबे समय तक काम करता है, भले ही बंदरगाह ufw में अनुमति देता है, लेकिन अगर ufw सक्षम है, तो यह अग्रेषण सामान काम नहीं करता है, कोई विचार?
सुधीर एन

1
शानदार जवाब के साथ शानदार सवाल। इसके लिए एक और उपयोग-मामला उपयोगी है, यदि आपको अस्थायी रूप से एक सेवा में आने वाले सभी ट्रैफ़िक को पुनर्निर्देशित करने की आवश्यकता है, तो अन्य आईपी / पोर्ट को स्क्वीड करें, ताकि सभी क्लाइंट को फिर से कॉन्फ़िगर करने की आवश्यकता के बिना मूल सेवा पर कुछ रखरखाव किया जा सके! बेहद सुविधाजनक!
PF4Public

3
"लेकिन आपको ट्रैफ़िक वापस लाने की भी आवश्यकता होगी।" -> आपने मेरा दिन बचाया। धन्यवाद
obayhan

यह समाधान मेरे लिए काम नहीं कर रहा है। मुझे eth0 से एक वर्चुअल नेटवर्क (virb0) से फॉरवर्ड करने की आवश्यकता है जिसका उपयोग KVM- अतिथि द्वारा किया जाता है। मैंने -i और -o विकल्प जोड़ने की कोशिश की, लेकिन -प्रोटर्मेटिंग के लिए अनुमति नहीं दी। कोई सुझाव?
हेंस्टिकलैंड

इस उपाय से सावधान रहें। मैंने अब अपनी रिमोट मशीन का उपयोग पूरी तरह से खो दिया है।
सॉरेन

28

स्पष्ट रूप iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77से काम नहीं करने का कारण यह है कि रिटर्न पैकेट कैसे रूट किया जाएगा।

आप ऐसे नियम स्थापित कर सकते हैं जो पैकेट को 192.168.12.87 पर भेजेंगे और केवल 192.168.12.77 पर नैटेड होंगे, लेकिन 192.168.12.77 ग्राहक को सीधे जवाब भेज देंगे। वे उत्तर होस्ट के माध्यम से नहीं जाएंगे जहां आपके iptables नियम NAT कर रहे हैं, इसलिए एक दिशा में पैकेट का अनुवाद किया जाता है, लेकिन दूसरी दिशा में पैकेट नहीं हैं।

इस समस्या को हल करने के लिए तीन दृष्टिकोण हैं।

  1. पहले मेजबान पर सिर्फ डीएनएटी नहीं करते हैं, लेकिन यह भी एसएनएटी ऐसा करते हैं कि वापसी यातायात पहले मेजबान के माध्यम से वापस भेज दिया जाएगा। नियम कुछ ऐसा दिख सकता थाiptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
  2. DSR लोड बैलेंसिंग से प्रेरणा लें और IP लेयर की बजाय ईथरनेट लेयर में पैकेट्स को डीएनएटी से लें। 192.168.12.77 के मैक के साथ पैकेट के गंतव्य मैक को बदलकर और आईपी परत को छूने के बिना ईथरनेट पर भेजना, फिर 192.168.12.77 एक डमी इंटरफ़ेस पर 192.168.12.87 कॉन्फ़िगर हो सकता है और इस तरह टीसीपी कनेक्शन को समाप्त करने में सक्षम हो सकता है। क्लाइंट के लिए ज्ञात सर्वर आईपी के साथ।
  3. पहले मेजबान पर भोले (लेकिन काम नहीं) समाधान का उपयोग करें। फिर रिटर्न ट्रैफिक पर एक SNAT कर दूसरे होस्ट पर रिटर्न पैकेट संभालें। एक नियम की तरह लग सकता हैiptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87

उन तीन समाधानों में से प्रत्येक में कमियां हैं, इसलिए आपको सावधानीपूर्वक विचार करने की आवश्यकता है, अगर आपको वास्तव में इस विशेष अग्रेषण को करने की आवश्यकता है।

  1. SNAT का उपयोग करने से क्लाइंट IP खो जाएगा, इसलिए होस्ट नंबर 2 को लगेगा कि सभी कनेक्शन 192.168.12.87 से आए थे। इसके अतिरिक्त आप सभी उत्तर पैकेटों के लिए होस्ट नंबर 1 के माध्यम से बैंडविड्थ का उपयोग करेंगे, जो अन्य तरीकों के साथ अधिक सीधा मार्ग लेगा।
  2. डीएसआर दृष्टिकोण दोनों नोड्स के बीच अन्य सभी संचार को तोड़ देगा। डीएसआर दृष्टिकोण वास्तव में केवल तभी उपयुक्त होता है जब सर्वर एड्रेस किसी भी होस्ट का प्राथमिक आईपी नहीं होता है। प्रत्येक मेजबान के पास एक प्राथमिक आईपी होना चाहिए, जो डीएसआर आईपी नहीं है।
  3. एक दिशा में अनुवाद करने के लिए एक होस्ट पर कनेक्शन ट्रैकिंग का उपयोग करना और दूसरी दिशा में अनुवाद करने के लिए दूसरे होस्ट पर कनेक्शन ट्रैकिंग सादे बदसूरत है, और विभिन्न तरीके हैं जो इसे तोड़ सकते हैं। उदाहरण के लिए यदि पोर्ट नंबर NAT द्वारा होस्ट पर संशोधित किए गए हैं, तो उन को फिर से संगठित करने का कोई तरीका नहीं है। यह भी एक दिया नहीं है, कि कनेक्शन ट्रैकिंग सही ढंग से काम करेगा, अगर यह पहला पैकेट देखता है तो ACK के बजाय SYN-ACK है।

तीन दृष्टिकोणों में से, मुझे लगता है कि पहला वह है, जो काम करने की सबसे अधिक संभावना है। इसलिए यदि आपको क्लाइंट आईपी पते को जानने की आवश्यकता नहीं है, तो वह वही है जो मैं सुझाऊंगा।

आप NAT के बारे में पूरी तरह से भूल सकते हैं और MAC या IP लेयर पर समस्या को हल करने का प्रयास नहीं कर सकते। आप HTTP लेयर तक सभी तरह से जा सकते हैं और वहां एक समाधान की तलाश कर सकते हैं। उस स्थिति में आपको जो समाधान मिलेगा वह एक HTTP प्रॉक्सी है। यदि आप 192.168.12.87 पर HTTP प्रॉक्सी स्थापित करते हैं और इसे उचित रूप से कॉन्फ़िगर करते हैं, तो आप इसे अनुरोधों को 192.168.12.77 पर अग्रेषित कर सकते हैं और उत्तरों को आगे भेज सकते हैं। इसके अतिरिक्त यह मूल क्लाइंट IP को संरक्षित करने वाले X- फ़ॉर्वर्ड-फॉर हेडर डाल सकता है। 192.168.12.77 पर सर्वर को 192.168.12.17 से X- फॉरवर्डेड-फॉर हेडर पर भरोसा करने के लिए कॉन्फ़िगर करने की आवश्यकता है।


मुझे आश्चर्य -j MASQUERADEहै कि यहाँ उल्लेख नहीं किया गया है; यह DNAT के साथ सामान्य दृष्टिकोण नहीं है?
रेराम

3
@remram मैंने SNATइसके बजाय उल्लेख किया MASQUERADE, क्योंकि वह वही है जो प्रलेखन कहता है। प्रलेखन में सटीक शब्द है:It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
kasperd
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.