1: 1 NAT कई समान लैंस के साथ


13

मैं दूरदराज के भवनों पर स्थित कई LAN कनेक्ट करना चाहता हूं।
"केंद्रीय" साइट में ओपनवीपीएन पर चलने वाला एक लिनक्स कंप्यूटर है। प्रत्येक दूरस्थ साइट OpenVPN भी चलाती है।

  1. केंद्रीय साइट पर 192.168.0.0/24 की एक लैन संख्या है
  2. कई दूरस्थ साइटें भी 192.168.0.0/24 नंबर पर हैं
  3. मैं LAN नंबरिंग को संशोधित / संशोधित नहीं कर सकता / नहीं करना चाहता / कर सकती
  4. अधिकांश रिमोट ओपनवीपीएन पर मेरा नियंत्रण नहीं है

फिर मुझे इसकी आवश्यकता है:
1. वर्चुअल LAN को परिभाषित करें
। प्रत्येक साइट के
लिए 1: 1 NAT कॉन्फ़िगर करें। 1: 1 NAT को केंद्रीय राउटर पर कॉन्फ़िगर करना होगा।

लैन का नक्शा
इसलिए प्रत्येक साइट पर 10.10.x.0 / 24 LAN है।
जब कोई कंप्यूटर 12 साइट पर 192.168.0.44 पर पहुंचना चाहता है, तो उसे 10.10.12.44 पर एक पिकेट भेजना होगा।

वीपीएन का संचालन मेरे लिए कोई समस्या नहीं है। मैं वर्तमान में 60+ साइटों को जोड़ता हूं। लेकिन मुझे यह करने का एक सरल तरीका नहीं मिला 1: 1 NAT।

यहां केंद्रीय साइट से दूरस्थ साइट पर भेजे गए पैकेट का एक उदाहरण है, और इसकी प्रतिक्रिया पैकेट:

यहाँ छवि विवरण दर्ज करें

मैंने iptables NETMAP के साथ कुछ परीक्षण किए लेकिन मैं इसे काम करने का प्रबंधन नहीं कर सकता क्योंकि मुझे निर्णय लेने के बाद स्रोत + गंतव्य को संशोधित करने का कोई तरीका नहीं मिलता है।
मैं नए --client-natOpenVPN की सुविधा से बचना पसंद करता हूं ।
शायद मुझे रूटिंग के साथ मजबूर होना पड़ेगा ip route? या नेटवर्क स्टैक में दो बार लूप के साथ veth?

नोट: मैं बहाना का उपयोग नहीं करना चाहता। केवल 1/1 NAT।

संपादित करें:
यह एक नियमित ओपन वीपीएन सेटअप के साथ संभव नहीं है। क्योंकि एक दूरस्थ साइट से एक पैकेट किसी अन्य साइट के पैकेट से अप्रभेद्य है: दोनों के समान स्रोत और गंतव्य पते हैं, और दोनों एक ही ट्यून (या टैप) इंटरफ़ेस से आते हैं। इसलिए इसे स्रोत-एनएटी के लिए संभव नहीं है।

समाधान 1: दूरस्थ स्थलों पर NAT करें। मेरे मामले में संभव नहीं है। मुझे यह केवल केंद्रीय साइट पर करना होगा।

समाधान 2: प्रत्येक दूरस्थ साइट के लिए एक वीपीएन सेटअप करें। इसलिए मेरे पास प्रत्येक के लिए एक ट्यून होगी। मुझे लगता है कि यह ठीक हो सकता है। बहुत स्मृति कुशल नहीं है, लेकिन ठीक है।

समाधान 3: प्रत्येक साइट के लिए वीपीएन के अंदर एक (अनएन्क्रिप्टेड) ​​सुरंग स्थापित करें। यह प्रत्येक के लिए एक इंटरफ़ेस देगा। सरल सुरंगें क्रॉस-प्लेटफ़ॉर्म (मेरी गाँठ तक) नहीं हैं। उदाहरण के लिए, लिनक्स के लिए जीआरई या आईपिप या सिट ठीक है, लेकिन कुछ दूर की साइटें केवल एक विंडोज कंप्यूटर चला रही हैं, इसलिए इसके लिए ओपन वीपीएन स्थापित है। तो एक साधारण सुरंग को स्थापित करना असंभव है। अन्य विकल्प एक अधिक जटिल सुरंग (विच?) का उपयोग करना है, लेकिन सिस्टम पर उपरि और sysadmin पर कई वीपीएन होने से बड़ा हो सकता है

समाधान 4: नवीनतम ओपनवीपीएन संकलित करें, क्योंकि इसमें 1: 1 NAT सुविधा शामिल है। मैं इस सप्ताह इसका परीक्षण करता हूं।


1
समाधान 4 के लिए आपको संकलन करने की आवश्यकता नहीं है। अधिकांश प्रमुख लिनक्स वितरणों ने आधिकारिक ओपनवीपीएन वेबसाइट पर संकुल संकलित किया है। लेकिन यह आपके लिए काम नहीं करेगा क्योंकि - theclient-nat फीचर एक पॉस्चर विकल्प है। इसलिए आपके क्लाइंट को नवीनतम RC संस्करण का उपयोग करना होगा (और आप कहते हैं कि आपका रिमोट साइट्स पर नियंत्रण नहीं है)।
ग्रेगरी MOUSSAT

1
ठीक है, मैं गलत हूं: - Open -PN के अंदर theclient-nat फीचर 100% है (मुझे लगा कि यह ipfilter का उपयोग कर रहा है)। मैंने अभी-अभी परीक्षण किया है: यह विंडोज पर भी काम करता है। नीचे मेरा समाधान देखें।
ग्रेगरी MOUSSAT

मैं जानना चाहूंगा कि क्या आपको कभी यह काम मिला और आपने क्या किया।
माइकल ग्रांट

जवाबों:


2

एक बहुत ही बुनियादी समाधान है:
1. सर्वर + क्लाइंट के लिए ओपनवीपीएन 2.3 या उससे अधिक (वर्तमान में, नवीनतम 2.3-अल्फा का
उपयोग करें) नीचे दिए गए ओपनवीपीएन कॉन्फ़िगरेशन विकल्प का
उपयोग करें 3. किसी और चीज का उपयोग न करें (कोई आईपीलेटर, कोई ट्रिक नहीं)

सर्वर की ओर, आपको मैन्युअल रूप से वीपीएन पते वितरित करने की आवश्यकता है (इसलिए कोई serverविकल्प नहीं , आपको उपयोग करना होगा ifconfigया ifconfig-push):

# /etc/openvpn/server.conf
ifconfig 10.99.99.1 10.99.99.2
route 10.99.99.0 255.255.255.0
push "route 10.99.99.0 255.255.255.0"
push "client-nat dnat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat dnat 10.99.99.12 255.255.255.255 10.10.112.12"
push "client-nat dnat 10.99.99.13 255.255.255.255 10.10.113.13"

routeऔर push routeऔर client-natलाइनों के लिए आवश्यक हैं अगर आप रूटर के बीच सीधे बातचीत करना चाहते हैं ( ping 10.99.99.1एक दूर साइट से वीपीएन सोचा)। और आप उन्हें त्याग सकते हैं।

अब आपको एक वर्चुअल नेटवर्क एड्रेस चुनना होगा। मैंने आपको अपने उदाहरण में वही रखा है: 10.10.0.0/16
आप इसके लिए मार्ग की अनुमति देते हैं:

# /etc/openvpn/server.conf
route 10.10.0.0 255.255.0.0
push "route 10.10.0.0   255.255.0.0"

अब आपको क्लाइंट को 1: 1 NAT का उपयोग करने का निर्देश देना है:

# /etc/openvpn/ccd/client_11
ifconfig-push 10.99.99.11 10.99.99.1
push "client-nat snat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat snat 192.168.0.0 255.255.255.0 10.10.11.0"
push "client-nat dnat 10.10.10.0 255.255.255.0 192.168.0.0"
iroute 10.10.11.0 255.255.255.0
iroute 10.10.111.0 255.255.255.0

पहली पंक्ति ने रिमोट राउटर का पता सेट किया। विशेष पते की आवश्यकता वाले विंडोज ड्राइवर के बारे में सावधान रहें।
दूसरी और आखिरी लाइनें दूर के राउटर को अपने 10.99.99.x इंटरफ़ेस से संवाद करने की अनुमति देती हैं।
तीसरी और चौथी पंक्तियाँ स्रोत और गंतव्य 1: 1 NAT
पांचवीं पंक्ति OpenVPN को बताती है कि संबंधित पैकेट के साथ क्या करना है।

यह विधि किसी भी छायांकित होस्ट के बिना समान (या नहीं) LAN पते के साथ साइटों को जोड़ने की अनुमति देती है।


1
सरल, प्रतिभाशाली।
बर्ट्रेंड Schits

मैंने यह कोशिश की, लेकिन काम करने के लिए नहीं मिला। मैं दोनों तरफ लिनक्स का उपयोग कर रहा हूं। Somethings अजीब हैं या मैं किसी चीज़ को पूरी तरह से नहीं समझता। आपका ifconfig-client_11 फ़ाइल (पहली पंक्ति) में पुश, क्या 10.99.99.1 के बजाय दूसरे तर्क के लिए नेटमस्क नहीं होना चाहिए? दूसरा, आप इस तीसरे नेटवर्क का उपयोग क्यों कर रहे हैं 10.10.111.0/24? ऐसा लगता है कि आप साइटों के बीच संचार के लिए 111 नेटवर्क का उपयोग करने की कोशिश कर रहे हैं, क्या 10.10 नेटवर्क का उपयोग सीधे उस के लिए नहीं किया जा सकता है? अंत में, कोई फर्क नहीं पड़ता कि मैं क्या कोशिश करता हूं, मैं (tcpdump में) ग्राहक पर पैकेट को प्रभावित करने वाले स्नैट और डनैट को नहीं देखता।
माइकल ग्रांट

वास्तव में सरल नहीं है लेकिन फिर भी शानदार है।
न्यूरोट्रांसमीटर

4

मैंने वास्तविक इंटरफेस के साथ कुछ ऐसा ही किया है, लेकिन मैं यह नहीं देख सकता कि यह वीपीएन इंटरफेस के साथ काम क्यों नहीं करेगा।

विचार यह है कि, जैसा कि आपके पास उस राउटर पर विभिन्न इंटरफेस पर एक ही सबनेट उपलब्ध है, यह रूटिंग को जटिल करता है। मूल रूप से, जब 10.10.13.123 के लिए एक पैकेट राउटर में प्रवेश करता है, तो इसे 192.168.0.123 पर रूट करने से पहले DNATed किया जाता है, इसलिए आपको रूटिंग को यह बताने में सक्षम होना चाहिए कि यह इंटरफेस वीपी 13 पर 192.168.1.123 के लिए था ।

यह फ़ायरवॉल मार्क्स और रूटिंग नियमों का उपयोग करके किया जा सकता है जो उन निशानों का उपयोग करते हैं। SNAT और DNAT को NETMAP फ़ायरवॉल लक्ष्य के साथ किया जाना है। SNAT के लिए, यह एक ही समस्या है, POSTROUTING में, आपने यह जानकारी खो दी है कि पैकेट इस या उस इंटरफ़ेस से आया था और उन्हें सभी का स्रोत पता 192.168.0.x मिला है। तो आपको उस जानकारी को ले जाने के लिए एक निशान की आवश्यकता होती है, जो कि मैंगले-PREROUTING से नेट-पोस्टिंग के लिए होती है। आप एक ही चिह्न का उपयोग कर सकते हैं, लेकिन तब इसका मतलब होगा कि वे पैकेट उस वैकल्पिक मार्ग तालिका का उपयोग करेंगे, इसलिए आपको वैश्विक रूटिंग तालिका की नकल करने की आवश्यकता होगी।

प्रत्येक नेटवर्क के लिए, आप यह करेंगे:

lnet=192.168.0.0/24
if10=eth0 if11=tun0 if12=tun1 if13=tun2

n=0
for site in 10 11 12 13; do
  table=$site
  net=10.10.$site.0/24
  n=$(($n + 1))
  eval "interface=\$if$site"
  inmark=$(($n * 2)) outmark=$(($n * 2 + 1))

  iptables -t nat -A PREROUTING -d "$net" -j NETMAP --to "$lnet"
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -m mark --mark "$inmark"/0xf -j NETMAP --to "$net"
  iptables -t mangle -A PREROUTING -i "$interface" -j MARK --set-mark "$inmark"/0xf
  iptables -t mangle -A PREROUTING -d "$net" -j MARK --set-mark "$outmark"/0xf
  ip rule add fwmark "$outmark"/0xf table "$table"
  ip route add "$lnet" dev "$interface" table "$table"
done

ऊपर, हम निशान के पहले 4 बिट्स का उपयोग कर रहे हैं , 7 नेटवर्क तक उस तरह से रूट करने की अनुमति देते हैं।


1
आपके उत्तर के लिए धन्यवाद। मैंने इसका परीक्षण किया लेकिन यह काम नहीं करता है। मैंने केवल एक लैन के साथ परीक्षण किया, कोई और परिणाम नहीं। मैं पैकेटों की निगरानी के लिए tcpdump का उपयोग करता हूं, और जब मैं रिमोट से सेंट्रेल साइट पर पैकेट भेजता हूं, तो मुझे कुछ भी दिखाई नहीं देता (? यह कैसे संभव है?)। आपके निर्देशों के साथ, मैं अपने कदम से कदम जवाब देने की कोशिश करता हूं। यकीन नहीं होता कि मैं सफल होऊंगा।
बर्ट्रेंड स्किट्स

2
मेरा उत्तर केवल यह बताता है कि केंद्रीय साइट पर क्या करना है। मुझे लगता है कि आप अन्य साइटों पर सही तरीके से रूटिंग कॉन्फ़िगर करते हैं। उदाहरण के लिए, आपको संभवतः दूरस्थ स्थानों पर वीपीएन सुरंग के माध्यम से 10.10.0.0/16 पर एक मार्ग जोड़ना होगा। आपको उन पैकेटों के माध्यम से बताने के लिए ओपनवपन को भी बताना पड़ सकता है। किसी भी चढ़ाई में, tcpdump का उपयोग करके यह देखना कि कौन सा पैकेट कहाँ और कैसे सही दृष्टिकोण है। iptables LOG लक्ष्य आपका मित्र भी है।
स्टीफन चेजेलस

2
यदि आप कोई पैकेट नहीं देखते हैं, तो आपको अपने ओपनवैप लॉग में देखना होगा। आपको शायद गिरा हुआ पैकेट मिलेगा। यदि यह स्थिति है, तो प्रत्येक क्लाइंट के लिए "क्लाइंट 19 -.168.0.0 255.255.255.0" एक "iroute" का उपयोग अपने ग्राहक-config-dir
ग्रेगरी MOUSSAT
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.