Belirli bir süreç için yedek internet bağlantısı

Aug 17 2020

Linux sunucuma ikincil bir yedek internet bağlantısı eklemek istiyorum. Bu amaçla bir USB LTE modem kullanmayı planlıyorum.

Bu hücresel bağlantı ölçüleceğinden, tüketilebilecek veri miktarını mutlak minimum gerekli ile sınırlamak istiyorum.

Herhangi bir değişiklik yapabileceğim özel bir sunucu uygulamam var. Kesintisiz bağlantının kritik olduğu birkaç görevi ve kesinti süresinin gerçekten önemli olmadığı diğer görevleri vardır.

Bunun gibi bir şey hayal ediyorum:

  • Sunucunun harici bir HTTP API isteği yapması gerekiyor. İlk deneme, sistemin varsayılan yolu (yani eth0, birincil internet bağlantısı) üzerinden yapılır.
  • İstek başarısız olursa veya zaman aşımına uğrarsa, isteği LTE arayüzü üzerinden yeniden deneyin.

Yalnızca sunucu işlemimin açıkça LTE üzerinden göndermek istediği trafik LTE üzerinden gönderilmelidir. Sistemin herhangi bir bölümünden gelen başka hiçbir trafik LTE üzerinden geçmemelidir.

  • Özellikle, localAddressisteğin LTE üzerinden yapılması gerektiğini belirtmek için düğümün soket seçeneğini kullanacağım.
  • Diğer trafiğin LTE arayüzü üzerinden yönlendirilmemesini nasıl sağlayabilirim (eth0 kapalı olsa bile)?
  • DNS çözümlemesi ne olacak?

Yanıtlar

josh3736 Sep 01 2020 at 03:53

Yedekleme arayüzünün kaynak adresi için alternatif bir yol tablosu ve bir yönlendirme ilkesi kuralı yapılandırarak bunu başardım .

Sahip olduğum USB LTE modem bir NDIS cihazı olarak sunuluyor, bu yüzden sadece eth1192.168.0.190 IP'sinde olduğu gibi görünüyor ve dahili olarak NAT yönlendirmesi yapıyor. Ben yapılandırılmış ettik eth1statik IP ve elle yapılandırılan yolları.

  1. Varsayılan yapılandırma DHCP kullanır, bu nedenle arayüzü kapatın ve otomatik olarak eklenen tüm yolların silindiğinden emin olun.

  2. Arayüz için statik bir IP yapılandırması ekleyin ve açın.

  3. 1Alt ağ ve varsayılan ağ geçidi için alternatif bir yönlendirme tablosuna (seçtim ) girişler ekleyin .

    # 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. Yönlendirme ilkesi kurallarını, kaynak adresi olarak açıkça 192.168.1.190 kullanan uygulamaların varsayılan yerine yönlendirme tablosu 1'i kullanması için ayarlayın.

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

Bu noktada, bağlantınızı test edebilmelisiniz.

$ 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

Her şey yolunda görünüyorsa, yapılandırmayı kalıcı hale getirin. Ekledim /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

Artık yalnızca, giden bağlantılar yaparken açıkça 192.168.0.190'a bağlanan uygulamalar yedek bağlantı üzerinden yönlendirilecektir. Diğer tüm trafik eth0(veya main[varsayılan] yönlendirme tablosunda yapılandırılan her ne olursa olsun) üzerinden yönlendirilir.

Öyle mümkün yedekleme bağlantısı üzerinden beklenmeyen trafikte neden olabilecek onlardan trafik göndermek için mevcut tüm IP'leri ve girişimleri sıralar şey olduğunu, ama bu pek mümkün değil. Ben böyle bir trafik görmedim.

Bunun DNS çözümlemesini ele almadığını unutmayın. Birincil bağlantının çevrimdışı olduğu bir durumda, şansınız olabilir ve önbellekten arama alabilirsiniz, ancak buna güvenmek iyi değildir. Sistem genelinde çözümleyiciyi de LTE arabirimi üzerinden istek gönderecek şekilde yapılandırmazdım. Bunun yerine, uygulamanız yedekleme isteklerinde bulunurken DNS çözümlemesini manuel olarak işleyebilir.


Düğüm ile, belirli bir kaynak adresinden HTTP istekleri (veya herhangi bir TCP bağlantısı) yapmak kolaydır. localAddressSeçeneği belirtmeniz yeterlidir , örneğin:

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

DNS aramasını çözmek biraz daha zordur. lookupVarsayılan DNS çözümleme sürecini geçersiz kılmanıza izin veren bir seçenek de mevcuttur. Arama dns.Resolveryapmak için bir özel kullanabilirsiniz . Ne yazık ki, düğümün DNS aramaları için kaynak adresini belirtme yolu yoktu, bu yüzden onu ekledim . Bunu yerine koyarak parçaları bir araya getirebilirsiniz:

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) { … });