7 виртуалок, из них
5 в одной сети
1 во второй сети
1 в третьей сети
Задача: взять две виртуалки и настроить на них ipsec туннель с двумя другими. на пятой виртуалке замутить гре туннель с одной из первых двух виртуалок. Две другие виртуалки, которые в разных сетях надо зацепить в одну сеть через туннель. Для полного счастья первые две виртуалки сделать высокодоступными.
Для начала чешем репу. После того как почесали мы поднимаем все виртуалки. Поднимал на дебиане.
Переходим к конфигурированию. Хосты keepalived{1,2} будут отказоустойчивыми и высокодоступными. хосты test{1,2} и test3 - обычными. Хосты keepalived{1,2} и test{1..3} находятся в одной сети. test 4 - в другой и test5 в третьей.
test1 будет ходить по айписеку к keepalived1 и test2 будет ходить по айписеку к keepalived2. Гре туннель будет поднят на test3 и keepalived1. test4 будет ходить к test5 через туннель между test3 и keepalived1.
Решение ipsec:
для всего этого нам понадобяццо 4 виртуалки, на которых будут стоять ipsec-tools, racoon. На keepalived* будет стоять keepalived. Ставятся они через apt.
Выделил я два ипа, которые будут являтся отказоустойчивыми. 192.168.5.20{1,2}
/etc/network/interfaces
Код: Выделить всё
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.5.183
netmask 255.255.255.0
gateway 192.168.5.1
post-up iptables-restore < /etc/ipt
auto eth1
iface eth1 inet static
address 192.168.4.1
netmask 255.255.255.0
auto tunnel
iface tunnel inet static
address 10.0.0.1
pointopoint 10.0.0.2
netmask 255.255.255.0
up ifconfig ${IFACE} multicast
pre-up iptunnel add ${IFACE} mode gre local 192.168.5.201 remote 192.168.5.184 ttl 255
post-up ip route add 192.168.3.0/24 via 10.0.0.2
post-down iptunnel del ${IFACE}
Код: Выделить всё
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.5.182
netmask 255.255.255.0
gateway 192.168.5.1
auto eth1
iface eth1 inet static
address 192.168.4.2
netmask 255.255.255.0
auto tunnel
iface tunnel inet static
address 10.0.0.1
pointopoint 10.0.0.2
netmask 255.255.255.0
up ifconfig ${IFACE} multicast
pre-up iptunnel add ${IFACE} mode gre local 192.168.5.201 remote 192.168.5.184 ttl 255
post-up ip route add 192.168.3.0/24 via 10.0.0.2
post-down iptunnel del ${IFACE}
Из конфига ракуна важное то, что он вешается на 2 интерфейса
Код: Выделить всё
listen
{
isakmp 192.168.5.202 [500];
isakmp 192.168.5.201 [500];
}
Думаю, что всё понятно. Переходим к реализации отказоустойчивости
/etc/keepalived/keepalived.conf
Код: Выделить всё
vrrp_script chk_racoon {
script "pidof racoon"
intelrval 1
weight 2
}
vrrp_instance test1 {
interface eth1
state MASTER
virtual_router_id 31
priority 101
garp_master_delay 1
track_script {
chk_racoon
}
authentication {
auth_type PASS
auth_pass trololo
}
virtual_ipaddress {
192.168.5.201/24 dev eth0 label eth0:t1-MASTER
}
virtual_routes {
192.168.5.203 dev eth0 src 192.168.5.201
}
notify_backup "/usr/local/bin/notyfier.sh BACKUP test1"
notify_master "/usr/local/bin/notyfier.sh MASTER test1"
notify_fault "/usr/local/bin/notifier.sh FAULT test1"
}
vrrp_instance test2 {
interface eth1
state BACKUP
virtual_router_id 32
priority 100
garp_master_delay 1
track_script {
chk_racoon
}
authentication {
auth_type PASS
auth_pass trololo
}
virtual_ipaddress {
192.168.5.202/24 dev eth0 label eth0:t2-BACKUP src 192.168.5.202
}
virtual_routes {
192.168.5.200 dev eth0 src 192.168.5.202
}
notify_backup "/usr/local/bin/notyfier.sh BACKUP test2"
notify_master "/usr/local/bin/notyfier.sh MASTER test2"
notify_fault "/usr/local/bin/notifier.sh FAULT test2"
}
Код: Выделить всё
vrrp_script chk_racoon {
script "pidof racoon"
intelrval 1
weight 2
}
vrrp_instance test1 {
interface eth1
state BACKUP
virtual_router_id 31
priority 101
garp_master_delay 1
track_script {
chk_racoon
}
authentication {
auth_type PASS
auth_pass trololo
}
virtual_ipaddress {
192.168.5.201/24 dev eth0 label eth0:t1-BACKUP
}
virtual_routes {
192.168.5.203 dev eth0 src 192.168.5.201
}
notify_backup "/usr/local/bin/notyfier.sh BACKUP test1"
notify_master "/usr/local/bin/notyfier.sh MASTER test1"
notify_fault "/usr/local/bin/notifier.sh FAULT test1"
}
vrrp_instance test2 {
interface eth1
state MASTER
virtual_router_id 32
priority 100
garp_master_delay 1
track_script {
chk_racoon
}
authentication {
auth_type PASS
auth_pass trololo
}
virtual_ipaddress {
192.168.5.202/24 dev eth0 label eth0:t2-MASTER src 192.168.5.202
}
virtual_routes {
192.168.5.200 dev eth0 src 192.168.5.202
}
notify_backup "/usr/local/bin/notyfier.sh BACKUP test2"
notify_master "/usr/local/bin/notyfier.sh MASTER test2"
notify_fault "/usr/local/bin/notifier.sh FAULT test2"
}
master backup
backup master
Если вывалился один сервак, то выполняется скрипт /usr/local/bin/notifier.sh
Код: Выделить всё
#!/bin/bash
state=$1
fromVI=$2
if [[ "$state" == "MASTER" && "$fromVI" == "test1" ]]; then
echo test2 is DOWN. Im MASTER now
echo `date` $fromVI changed state into MASTER >> /tmp/keepalived.log
/etc/init.d/racoon restart
echo Racoon restarted >> /tmp/keepalived.log
ifdown tunnel && ifup tunnel
ping 192.168.5.200 -c 5
ping 192.168.5.203 -c 5
sleep 5
elif [[ "$state" == "MASTER" && "$fromVI" == "test2" ]]; then
echo test1 is DOWN. Im MASTER now
echo `date` $fromVI changed state into MASTER >> /tmp/keepalived.log
/etc/init.d/racoon restart
echo Racoon restarted >> /tmp/keepalived.log
ifdown tunnel && ifup tunnel
ping 192.168.5.200 -c 5
ping 192.168.5.203 -c 5
sleep 5
fi
Что имеем на выходе:
Простой туннелей в 5 секунд. Автоматическое переключение с сервака на сервак.
ЗЫ если один сервак выпал и второй забрал на него VIP, то он отдаст его только в том случае. если сам упадет.
Сцылки:
http://xgu.ru/wiki/VRRP
man keepalived.conf