SMTP záloha
jak na to
Je potřeba mít dva SMTP servery. Na master musí být přenositelná IP adresa přivedena routou, která zabírá alespoň 2 IP adresy. Slave v případě výpadku tuto IP převezme tak, že do OSPF vloží routu /32.
Skript se pokouší zabránit konfliktu dvou IP adres ještě tím, že se pokusí master kontaktovat přes SSH a IP adresu v něm zrušit. Pokud ale master není router, kterým protíká tranzitní traffic, ale sedí někde na okraji sítě, pak by to neměl být velký problém.
Pro fungující řízení pomocí SSH je třeba zajistit ověření pomocí klíčů tak, aby se slave mohl na master připojit a udělat potřebná nastavení (buč jako root, nebo přes sudo).
Skript je zamýšlen jako důkaz, že to takto skutečně jde udělat a že by to i mohlo fungovat.
Nejspíš bude třeba vychytat různé stavy, když servery padnou všelijak "napůl". Zároveň je takto možné spojit pouze 2 SMTP servery, kdy jeden je master a druhý (který vše hlídá cronem) je slave.
skript
<bash>#!/bin/bash
- IP, kterou nas server natahne na sebe
ROUTE_IP="10.107.3.4"
- IP, ktera bude testovana zda-li na ni bezi smtp
WATCH_IP="10.107.35.1" # yzop.hkfree.org WATCH_PORT="25"
- heslo do zebry
ENAPASS="$(cat /root/smtp-redir-pokus/zebrapass)"
[ "$ENAPASS" == "" ] && { neni definovane zebra heslo! ; exit 1; }
ip_on(){
- nahodime na slave mobilni IP
ifconfig dummy0:40 $ROUTE_IP netmask 255.255.255.255 broadcast $ROUTE_IP up
- nastavime ji do lokalni zebry
cat << EoF | nc localhost zebra > /dev/null free enable $ENAPASS configure terminal ip route $ROUTE_IP/32 127.0.0.1 quit quit
EoF
- pokud zije ssh na master serveru, shodit u nej mobilni IP
nc -w 3 -z $WATCH_IP 22 && ssh lada@yzop.hkfree.org sudo ifdown dummy0:30
}
ip_off(){
- zrusime na slave mobilni IP
ifconfig dummy0:40 down
- smazeme ji z lokalni zebry
cat << EoF | nc localhost zebra > /dev/null free enable $ENAPASS configure terminal no ip route $ROUTE_IP/32 127.0.0.1 quit quit
EoF
- pokud zije ssh na master serveru, nahodit mobilni IP
nc -w 3 -z $WATCH_IP 22 && ssh lada@yzop.hkfree.org sudo ifup dummy0:30 }
- zkusime 2x, jestli port odpovida
master_online(){ nc -w 3 -z $WATCH_IP $WATCH_PORT || nc -w 3 -z $WATCH_IP $WATCH_PORT }
- je mobilni IP na slave stroji?
slave_active(){ cat << EoF | nc localhost zebra | grep -q "$ROUTE_IP" free show ip route static exit
EoF }
- pravidelna kontrola
do_cronjob(){ MASTERUP=0 master_online && MASTERUP=1
SLAVEACT=0 slave_active && SLAVEACT=1
if [ "$MASTERUP" == "0" ]; then if [ "$SLAVEACT" == "0" ]; then echo "Zapinam zalozni IP" ip_on fi fi
if [ "$MASTERUP" == "1" ]; then if [ "$SLAVEACT" == "1" ]; then echo "Vypinam zalozni IP" ip_off fi fi }
case "$1" in cronjob) do_cronjob; exit 0 ;; on) echo Slave prebira veleni; ip_on ; exit 0;; off) echo Slave vraci veleni masterovi; ip_off; exit 0;; test) echo testuju; master_online && echo Master bezi; master_online || echo Master nebezi; exit 0;; active) slave_active || echo Slave neni aktivni; slave_active && echo Slave je aktivni; exit 0;;
- ) echo "usage: $0 cronjob|on|off|test|active";exit 0;;
esac
exit 0 </bash>