Anotasi
Dalam artikel sebelumnya, organisasi redundansi untuk gateway LAN dipertimbangkan. Sebagai solusi, sebuah skrip diusulkan agar pada saat itu menyelesaikan masalah, tetapi memiliki sejumlah kelemahan. Setelah beberapa waktu, ternyata menghilangkan kekurangan ini, sebagian menulis ulang kode dan mendapatkan sesuatu yang dapat diterima di output. Sekarang kita dapat mengatakan bahwa skrip sudah cukup diuji untuk disebut stabil. Untuk menyederhanakan pemahaman seluruh sistem, poin utama untuk menyiapkan layanan sekunder (dalam hal topik artikel) akan diduplikasi sebagian di bawah. Alasannya sederhana - selama waktu ini aturan ipfw juga dikerjakan ulang, dns pergi untuk tinggal di AD pada Samba4 dengan bind-frontend dan catatan yang diperbarui dengan aman dari isc-dhcpd menggunakan kerberos, serta server dns sekunder seperti bind di gateway, mengkonfigurasi CARP ... Secara umum, ini menjadi jauh lebih menarik, tetapi lebih banyak tentang apa dan bagaimana kerjanya di bawah. Segala sesuatu yang dapat diberikan dengan referensi ke sumbernya akan dirancang sedemikian rupa agar tidak menghasilkan esensi. Apa yang diambil dari tempat lain, tetapi yang tidak lagi tersedia, akan diberikan di sini dengan komentar yang relevan.
Pendahuluan
Jadi, ada dua cara untuk meningkatkan kekebalan kebisingan dari saluran komunikasi dengan dunia luar di pihak konsumen: cadangan gateway dan reservasi titik koneksi. Dengan kata lain, dalam kasus pertama, gateway kedua diatur, yang akan diaktifkan jika yang pertama gagal, dalam kasus kedua, saluran Internet cadangan akan diatur jika ada masalah dengan yang utama, dan semakin jauh mereka menyeberang, semakin baik, jelas. Jika
CARP menyelesaikan tugas pertama untuk FreeBSD, maka yang kedua, setelah mengatur saluran eksternal kedua, dapat, sekali lagi, diselesaikan dengan beberapa cara. Minimal, Anda dapat mengatur penyeimbangan lalu lintas atau beralih antar saluran. Karena perbedaan besar dalam bandwidth saluran eksternal, opsi pertama tidak
cocok untuk saya, jadi penyebab utama publikasi ini ditulis:
ToFoIn - satu set skrip bash yang ditujukan untuk menyelesaikan masalah diagnostik dan beralih ke saluran eksternal yang berfungsi. Setelah penyempurnaan, ini dapat diterapkan ke gateway dan m saluran. Situasinya lemah, di mana n dan m lebih dari 2, tetapi skrip di bawah ini harus bekerja hingga nilai n dan m yang besar, karena Logikanya, batasnya tidak ditentukan. Secara umum, saya menduga bahwa menggunakan skrip ini dimungkinkan untuk menyelesaikan berbagai tugas yang cukup luas, tergantung pada status koneksi, terbatas, mungkin, hanya dengan imajinasi.

Kira-kira topologi jaringan seperti itu mengasumsikan dalam bentuk paling sederhana penggunaan seperangkat skrip ToFoIn. Tentu saja, skrip harus bekerja dalam kasus router tunggal, tetapi dalam kasus ini, Anda harus mengubah modul Daemon untuk menghapus ketergantungan dari urutan tindakan pada kondisi CARP, yang hanya akan absen dalam sistem. Pemesanan lebih lanjut dari ini dan node lain hanya tergantung pada tingkat pentingnya layanan yang sesuai.
Tujuan dan sasaran
Tujuan proyek, seperti sebelumnya, adalah untuk membuat paket perangkat lunak universal dan mudah diskalakan yang berfokus pada pengidentifikasian masalah dalam koneksi eksternal dan internal dan secara otomatis beralih ke koneksi yang bisa diterapkan. Secara umum, logikanya adalah sebagai berikut:
- Ada "router" dengan masing-masing saluran eksternal. Selain itu, semua n "router" berada dalam hirarki yang ketat dan terhubung satu sama lain menggunakan CARP pada semua antarmuka yang diperlukan.
- Agen bekerja secara independen pada setiap mesin, yang tugasnya didasarkan pada status CARP saat ini dari mesinnya:
- Jika cadangan - mendeteksi dan mengkonfigurasi mesin pada router yang saat ini adalah master;
- Jika master - periksa status koneksi pada saat ini dan, jika perlu, beralih di antara saluran eksternal.
Solusi
Jaringan internal memiliki CARP, yang menyediakan gateway cadangan dan memungkinkan Anda untuk tidak mengubah pengaturan perangkat jaringan lain di jaringan internal saat berpindah saluran.
Dhcpd beroperasi dalam mode primer - sekunder dan, secara umum, tidak masalah apa peran lain yang dimainkan mesin - koneksi antara dhcpd terjadi pada jaringan internal, yang selalu dilihat oleh router.
Bind master dihapus dalam AD, yang disembunyikan di jaringan lokal, sementara server bind sekunder bekerja pada router gateway dengan pijakan yang sama.
Aturan ipfw berbeda tergantung pada saluran mana yang dianggap sebagai saluran utama pada saat tertentu dan di-restart oleh modul Daemon ketika mengubah peran.
Akhirnya tentang skrip itu sendiri. Sekarang file-file tersebut berada di direktori yang sesuai, berfungsi dari penggunanya dan memiliki skrip awal di rc.d. Tugas yang membutuhkan akses root diselesaikan oleh sudo. Ada skrip instalasi yang memperhitungkan kemungkinan kehadiran versi yang diinstal, serta file pengaturan yang cukup rinci. Modul-modulnya sama dengan perubahan kecil, beberapa hampir tidak berubah dalam fungsionalitas:
Daemon - seperti namanya - adalah proses utama yang menjalankan tes dan beralih modul pada timer, dan juga memonitor CARP.
Penguji - masih menguji komunikasi eksternal menggunakan perintah ping. (jika sedang berjalan, mesin akan menganggap CARP dalam status Master)
Hakim - berdasarkan pada hasil pengujian, menentukan saluran eksternal mana yang berfungsi dan apakah switching diperlukan, melakukan switching (jika sedang berjalan, mesin akan mempertimbangkan CARP dalam status Master).
Scout adalah modul baru. Itu dimulai ketika CARP dalam kondisi Backup. Hal ini diperlukan untuk menentukan router yang tersisa saat ini yang utama.
Logger - bertanggung jawab atas pencatatan peristiwa. Hal ini diperlukan agar informasi tentang acara tidak digandakan dan majalah lebih mudah dibaca.
Watchdog - berjalan sesuai jadwal dari crontab. Ini menentukan "membeku" semua modul dan (bila memungkinkan) mencoba untuk memecahkan masalah yang muncul. Yaitu kuku semua orang, cukup cantumkan.
Selain skrip itu sendiri, ada baiknya mempertimbangkan beberapa file yang lebih penting:
Tofoin.conf - file pengaturan tunggal.
Tofoin.log - file log peristiwa tunggal.
Result_ <nomor saluran internal> adalah file yang berfungsi, hasil pengujian ditambahkan di sini, dibuat di / tmp di sebelah .pid dan file yang berfungsi lainnya.
Saya dengan senang hati dapat menjawab pertanyaan tentang pengoperasian modul, menjelaskan solusi dalam komentar.
Bagian teknis
Peralatan
Dibandingkan dengan waktu sebelumnya, gateway pindah ke P4, menerima RAM 1536 Mb dan tiga HDD 40 Gb (mirror + spare). Kartu jaringan masih PCI, PSU normal, secara alami di hadapan UPS.
Peningkatan kapasitas dikaitkan dengan besi yang dikeluarkan dan pembaruan yang terlalu membosankan dari sumbernya, tetapi sebagian besar yang pertama. OS FreeBSD 11.1, FS zfs.
Pengaturan Komponen Sistem
Lebih detailKernel dikompilasi dengan parameter tambahan seperti itu (sesuatu juga dapat diatur dalam loader, tetapi lebih baik seperti ini):
options IPFIREWALL
Pengaturan / boot / load.conf:
geom_mirror_load="YES" zfs_load="YES" kern.geom.label.gptid.enable="0" vm.kmem_size="1024M" vm.kmem_size_max="1024M" vfs.zfs.arc_max="512M" vfs.zfs.vdev.cache.size="30M" vfs.zfs.prefetch_disable=1 kern.vty=vt
Pengaturan /etc/rc.conf pada mesin pertama (konfigurasi CARP menjadi perhatian utama):
ifconfig_eth0="up" vlans_eth0="vlan111 vlan222" create_args_vlan111="vlan 111" create_args_vlan222="vlan 222" ifconfig_eth1="up" vlans_eth1="vlan333 vlan444 vlan555" create_args_vlan333="vlan 333" create_args_vlan444="vlan 444" create_args_vlan555="vlan 555" ifconfig_eth2="up" vlans_eth2="vlan666 vlan777 vlan888" create_args_vlan666="vlan 666" create_args_vlan777="vlan 777" create_args_vlan888="vlan 888" ifconfig_vlan666="inet 192.168.0.1/24" ifconfig_vlan666_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.0.5/32" ifconfig_vlan777="inet 192.168.1.1/24" ifconfig_vlan777_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.1.5/32" ifconfig_vlan888="inet 192.168.2.1/24" ifconfig_vlan888_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.2.5/32" ifconfig_vlan111="inet 192.168.3.1/30" ifconfig_vlan111_alias0="vhid 1 advskew 100 pass MyPassword alias 1.1.1.2/24" ifconfig_vlan222="inet 192.168.4.1/30" ifconfig_vlan333="inet 192.168.5.1/30" ifconfig_vlan333_alias0="vhid 1 advskew 100 pass MyPassword alias 2.2.2.2/30" ifconfig_vlan444="inet 192.168.6.1/30" ifconfig_vlan444_alias0="vhid 1 advskew 100 pass MyPassword alias 3.3.3.2/30" ifconfig_vlan555="inet 192.168.7.1/30" defaultrouter="1.1.1.1" setfib1_enable="YES" setfib1_defaultrouter="3.3.3.1" setfib2_enable="YES" setfib2_defaultrouter="2.2.2.1" zfs_enable="YES" named_enable="YES" dhcpd_enable="YES" firewall_enable="YES" firewall_logging="YES" firewall_script="/etc/firewall.sh" gateway_enable="YES" tofoin_enable="YES"
Legenda:
eth0, eth1, eth2 - adapter fisik
vlan666, vlan777, vlan888 - adapter LAN virtual,
vlan222 dan vlan555 - adapter untuk komunikasi yang berlebihan antara kartu jaringan eksternal (mereka mungkin tidak lagi diperlukan, mereka secara aktif digunakan sebelumnya)
vlan111 - saluran eksternal utama
vlan444 - cadangan saluran eksternal
vlan333 - teleponiPengaturan /etc/rc.conf pada mesin kedua (konfigurasi CARP menjadi perhatian utama, beberapa baris duplikat dihapus):
ifconfig_vlan666="inet 192.168.0.2/24" ifconfig_vlan666_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.0.5/32" ifconfig_vlan777="inet 192.168.1.2/24" ifconfig_vlan777_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.1.5/32" ifconfig_vlan888="inet 192.168.2.2/24" ifconfig_vlan888_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.2.5/32" ifconfig_vlan111="inet 192.168.3.2/30" ifconfig_vlan111_alias0="vhid 1 advskew 0 pass MyPassword alias 1.1.1.2/24" ifconfig_vlan222="inet 192.168.4.2/30" ifconfig_vlan333="inet 192.168.5.2/30" ifconfig_vlan333_alias0="vhid 1 advskew 0 pass MyPassword alias 2.2.2.2/30" ifconfig_vlan444="inet 192.168.6.2/30" ifconfig_vlan444_alias0="vhid 1 advskew 0 pass MyPassword alias 3.3.3.2/30" ifconfig_vlan555="inet 192.168.7.2/30" defaultrouter="1.1.1.1" setfib1_enable="YES" setfib1_defaultrouter="3.3.3.1" setfib2_enable="YES" setfib2_defaultrouter="2.2.2.1"
Beberapa aturan yang berguna saat mengkonfigurasi ipfw (nat) adalah:
Untuk mengizinkan lalu lintas CARP:
/sbin/ipfw -q add allow carp from any to any
"Nuklir" nat:
/sbin/ipfw -q nat 1 config log ip vlan111 reset same_ports deny_in unreg_only /sbin/ipfw -q add nat 1 ip from any to any in
Menggunakan tabel perutean spesifik dengan adaptor spesifik:
/sbin/ipfw -q add setfib 0 all from any to any via vlan666
Secara umum, saya bisa menulis artikel terpisah tentang pengaturan ipfw yang saya gunakan, tapi ini lain kali.
Perangkat lunak pihak ke-3
Lebih detailKarena ada kebutuhan untuk bekerja secara bersamaan dengan dua atau lebih saluran eksternal, untuk ini lebih mudah untuk memiliki beberapa tabel routing, satu untuk setiap saluran. Dan alangkah baiknya jika tabel ini dibuat saat startup sendiri. Script setfib rc.d akan membantu. Logika yang digunakan dalam ToFoIn mengasumsikan bahwa nama file (setfib1, setfib2, dll.) Cocok dengan jumlah tabel di mana skrip tunggal menambahkan rute default. Tabel secara default memiliki nomor "0".
Server DNS dengan Bind dalam peran utama berfungsi dalam mode sekunder, yang utama adalah samba4 + bind, tersembunyi di jaringan lokal. Menyiapkan ikatan sekunder diungkapkan dengan indah dalam buku "DNS and BIND" Cricket Lee dan Paul Albitz. Saya tidak ingat persyaratan khusus apa pun yang memperhitungkan penggunaan samba4 untuk server sekunder, dan saya tidak menyebutkannya dalam file pengaturan. Kecuali, untuk saluran Internet yang berbeda, Anda mungkin perlu membuat 2 file berbeda, yang kemudian akan disalin oleh skrip ToFoIn ke tempat dari mana bind itu sendiri akan membacanya. Hal ini disebabkan oleh fakta bahwa ketika menentukan alamat server DNS dari kedua penyedia dalam file yang sama, dengan mempertimbangkan bahwa mengikat bekerja dengan hanya satu tabel perutean, masalah muncul tentang resolusi alamat dari server tingkat tinggi yang tidak dapat diakses pada saat tertentu.
Gagal isc-dhcpd. Dhcpd tidak penting untuk ToFoIn, apalagi, ketidakhadirannya tidak akan mempengaruhi skrip sama sekali, namun, menurut saya, cukup logis untuk menempatkan server dhcp di gateway dan kemudian pertanyaan tentang failover masih muncul. Dan di sini, dibandingkan dengan terakhir kali, itu menjadi lebih menarik ... Selain pengaturan yang diperlukan untuk failover, yang saya jelaskan
terakhir kali (awal bagian "preset" di dalam menu drop-down).
Anda juga akan memerlukan skrip untuk memperbarui catatan dns dalam AD dengan menggunakan samba4 secara aman. Server samba4 sendiri harus diinstal. Pengaturan dan peluncuran tidak diperlukan, kami hanya tertarik pada alat manajemen yang disertakan dengan kit. Mereka yang ingin dapat menemukan informasi lain di bagian "DHCP dengan pembaruan DNS dinamis"
di .
Ini terlihat menakutkan, tetapi berhasil.
Tentang hal ini dengan konfigurasi perangkat lunak pihak ketiga selesai.
Sedikit tentang ToFoIn
Semua teks proyek bersama dengan skrip instalasi tersedia di
gitlab .
Sebagai kesimpulan, contoh parameter file pengaturan ToFoIn dipertimbangkan:Jumlah router yang digunakan dalam sistem:
RNUMBER=2
Saat menggunakan subnet tambahan, Anda harus menetapkan rute default saat router menjadi yang utama. Di sini Anda dapat menentukan jumlah file setfib yang sesuai yang akan dimulai kembali. Dalam contoh ini, setfib2:
ADDITLAN=2
Nama adaptor internal:
INT_IF=vlan666
Semua antarmuka lain di mana router terhubung melalui CARP. Diperlukan untuk mengontrol dan mempertahankan keadaan yang sama dari semua antarmuka:
ALL_IF="vlan111 vlan333 vlan444 vlan666 vlan777 vlan888"
vhid yang digunakan ketika mengkonfigurasi CARP:
CARP_VHID=1
Alamat IP di jaringan internal router lain dalam urutan kepentingan, jika perlu, maka ASERV_IP_2, ASERV_IP_3, dll. Hanya digunakan.
ASERV_IP_1=192.168.0.2
Jumlah saluran koneksi eksternal:
CNUMBER=2
Pengaturan untuk saluran koneksi eksternal utama:
Nama Adaptor:
EXT_0_IF=vlan111
Nomor Tabel Perutean:
RTABLE_0=0
Gateway Default:
DEFAULT_GATEWAY=2.2.2.1
Pengaturan untuk saluran koneksi eksternal cadangan:
Nama Adaptor:
EXT_1_IF=vlan444
Nomor Tabel Perutean:
RTABLE_1=1
Gateway default tidak diperlukan, karena untuk semua tabel routing, kecuali yang utama, skrip rc.d setfib <table number> digunakan, yang, seperti yang diasumsikan oleh logika, harus cocok dengan nomor tabel.
Parameter modul tester:
Jumlah alamat yang akan diperiksa:
TNUMBER=2
Alamat mesin yang digunakan untuk mengirim permintaan ping. Yang terbaik adalah menggunakan nama domain dalam kasus pertama, dan hanya setelah itu alamat ip:
PTARGET_0=ya.ru PTARGET_1=8.8.8.8
Jumlah paket ping yang dikirim per target:
PNUMBER=2
Pengaturan Modul Hakim
Jumlah tes yang berhasil dari saluran utama sebelum kembali ke sana. Waktu pengembalian ke saluran utama setelah dimulainya kembali operasinya kira-kira dihitung dengan rumus: (WNUMBER + 1) * JUDGEPERIOD detik.
WNUMBER=3
Pengaturan Modul Logger
2 parameter ini menunjukkan seberapa sering Logger akan merekam acara yang berulang. Setelah merekam acara tersebut, waktu berikutnya LOGFREQ1 akan mencoba ulang jumlah yang dilaporkan, maka LOGFREQ2 adalah jumlah yang coba lagi. Hanya peristiwa dalam satu baris yang diperhitungkan.
LOGFREQ1=5 LOGFREQ2=20
Modul memulai penghitung waktu dalam hitungan detik
Periode peluncuran modul Tester. Masuk akal untuk mengandalkan waktu upaya gagal untuk menguji semua target.
TESTERPERIOD=240
Periode peluncuran modul Hakim. Jangan memasang kurang dari TESTERPERIOD.
JUDGEPERIOD=300
Periode peluncuran modul Scout.
SCOUTPERIOD=360
Masa tunggu sebelum memeriksa timer mulai dari modul Penguji dan Hakim. Adalah logis untuk menetapkan kurang dari atau sama dengan nilai TESTERPERIOD.
SENSITIVITY=60
Waktu setelah mana modul kerja dianggap digantung. Digunakan oleh modul Watchdog.
TESTERLIMIT=40 JUDGELIMIT=30 LOGGERLIMIT=20 SCOUTLIMIT=120 WATCHDOGLIMIT=150
Jalur ke file dan direktori
Path ke skrip ipfw.
FIRESCRIPT=/etc/firewall.sh
Pengaturan Ipfw. Jika pengaturan ipfw tidak dipindahkan ke file terpisah, maka FIRESCRIPT = FIRESETDEF.
FIRESETDEF=/etc/firewall/config
Path ke pengaturan ipfw untuk saluran eksternal utama:
FIRESET_0=/etc/firewall/config_0
Jalur ke pengaturan ipfw untuk saluran eksternal cadangan, jika perlu, Anda dapat melanjutkan FIRESET_2 lebih lanjut, dll .:
FIRESET_1=/etc/firewall/config_1
Jalur untuk mengikat pengaturan
BINDSETDEF=/usr/local/etc/namedb/named.conf
Bind pengaturan untuk saluran eksternal utama:
BINDSET_0=/usr/local/etc/namedb/named.conf.0
Bind pengaturan untuk saluran eksternal cadangan, jika perlu, Anda dapat melanjutkan BINDSET_2 lebih lanjut, dll.:
BINDSET_1=/usr/local/etc/namedb/named.conf.1
Paths ke semua executables ToFoIn:
DAEMON=/local/sbin/tofoin/daemon.sh TESTER=/usr/local/sbin/tofoin/tester.sh JUDGE=/usr/local/sbin/tofoin/judge.sh LOGGER=/usr/local/sbin/tofoin/logger.sh SCOUT=/usr/local/sbin/tofoin/scout.sh WATCHDOG=/usr/local/sbin/tofoin/watchdog.sh
Log acara. File ini TIDAK dibuat saat instalasi sekarang:
LOGFILE=/var/log/tofoin.log
File dan direktori sementara dibuat ketika modul yang sesuai dimulai, beberapa dihapus ketika dihentikan:
DIR_TMP=/tmp/tofoin DIR_PID=/var/run/tofoin JUDGEMETER=/tmp/tofoin/judgemeter PREVSTATE=/tmp/tofoin/prevstate SCOUTGATE=/tmp/tofoin/scoutgate LOGTMP=/tmp/tofoin/logger.tmp LOGMETER=/tmp/tofoin/logmeter DAEMON_PID=/var/run/tofoin/daemon.pid TESTER_PID=/var/run/tofoin SCOUT_PID=/var/run/tofoin/scout.pid JUDGE_PID=/var/run/tofoin/judge.pid LOGGER_PID=/var/run/tofoin/logger.pid WATCHDOG_PID=/var/run/tofoin_watchdog.pid
Ringkasan
Ternyata menjadi satu set script yang berfungsi penuh dan dapat diandalkan yang cocok dengan tugas beralih ke saluran kerja dalam kasus 2 router dengan 2 saluran komunikasi eksternal.
Paket
Rencana saya untuk proyek ini berhubungan, mungkin, dengan menulis ulang dari bash ke sh murni untuk menyingkirkan perangkat lunak yang tidak perlu di server. Di sisi lain, sekarang semuanya bekerja dengan luar biasa dan saya benar-benar tidak ingin ikut campur dalam proses ini, selain itu, beralih ke sh dipenuhi dengan konstruksi bahasa yang lebih buruk yang diperlukan untuk mencapai hasil yang sama.
Untuk selebihnya, mungkin, akan lebih baik mempertimbangkan penerapan modul uji terbaik.
Referensi:
โ
Artikel sebelumnyaโ
Halaman proyek ToFoIn di gitlab