विशिष्ट प्रक्रिया के लिए बैकअप इंटरनेट कनेक्शन

Aug 17 2020

मैं अपने लिनक्स सर्वर में एक सेकेंडरी बैकअप इंटरनेट कनेक्शन जोड़ना चाहूंगा। मैं इस उद्देश्य के लिए एक USB LTE मॉडेम का उपयोग करने की योजना बना रहा हूं।

क्योंकि यह सेलुलर कनेक्शन पैमाइश किया जाएगा, मैं उस डेटा की मात्रा को सीमित करना चाहता हूं जो पूरी तरह से आवश्यक न्यूनतम उपभोग कर सकता है।

मेरे पास एक कस्टम सर्वर एप्लिकेशन है जिसे मैं किसी भी परिवर्तन कर सकता हूं। इसमें कुछ कार्य हैं जहां निर्बाध कनेक्टिविटी महत्वपूर्ण है, और अन्य कार्य जहां डाउनटाइम वास्तव में मायने नहीं रखता है।

मैं कुछ इस तरह की कल्पना कर रहा हूँ:

  • सर्वर को एक बाहरी HTTP एपीआई अनुरोध बनाने की आवश्यकता है। पहला प्रयास सिस्टम के डिफॉल्ट रूट (जैसे कि eth0, प्राथमिक इंटरनेट कनेक्शन) पर किया जाता है।
  • यदि अनुरोध विफल हो जाता है या समय समाप्त हो जाता है, तो LTE इंटरफ़ेस पर अनुरोध को पुनः प्रयास करें।

केवल ट्रैफ़िक जिसे मेरी सर्वर प्रक्रिया स्पष्ट रूप से एलटीई पर भेजना चाहती है उसे एलटीई पर भेजा जाना चाहिए। सिस्टम के किसी भी हिस्से से कोई अन्य यातायात एलटीई पर नहीं जाना चाहिए।

  • विशेष रूप से, मैं localAddressयह निर्दिष्ट करने के लिए नोड के सॉकेट विकल्प का उपयोग करूंगा कि एलटीई पर अनुरोध किया जाना चाहिए।
  • मैं यह कैसे सुनिश्चित करूँ कि अन्य ट्रैफ़िक LTE इंटरफ़ेस पर रूटिंग को समाप्त नहीं करता है (भले ही eth0 डाउन हो)?
  • DNS रिज़ॉल्यूशन के बारे में क्या?

जवाब

josh3736 Sep 01 2020 at 03:53

मैं एक कॉन्फ़िगर करके इसे प्राप्त करने समाप्त हो गया वैकल्पिक मार्ग तालिका और एक मार्ग नीति नियम बैकअप इंटरफ़ेस का स्रोत पते के लिए।

USB LTE मॉडम मेरे पास NDIS डिवाइस के रूप में प्रस्तुत है, इसलिए यह केवल eth1192.168.0.190 के IP के साथ दिखाई देता है और यह NAT को आंतरिक रूप से रूट करता है। मैंने eth1एक स्थिर आईपी और मैन्युअल रूप से कॉन्फ़िगर किए गए मार्गों के साथ कॉन्फ़िगर किया है।

  1. डिफ़ॉल्ट कॉन्फ़िगरेशन डीएचसीपी का उपयोग करता है, इसलिए इंटरफ़ेस को नीचे लाएं और सुनिश्चित करें कि स्वचालित रूप से जोड़े गए मार्ग हटा दिए गए हैं।

  2. इंटरफ़ेस के लिए एक स्थिर आईपी कॉन्फ़िगरेशन जोड़ें और इसे ऊपर लाएं।

  3. 1सबनेट और डिफ़ॉल्ट गेटवे के लिए एक वैकल्पिक रूटिंग टेबल (मैंने चुना है ) में प्रविष्टियां जोड़ें ।

    # ip route add 192.168.0.0/24 dev eth1 src 192.168.1.190 table 1
    # ip route add default via 192.168.0.1 table 1
    
  4. रूटिंग नीति नियमों को सेट करें ताकि जो एप्लिकेशन स्पष्ट रूप से 192.168.1.190 का उपयोग करें, क्योंकि उनके स्रोत पते डिफ़ॉल्ट के बजाय रूटिंग तालिका 1 का उपयोग करेंगे।

    # ip rule add from 192.168.0.190/32 table 1
    # ip rule add to 192.168.0.190/32 table 1
    

इस बिंदु पर, आपको अपनी कनेक्टिविटी का परीक्षण करने में सक्षम होना चाहिए।

$ curl https://wtfismyip.com/text 1.2.3.4 # primary ISP external IP $ curl --interface 192.168.0.190 https://wtfismyip.com/text
5.6.7.8  # backup LTE external IP

यदि सभी अच्छे लगते हैं, तो कॉन्फ़िगरेशन को स्थायी बनाएं। मैंने इसमें जोड़ा /etc/network/interfaces:

iface eth1 inet static
        address 192.168.0.190
        netmask 255.255.255.0
        post-up ip route add 192.168.0.0/24 dev eth1 src 192.168.0.190 table 1
        post-up ip route add default via 192.168.0.1 table 1
        post-up ip rule add from 192.168.0.190/32 table 1
        post-up ip rule add to 192.168.0.190/32 table 1

अब केवल ऐसे ऐप जो स्पष्ट रूप से आउटगोइंग कनेक्शन बनाते समय 192.168.0.190 से जुड़ते हैं, उन्हें बैकअप कनेक्शन पर रूट किया जाएगा। अन्य सभी ट्रैफ़िक को रूट किया जाता है eth0(या जो भी main[डिफ़ॉल्ट] रूटिंग टेबल में कॉन्फ़िगर किया गया है )।

यह संभव है कि आपके पास कुछ ऐसा हो जो सभी उपलब्ध आईपी को एनुमरेट करता है और उनसे ट्रैफ़िक भेजने का प्रयास करता है, जिसके परिणामस्वरूप बैकअप कनेक्शन पर अप्रत्याशित ट्रैफ़िक हो सकता है, लेकिन इसकी संभावना कम है। मैंने ऐसा कोई ट्रैफ़िक नहीं देखा है।

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


नोड के साथ, एक विशेष स्रोत पते से HTTP अनुरोध (या कोई टीसीपी कनेक्शन) बनाना आसान है। बस localAddressविकल्प निर्दिष्ट करें , जैसे:

https.get('https://wtfismyip.com/text', { localAddress: '192.168.0.190' }, …);

DNS लुकअप को हल करना थोड़ा पेचीदा है। एक lookupविकल्प भी उपलब्ध है, जो आपको डिफ़ॉल्ट DNS रिज़ॉल्यूशन प्रक्रिया को ओवरराइड करने की अनुमति देता है। आप dns.Resolverलुकअप करने के लिए एक कस्टम का उपयोग कर सकते हैं । दुर्भाग्य से, नोड में DNS लुकअप के लिए स्रोत पता निर्दिष्ट करने का कोई तरीका नहीं था, इसलिए मैंने इसे जोड़ा । उस जगह के साथ, आप टुकड़ों को एक साथ रख सकते हैं:

const resolver = new dns.Resolver();
resolver.setServers(['8.8.8.8']);
resolver.setLocalAddress('192.168.0.190'); // requires node > v15.0.0

https.get('https://wtfismyip.com/text', {
  localAddress: '192.168.0.190',
  lookup: function(hostname, opts, cb) {
    resolver.resolve(hostname, function(err, records) {
      if (err) cb(err);
      else if (!records[0]) cb(new Error('Missing DNS record'));
      else cb(null, records[0], 4);
    });
  }
}, function(res) { … });