Apakah mungkin memiliki beberapa gateway default untuk koneksi keluar?

15

Saya ingin memiliki beberapa NIC (eth0 dan wlan0) di subnet yang sama dan berfungsi sebagai cadangan untuk aplikasi pada host jika salah satu NIC gagal. Untuk alasan ini saya telah membuat tabel routing tambahan. Begini /etc/network/interfacestampilannya:

iface eth0 inet static
address 192.168.178.2
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.2
    post-up ip route add default via 192.168.178.1 dev eth0
    post-up ip rule add from 192.168.178.2/32
    post-up ip rule add to 192.168.178.2/32

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.3
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.3 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.3/32 table rt2
    post-up ip rule add to 192.168.178.3/32 table rt2

Itu berfungsi untuk menghubungkan ke host: Saya masih bisa SSH ke dalamnya jika salah satu antarmuka gagal. Namun, aplikasi pada host tidak dapat menginisialisasi koneksi ke dunia luar jika eth0sedang down. Itu masalah saya.

Saya telah meneliti topik itu dan menemukan informasi menarik berikut:

Ketika suatu program memulai koneksi keluar, normal baginya untuk menggunakan alamat sumber wildcard (0.0.0.0), menunjukkan tidak ada preferensi untuk antarmuka yang digunakan asalkan alamat tujuan yang relevan dapat dijangkau. Ini tidak digantikan oleh alamat sumber tertentu sampai setelah keputusan routing dibuat. Lalu lintas yang terkait dengan koneksi seperti itu tidak akan cocok dengan salah satu aturan kebijakan di atas, dan tidak akan diarahkan ke salah satu dari tabel routing yang baru ditambahkan. Dengan asumsi konfigurasi normal, itu akan jatuh ke tabel routing utama. http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html

Apa yang saya inginkan adalah tabel rute utama memiliki lebih dari satu gateway default (satu eth0dan satu wlan0) dan untuk pergi ke gateway default melalui eth0secara default dan melalui wlan0jika eth0turun.

Apakah itu mungkin? Apa yang harus saya lakukan untuk mencapai fungsi seperti itu?

rosix
sumber
Sangat singkat: Beberapa rute default akan memilih satu antarmuka secara acak, yang menyebabkan masalah karena IP yang diberikan berbeda. Apa yang Anda inginkan adalah multihoming atau bundling , yang sulit dilakukan, lihat misalnya di sini
dirkt
1
Anda dapat menggunakan failover dinamis dengan ikatan . Tidak perlu mengutak-atik rute default.
Ingo

Jawaban:

17

Memecahkannya sendiri. Tampaknya ada sedikit informasi tentang hal-hal jaringan yang dapat Anda lakukan dengan Linux, jadi saya telah memutuskan untuk mendokumentasikan dan menjelaskan solusi saya secara rinci. Ini adalah pengaturan terakhir saya:

  • 3 NIC: eth0 (kawat), wlan0 (built-in wifi, lemah), wlan1 (usb wifi adapter, sinyal lebih kuat dari wlan0)
  • Semuanya pada satu subnet, masing-masing dengan alamat IP mereka sendiri.
  • eth0 harus digunakan untuk lalu lintas masuk dan keluar secara default.
  • Jika eth0 gagal maka wlan1 harus digunakan.
  • Jika wlan1 gagal maka wlan0 harus digunakan.

Langkah pertama : Buat tabel rute baru untuk setiap antarmuka di /etc/iproute2/rt_tables. Sebut saja rt1, rt2 dan rt3

#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1  inr.ruhep
1 rt1
2 rt2
3 rt3

Langkah kedua : Konfigurasi jaringan di /etc/network/interfaces. Ini adalah bagian utama dan saya akan mencoba menjelaskan sebanyak yang saya bisa:

auto eth0 wlan0
allow-hotplug wlan1

iface lo inet loopback

iface eth0 inet static
address 192.168.178.99
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.99 table rt1
    post-up ip route add default via 192.168.178.1 dev eth0 table rt1
    post-up ip rule add from 192.168.178.99/32 table rt1
    post-up ip rule add to 192.168.178.99/32 table rt1
    post-up ip route add default via 192.168.178.1 metric 100 dev eth0
    post-down ip rule del from 0/0 to 0/0 table rt1
    post-down ip rule del from 0/0 to 0/0 table rt1

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.97
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.97 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.97/32 table rt2
    post-up ip rule add to 192.168.178.97/32 table rt2
    post-up ip route add default via 192.168.178.1 metric 102 dev wlan0
    post-down ip rule del from 0/0 to 0/0 table rt2
    post-down ip rule del from 0/0 to 0/0 table rt2

iface wlan1 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.98
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan1 src 192.168.178.98 table rt3
    post-up ip route add default via 192.168.178.1 dev wlan1 table rt3
    post-up ip rule add from 192.168.178.98/32 table rt3
    post-up ip rule add to 192.168.178.98/32 table rt3
    post-up ip route add default via 192.168.178.1 metric 101 dev wlan1
    post-down ip rule del from 0/0 to 0/0 table rt3
    post-down ip rule del from 0/0 to 0/0 table rt3

Jika Anda mengetik, ip rule showAnda akan melihat yang berikut ini:

0:  from all lookup local 
32756:  from all to 192.168.178.98 lookup rt3 
32757:  from 192.168.178.98 lookup rt3 
32758:  from all to 192.168.178.99 lookup rt1 
32759:  from 192.168.178.99 lookup rt1 
32762:  from all to 192.168.178.97 lookup rt2 
32763:  from 192.168.178.97 lookup rt2 
32766:  from all lookup main 
32767:  from all lookup default 

Ini memberitahu kita bahwa lalu lintas masuk atau keluar dari alamat IP "192.168.178.99" akan menggunakan tabel rute rt1. Sejauh ini baik. Tetapi lalu lintas yang dihasilkan secara lokal (misalnya Anda ingin melakukan ping atau ssh dari mesin ke tempat lain) perlu perlakuan khusus (lihat kutipan besar dalam pertanyaan).

Empat baris post-up pertama /etc/network/interfacessecara langsung dan penjelasan dapat ditemukan di internet, baris post-up kelima dan terakhir adalah yang membuat keajaiban terjadi:

post-up ip r add default via 192.168.178.1 metric 100 dev eth0

Perhatikan bagaimana kami belum menentukan tabel rute untuk garis post-up ini. Jika Anda tidak menentukan tabel rute, informasi tersebut akan disimpan dalam maintabel rute yang kami lihat ip rule show. Baris post-up ini menempatkan rute default di tabel rute "utama" yang digunakan untuk lalu lintas yang dihasilkan secara lokal yang bukan merupakan respons terhadap lalu lintas yang masuk. (Misalnya MTA di server Anda mencoba mengirim email.)

Ketiga antarmuka semuanya meletakkan rute default di tabel rute utama, meskipun dengan metrik yang berbeda. Mari kita lihat maintabel rute dengan ip route show:

default via 192.168.178.1 dev eth0  metric 100 
default via 192.168.178.1 dev wlan1  metric 101 
default via 192.168.178.1 dev wlan0  metric 102 
192.168.178.0/24 dev wlan0  proto kernel  scope link  src 192.168.178.97 
192.168.178.0/24 dev eth0  proto kernel  scope link  src 192.168.178.99 
192.168.178.0/24 dev wlan1  proto kernel  scope link  src 192.168.178.98

Kita dapat melihat bahwa tabel rute utama memiliki tiga rute default, meskipun dengan metrik yang berbeda. Prioritas tertinggi adalah eth0, lalu wlan1 dan kemudian wlan0 karena angka metrik yang lebih rendah menunjukkan prioritas yang lebih tinggi. Karena eth0memiliki metrik terendah, ini adalah rute default yang akan digunakan selama eth0terserah. Jika eth0turun, lalu lintas keluar akan beralih ke wlan1.

Dengan pengaturan ini kita dapat mengetik ping 8.8.8.8di satu terminal dan ifdown eth0di terminal lainnya. pingharus tetap berfungsi karena karena ifdown eth0akan menghapus rute default yang terkait eth0, lalu lintas keluar akan beralih ke wlan1.

Baris post-down memastikan bahwa tabel rute terkait dihapus dari basis data kebijakan perutean ( ip rule show) ketika antarmuka turun, untuk menjaga semuanya rapi.

Masalah yang tersisa adalah ketika Anda menarik steker dari eth0rute default untuk eth0masih ada dan lalu lintas keluar gagal. Kita perlu sesuatu untuk memantau antarmuka kita dan mengeksekusi ifdown eth0jika ada masalah dengan antarmuka (yaitu kegagalan NIC atau seseorang menarik steker).

Langkah terakhir : masuk ifplugd. Itu adalah daemon yang menonton antarmuka dan mengeksekusi ifup/ifdownjika Anda menarik steker atau jika ada masalah dengan koneksi wifi /etc/default/ifplugd:

INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"

Anda sekarang dapat menarik steker eth0, lalu lintas keluar akan beralih ke wlan1dan jika Anda memasukkan kembali, lalu lintas keluar akan beralih kembali ke eth0. Server Anda akan tetap online selama salah satu dari ketiga antarmuka itu berfungsi. Untuk menghubungkan ke server Anda, Anda dapat menggunakan alamat ip eth0 dan jika itu gagal, alamat ip wlan1 atau wlan0.

rosix
sumber
Coba buat koneksi yang membutuhkan waktu lebih lama (mis. Scp file besar), lihat apa antarmuka jaringan yang digunakannya, nonaktifkan antarmuka itu dan lihat apa yang terjadi.
dirkt
The scpsesi akan patah karena alamat IP berubah. Anda dapat mencoba menggunakan withsctpuntuk menjaga koneksi tetap hidup dalam kasus seperti itu atau menggunakan rsyncalih-alih scpuntuk membatasi transfer dari titik di mana ia berhenti.
rosix
Intinya adalah: Jika rusak, apa keuntungan dari pengaturan rumit Anda hanya dengan memiliki satu rute default, katakanlah pada antarmuka jaringan tercepat saat ini? withsctpjuga akan berfungsi hanya untuk satu rute default.
dirkt
1
"Apa keuntungan dari pengaturan rumit Anda daripada hanya memiliki satu rute default, katakanlah pada antarmuka jaringan tercepat saat ini?" >> Itulah yang sedang dilakukan pengaturan saya. Hanya rute default tercepat (eth0) yang digunakan secara default. Sama-sama.
rosix
10

Linux menyediakan solusi yang lebih baik daripada solusi skrip Anda: ikatan cadangan aktif.

Dengan cara ini mesin Anda hanya akan memilikinya satu alamat ip (dan satu alamat mac) dan secara otomatis dan transparan beralih antarmuka jika satu antarmuka menjadi tidak tersedia. Tidak ada gangguan koneksi TCP (baik ke internal lan Anda maupun ke internet).

Saya menggunakan pengaturan ini sendiri untuk secara otomatis failover dari eth0 ke wlan0 di laptop debian saya ketika saya melepas laptop saya dari stasiun dok.

/ Etc / network / interfaces saya:

# The primary network interface
allow-hotplug eth0
iface eth0 inet manual
        bond-master bond0
        bond-primary eth0

# The secondary network interface
allow-hotplug wlan0
iface wlan0 inet manual
        pre-up sleep 5
        wpa-conf /etc/wpa_supplicant.conf
        bond-master bond0
        bond-primary eth0

# The bonding interface
allow-hotplug bond0
iface bond0 inet dhcp
        bond-slaves eth0 wlan0
        bond-primary eth0
        bond-mode active-backup
        bond-miimon 10
        bond_downdelay 10
        bond_updelay 4000

Anda dapat dengan mudah memperluas pengaturan ini untuk memasukkan beberapa perangkat wlan. Pengaturan primary_reselect opsi untuk better(secara otomatis memilih tautan tercepat) akan membantu di sini.

Untuk informasi lebih lanjut, lihat https://wiki.linuxfoundation.org/networking/bonding dan https://wiki.debian.org/Bonding

Dan (tentu saja) dokumentasi kernel linux di https://www.kernel.org/doc/Documentation/networking/bonding.txt

Thilo
sumber