создание_отказоустойчивых_unix_решений_2016

Table of Contents

Создание отказоустойчивых UNIX решений

Программа курса

Часть 1. Повышение отказоустойчивости сетей

Модуль 1. Начальная настройка стенда

Теория

Настройка систем

  • Адаптер 1 - Внутренняя сеть (LAN)
  • Адаптер 2 - Сетевой мост (ISP1)
  • Адаптер 3 - Сетевой мост (класс)
  • Адаптер 4 - Сетевой мост (ISP2)
  • Добавить жесткий диск 2Gb

FreeBSD/Ubuntu

[nodeN:~] # cat /etc/resolv.conf
domain corpX.un
nameserver 10.Z.M.125
[nodeN:~] # cat /etc/hosts
127.0.0.1               localhost localhost.corpX.un

192.168.X.1             node1.corpX.un node1
192.168.X.2             node2.corpX.un node2

10.5.1.254              proxy

Ubuntu

root@nodeN:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.X.N
        netmask 255.255.255.0

auto eth1
iface eth1 inet manual
        up ip link set eth1 up

auto eth2
iface eth2 inet static
        address 10.5.1.N*100+X
        netmask 255.255.255.0

auto eth3
iface eth3 inet manual
        up ip link set eth3 up
root@nodeN:~# cat /etc/hostname
nodeN.corpX.un
[nodeN:~] # cat /etc/sysctl.conf
...
net.ipv4.ip_forward=1
...
[nodeN:~] # cat .bashrc
...
export http_proxy=http://proxy:3128/
...
root@nodeN:~# init 6

...

root@nodeN:~# apt update

FreeBSD

[nodeN:~] # cat /etc/rc.conf.local
hostname="nodeN.corpX.un"
ifconfig_em0="inet 192.168.X.N/24"
ifconfig_em1="up"
ifconfig_em2="inet 10.5.1.N*100+X/24"
ifconfig_em3="up"
[nodeN:~] # cat /etc/rc.conf
gateway_enable="YES"
sshd_enable="YES"
[nodeN:~] # cat .cshrc
...
setenv  HTTP_PROXY http://proxy:3128
...
[nodeN:~] # init 6

...

[nodeN:~] # pkg update -f

[nodeN:~] # pkg install pkg

Проверки

nodeN# ping node1

nodeN# ping node2

nodeN# ping proxy

Модуль 2. Синхронизация файлов конфигураций узлов

С использованием сервиса SSH

node1# ssh-keygen
...
Enter passphrase (empty for no passphrase): Пароль на ключ пустой!!!
...

node1# ssh-copy-id -i .ssh/id_rsa.pub node2

Проверка:

node1# scp /etc/hosts node2:/etc/

С использованием пакета CSYNC2

Тестирование

  • Добавить запись в DNS на сервер node1 (www A 192.168.X.10) и, не перезапуская, bind
node1# csync2 -xvv

Модуль 3. Отказоустойчивый сервис DHCP

Примечания:

  • В качестве шлюза указан не существующий ip адрес 192.168.X.254, он будет назначаться в следующей лабораторной работе.
  • В первый момент необходимо запустить оба сервера чтобы они синхронизировались.

Проверка:

  • Перезагружаем Windows client1 по очереди останавливая и запуская серверы. Должен выдаваться один и тот же адрес (можно отключать интерфейс Windows, ipconfig /renew не использовать)

Вывод сообщений об ошибках:

freebsd# tail -f /var/log/messages

linux# tail -f /var/log/syslog

Модуль 4. Отказоустойчивый шлюз

Отказоустойчивый gate

Отказоустойчивый nat

Сценарий:

  • Настроить NAT трансляцию для сети 192.168.X/24 в реальный адрес ISP (Сервис NAT)
  • Модифицировать скрипты up и down с целью назначения/удаления реального адреса ISP на внешнем интерфейсе и указания маршрута по умолчанию через провайдера для мастер узла и через мастер узел для резервного.

Ubuntu

root@nodeN:~# apt install fake

root@nodeN:~# cat /usr/share/ucarp/vip-up
#!/bin/sh

/sbin/ifup $1:ucarp

ip addr add 172.16.1.X/24 dev eth1
send_arp 172.16.1.X `cat /sys/class/net/eth1/address` 172.16.1.254 ff:ff:ff:ff:ff:ff eth1
route delete default
route add default gw 172.16.1.254
root@nodeN:~# cat /usr/share/ucarp/vip-down
#!/bin/sh

/sbin/ifdown $1:ucarp

ip addr del 172.16.1.X/24 dev eth1
route delete default
route add default gw 192.168.X.254

FreeBSD

[nodeN:~] # cat /usr/local/sbin/ucarp-up
#!/bin/sh

/sbin/ifconfig "$1" alias "$2" netmask 255.255.255.255
/sbin/ifconfig em1 inet 172.16.1.X/24 alias
/sbin/route delete default
/sbin/route add default 172.16.1.254
[nodeN:~] # cat /usr/local/sbin/ucarp-down
#!/bin/sh

/sbin/ifconfig "$1" -alias "$2"
/sbin/ifconfig em1 inet 172.16.1.X/24 -alias
/sbin/route delete default
/sbin/route add default 192.168.X.254

Модуль 5. Балансировка нагрузки и отказоустойчивость при использовании 2-x ISP

Добавление сетевых карт для подключения к ISP2

  • eth3 isp2 bridge to nic 172.16.2/24

FreeBSD

[nodeN:~] # cat /etc/rc.conf
...
ifconfig_em3="up"
...

Linux

root@nodeN:~# cat /etc/network/interfaces
...
auto eth3
iface eth3 inet manual
        up ip link set eth3 up

Модификация настроек dns сервера

# cat named.conf
...
        forwarders {
                172.16.1.254;
                172.16.2.254;
        };
...

Использование маршрута по умолчанию для выбора ISP

Ubuntu

nodeN# cat /usr/share/ucarp/vip-up
#!/bin/sh
...
ip addr add 172.16.2.X/24 dev eth3
send_arp 172.16.2.X `cat /sys/class/net/eth3/address` 172.16.2.254 ff:ff:ff:ff:ff:ff eth3
...
#route add default gw 172.16.1.254
nodeN# cat /usr/share/ucarp/vip-down
...
ip addr del 172.16.2.X/24 dev eth3
...

FreeBSD

nodeN# cat /usr/local/sbin/ucarp-up
...
/sbin/ifconfig em3 inet 172.16.2.X/24 alias
...
#/sbin/route add default 172.16.1.254
nodeN# cat /usr/local/sbin/ucarp-down
...
/sbin/ifconfig em3 inet 172.16.2.X/24 -alias
...

Использование PBR для балансировки нагрузки

Автоматизация балансировки/отказоустойчивости выбора ISP

Lunix/Ubuntu

nodeN# cat /usr/share/ucarp/vip-up
...
ip route add default via 172.16.1.254 table 101
ip route add default via 172.16.2.254 table 102

echo > /tmp/conf_name
nodeN# cat isp1_isp2.sh
#!/bin/sh

ip rule del from 192.168.X/24 to 192.168.X/24 table main
while ip rule del from any table 101;do true;done
while ip rule del from any table 102;do true;done

ip rule add from 192.168.X.0/25 table 101
ip rule add from 192.168.X.128/25 table 102
ip rule add from 192.168.X/24 to 192.168.X/24 table main

/sbin/ip route flush cache
/usr/sbin/conntrack -F
nodeN# cat isp1.sh
#!/bin/sh
ip rule del from 192.168.X/24 to 192.168.X/24 table main
while ip rule del from any table 101;do true;done
while ip rule del from any table 102;do true;done

ip rule add from 192.168.X.0/24 table 101
ip rule add from 192.168.X/24 to 192.168.X/24 table main

/sbin/ip route flush cache
/usr/sbin/conntrack -F
nodeN# cat isp2.sh
#!/bin/sh
ip rule del from 192.168.X/24 to 192.168.X/24 table main
while ip rule del from any table 101;do true;done
while ip rule del from any table 102;do true;done

ip rule add from 192.168.X.0/24 table 102
ip rule add from 192.168.X/24 to 192.168.X/24 table main

/sbin/ip route flush cache
/usr/sbin/conntrack -F

FreeBSD

nodeN# cat /etc/pf.conf
table <ISP1> persist
table <ISP2> persist

nat on em1 from 192.168.X/24 to any -> 172.16.1.X
nat on em3 from 192.168.X/24 to any -> 172.16.2.X

pass in quick on em0 from 192.168.X.0/24 to 192.168.X.0/24
pass in on em0 route-to (em1 172.16.1.254) from <ISP1> to any
pass in on em0 route-to (em3 172.16.2.254) from <ISP2> to any
nodeN# cat isp1_isp2.sh
#!/bin/sh

/sbin/pfctl -t ISP1 -T flush
/sbin/pfctl -t ISP2 -T flush

/sbin/pfctl -t ISP1 -T add 192.168.X.0/25
/sbin/pfctl -t ISP2 -T add 192.168.X.128/25

/sbin/pfctl -F state
nodeN# cat isp1.sh
#!/bin/sh

/sbin/pfctl -t ISP1 -T flush
/sbin/pfctl -t ISP2 -T flush

/sbin/pfctl -t ISP1 -T add 192.168.X.0/24

/sbin/pfctl -F state
nodeN# cat isp2.sh
#!/bin/sh

/sbin/pfctl -t ISP1 -T flush
/sbin/pfctl -t ISP2 -T flush

/sbin/pfctl -t ISP2 -T add 192.168.X.0/24

/sbin/pfctl -F state

Ubuntu/FreeBSD

nodeN# cat select_isp.sh
#!/bin/sh

export PATH=/bin:/sbin:/usr/bin:/usr/sbin:$PATH

ifconfig | grep -q 192.168.X.254 || exit 0

route delete default

# route add default gw 172.16.1.254 2>/dev/null || exit 0
# route add default 172.16.1.254 2>/dev/null || exit 0

ping -c3 ya.ru >/dev/null 2>&1
ALIVE1=$?

route delete default

# route add default gw 172.16.2.254
# route add default 172.16.2.254

ping -c3 ya.ru >/dev/null 2>&1
ALIVE2=$?

test $ALIVE1 -eq 0 && conf_name="isp1.sh"
test $ALIVE2 -eq 0 && conf_name="isp2.sh"
test $ALIVE1 -eq 0 && test $ALIVE2 -eq 0 && conf_name="isp1_isp2.sh"

# echo /root/$conf_name
# exit 0

touch /tmp/conf_name
test $conf_name = "`cat /tmp/conf_name`" && exit 0

echo $conf_name > /tmp/conf_name

eval /root/$conf_name
nodeN# crontab -l
* * * * * /root/select_isp.sh >/dev/null 2>&1
nodeN# pfctl -t ISP1 -T show
nodeN# pfctl -t ISP1 -T show

Часть 2. Повышение отказоустойчивости информационных систем

Модуль 6. Отказоустойчивый www хостинг

Сценарий

  • Содержимое домашних каталогов мастер сервера периодически копируется на резервный.
  • В случае временной остановки или выхода из строя главного сервера автоматически становится доступным резервный.
  • Не преднамеренный запуск мастер сервера не должен менять ролей серверов.

Реализация без автоматического переключения с основного узла на резервный

Подготовка стенда

  • В зону corpX.un добавляем запись www A 192.168.X.10
node1# cat corpX.un
...
www     A       192.168.X.10
node1# csync2 -xvv

Синхронизация пользовательских данных

Автоматизация смены ролей узлов НА кластера

Подготовка стенда

nodeN# service proftpd stop

nodeN# update-rc.d -f proftpd remove
или
nodeN# systemctl disable proftpd
  • Представим, что узлы соединены кросс кабелем через eth2 интерфейсы

Настройка кластера

Дополнительные задания:

  • Настроить автоматическую синхронизацию домашних каталогов с мастер узла на резервный с использованием сети кросс кабеля.
  • Запустить rsync на node1

Указываем в файле /etc/hosts имя slave указывающее на соседний сервер

node1# cat /etc/hosts
...
10.M.Z.200+X slave
...
node2# cat /etc/hosts
...
10.M.Z.100+X slave
...

Устанавливаем на node1 Пакет RSYNC

nodeN# cat /CHANGE/DIR/rsyncd.conf
...
        hosts allow = slave

nodeN# rsync slave::home

nodeN# crontab -l

FreeBSD

* * * * * ps ax | grep -v grep | grep -q 'ftpd -D' && /usr/local/bin/rsync -a /home/ slave::home

Ubuntu

* * * * * ps ax | grep -v grep | grep -q 'proftpd: (accepting connections)' && /usr/bin/rsync -a /home/ slave::home

Модуль 7. Отказоустойчивый файловый сервер SAN iSCSI, NAS SMB/CIFS

!!! Проверять на отказоустойчивость по окончании синхронизации

Сценарий: Создаем отказоустойчивый корпоративный файловый сервер. Первый узел кластера должен использоваться сервером по умолчанию.

7.1 Подготовка стенда

  • Подключаем к обоим узлам по дополнительному диску

7.2 Синхронизация файловых систем

7.3 Интеграция синхронизации ФС с пакетом heartbeat

Подготовка стенда

  • Останавливаем heartbeat

Настройка

Тестирование

  • Останавливаем node1
  • Перезагружаем node2
  • Загружаем node1
  • Дожидаемся окончания синхронизации

7.4 Настройка SAN сервера iSCSI

  • В зону corpX.un добавляем запись iscsi A 192.168.X.15
node1# cat corpX.un
...
iscsi     A       192.168.X.15
node1# csync2 -x
  • Определяем, на каком узле смонтирован зеркалируемый раздел
  • Устанавливаем на оба узла пакет iSCSI target
  • Отключаем авто запуск сервиса

Ubuntu Heartbeat

nodeN# update-rc.d -f iscsitarget remove
или
nodeN# systemctl disable iscsitarget

root@nodeN:~# service heartbeat stop

root@nodeN:~# cat /etc/ha.d/haresources
node2.corpX.un \
        drbddisk \
        Filesystem::/dev/drbd0::/disk2::ext4 \
        IPaddr2::192.168.X.15/32/eth0 \
        iscsiserv
root@nodeN:~# cat /etc/ha.d/resource.d/iscsiserv
#!/bin/sh

case $1 in
start)
        service iscsitarget start
        ;;
stop)
        service iscsitarget stop
        ;;
esac

exit 0
root@nodeN:~# chmod +x /etc/ha.d/resource.d/iscsiserv

root@nodeN:~# service heartbeat start

FreeBSD Heartbeat

[nodeN:~] # service heartbeat stop

[nodeN:~] # cat /usr/local/etc/ha.d/haresources
node2.corpX.un \
    hast \
    IPaddr::192.168.X.15/32 \
    iscsiserv
[nodeN:~] # cat /usr/local/etc/ha.d/resource.d/iscsiserv
#!/bin/sh

case $1 in
start)
        sleep 10
        service istgt onestart
        ;;
stop)
        service istgt onestop
        ;;
esac

exit 0
[nodeN:~] # chmod +x /usr/local/etc/ha.d/resource.d/iscsiserv

[nodeN:~] # service heartbeat start

7.5 Настройка NAS сервера SMB/CIFS

  • В зону corpX.un добавляем запись samba A 192.168.X.20
node1# cat corpX.un
...
samba     A       192.168.X.20
node1# csync2 -x

FreeBSD

  • В /etc/rc.conf ничего не добавлять

Ubuntu/Debian

  • Для Ubuntu отключаем автоматический запуск сервиса
root@nodeN:~# service smbd stop
root@nodeN:~# service nmbd stop

root@nodeN:~# echo manual > /etc/init/smbd.override
root@nodeN:~# echo manual > /etc/init/nmbd.override
  или
root@nodeN:~# systemctl disable smbd
root@nodeN:~# systemctl disable nmbd
  • Настраиваем на МАСТЕР узле Публичный каталог доступный на запись в каталоге /disk2/samba
  • Копируем на BACKUP узел файл конфигурации samba
  • Настраиваем менеджер кластера на монтирование на мастер узле зеркалируемого раздела в каталог /disk2, назначение ip адреса 192.168.X.20 и запуск сервера samba

Ubuntu Heartbeat

root@nodeN:~# service heartbeat stop

root@nodeN:~# cat /etc/ha.d/haresources
node1.corpX.un \
        drbddisk \
        Filesystem::/dev/drbd0::/disk2::ext4 \
        IPaddr2::192.168.X.20/32/eth0 \
        smbserv
root@nodeN:~# cat /etc/ha.d/resource.d/smbserv
#!/bin/sh

case $1 in
start)
        service smbd start
        ;;
stop)
        service smbd stop
        ;;
esac

exit 0
root@nodeN:~# chmod +x /etc/ha.d/resource.d/smbserv

root@nodeN:~# service heartbeat start

FreeBSD Heartbeat

[nodeN:~] # service heartbeat stop

[nodeN:~] # cat /usr/local/etc/ha.d/haresources
node1.corpX.un \
    hast \
    IPaddr::192.168.X.20/32 \
    smbserv
[nodeN:~] # cat /usr/local/etc/ha.d/resource.d/smbserv
#!/bin/sh

case $1 in
start)
        sleep 10
        service samba_server onestart
        ;;
stop)
        service samba_server onestop
        ;;
esac

exit 0
[nodeN:~] # chmod +x /usr/local/etc/ha.d/resource.d/smbserv

[nodeN:~] # service heartbeat start
  • Проверяем целостность зеркала

FreeBSD

master# hastctl status

Debian/Ubuntu

master# cat /proc/drbd
  • Останавливаем MASTER сервер и дожидаемся монтирования на SLAVE узле “половины” зеркалируемого раздела в каталог /disk2, назначение ip адреса 192.168.X.20 и запуск сервера samba
  • Запускаем бывший MASTER узел и дожидаемся восстановления целостности зеркала

Модуль 8. Отказоустойчивый почтовый сервер

!!! Проверять на отказоустойчивость по окончании синхронизации

Подготовка стенда

  • В зону corpX.un добавляем запись (mail A 192.168.X.30)

!!! Необходимо убедиться что на node1 смонтирован зеркалируемый раздел !!!

Ubuntu LXC

Подготовка родительских узлов

  • Подготовка сети для гостевых систем на обоих узлах для интерфейса LAN eth0
nodeN# apt install bridge-utils

nodeN# cat /etc/network/interfaces
...
auto br0
iface br0 inet static
        address 192.168.X.N
        netmask 255.255.255.0
        
        ucarp-vid 1
        ucarp-vip 192.168.X.254
        ucarp-password secret
        
        bridge_ports eth0

iface br0:ucarp inet static
        address 192.168.X.254
        netmask 255.255.255.255
...
nodeN# cat /etc/default/isc-dhcp-server
...
INTERFACES="br0"
nodeN# init 0
  • Для режима bridge в lxc понадобиться включить “неразборчивый режим” первом адаптере обоих виртуалок
  • Проверки после запуска
nodeN# ps ax | grep carp
nodeN# ifconfig | grep carp

nodeN# ps ax | grep dh

nodeN# ps ax | grep he
nodeN# mount | grep ext
  • Готовимся все, относящееся к виртуальным системам, хранить на зеркалируемом разделе
root@nodeN:~# rmdir /var/lib/lxc/

root@nodeN:~# ln -s /disk2/var/lib/lxc/ /var/lib/lxc

Подготовка виртуальных машин

root@node1.corpX.un:~# mkdir -p /disk2/var/lib/lxc/

root@node1.corpX.un:~# lxc-create -t ubuntu -n mail
  • Установка ПО в дочерней системе на MASTER узле
root@node1.corpX.un:~# cp /etc/ssh/sshd_config /var/lib/lxc/mail/rootfs/etc/ssh/sshd_config

root@node1.corpX.un:~# cp /etc/hosts /var/lib/lxc/mail/rootfs/etc/hosts

root@node1.corpX.un:~# chroot /var/lib/lxc/mail/rootfs/ /bin/bash

root@node1:/# PS1='mail:\w# '

mail:/# apt-get update

mail:/# apt-get purge resolvconf isc-dhcp-client

mail:/# apt-get install nano
  • Настраиваем hostname, hosts, DNS client и учетную запись root в гостевой системе
mail:/# cat /etc/hostname
mail.corpX.un
mail:/# cat /etc/hosts
127.0.0.1 localhost

192.168.X.30 mail.corpX.un

10.Z.M.254 proxy
mail:/# rm /etc/resolv.conf

mail:/# cat /etc/resolv.conf
search corpX.un
nameserver 192.168.X.1
nameserver 192.168.X.2
mail:/# userdel -r ubuntu

mail:/# passwd
  • Настраиваем lxc для запуска гостевой системы в контейнере на MASTER узле
root@node1.corpX.un:~# cat /var/lib/lxc/mail/config
...
lxc.network.type = veth
lxc.network.link = br0
lxc.network.ipv4 = 192.168.X.30/24
lxc.network.ipv4.gateway = 192.168.X.254
...
  • Тестируем работу виртуальной системе на MASTER узле
root@node1.corpX.un:~# lxc-info -n mail

root@node1.corpX.un:~# lxc-start -n mail -d

root@node1.corpX.un:~# lxc-info -n mail

root@node1.corpX.un:~# lxc-attach -n mail -- ps ax

root@node1.corpX.un:~# ssh mail

root@node1.corpX.un:~# lxc-stop -n mail

root@nodeN.corpX.un:~# service heartbeat stop

FreeBSD

# mount_cd9660 /dev/cd0 /mnt

# setenv D /disk2/jail/mail

# mkdir -p $D

# tar -xvf /mnt/usr/freebsd-dist/base.txz -C $D
  • Настраиваем параметры виртуальной машина на обоих узлах (без автозапуска)
[nodeN:~] # cat /etc/rc.conf
...

jail_list="mail"
[nodeN:~] # cat /etc/jail.conf
allow.raw_sockets = 1;
exec.clean;
exec.system_user = "root";
exec.jail_user = "root";
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
mount.devfs;
allow.set_hostname = 0;
allow.sysvipc = 0;

mail {
        host.hostname = "mail.corpX.un";
        path = "/disk2/jail/mail";
        interface = "em0";
        ip4.addr = "192.168.X.30";
        exec.consolelog = "/var/log/jail_mail_console.log";
}
  • Тестируем виртуальную машину на MASTER узле
[node1:~] # cp /root/.cshrc /disk2/jail/mail/root/

[node1:~] # cp /etc/hosts /disk2/jail/mail/etc/

[node1:~] # cp /etc/ssh/sshd_config /disk2/jail/mail/etc/ssh/

[node1:~] # service jail onestart mail

[node1:~] # jls

[node1:~] # jexec NN csh

mail# cat /etc/resolv.conf
nameserver 192.168.X.1
nameserver 192.168.X.2
mail# cat /etc/rc.conf
sshd_enable=yes
mail# passwd

mail# ping ya.ru

mail# telnet ya.ru 80

[node1:~] # service jail onestop mail

Интеграция технологий виртуализации с пакетом heartbeat

Ubuntu

FreeBSD

Настройка виртуальной системы как сервер электронной почты

FreeBSD

[mail:~] # cat /usr/local/etc/dovecot/dovecot.conf
...
listen = 192.168.X.30
...

Дополнительные задания

  • Настроить в виртуальной системе сервисы www и samba
  • В зоне corpX.un заменить записи (www A 192.168.X.30) и (samba A 192.168.X.30)
  • Настроить редирект tcp пакетов идущих на 25,80,110,143 порты внешнего IP адреса ISP в адрес 192.168.X.30 (Сервис NAT). Примечание: проблема возникает когда с точки зрения CARP/VRRP мастером является один хост, а с точки зрения heartbeat другой. Решение или административно исключить такую ситуацию или автоматически менять шлюз по умолчанию на вторичном с точки зрения CARP/VRRP узле через мастер (еще надо исключить ip из сети ISP на внешнем интерфейсе вторичного узла, иначе пакеты будут возвращаться в сеть ISP напрямую а не через мастер).
  • Настроить DNS View для внешних пользователей зоны corpX.un и запись A для mail.corpX.un и mail.corpX.un указать на адрес выданный ISP
создание_отказоустойчивых_unix_решений_2016.txt · Last modified: 2017/10/02 10:51 by val