Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
nat from 10.0.0.0/20 to !<no_nat> -> { ($ext_if1) ($ext_if2) } round-robin sticky-address
из них выкинута. Вместо нее появляются две строки:
pass out route-to ($ext_if $gw1) from $int_if to any
pass out route-to ($ext_if2 $gw2) from $int_if to any
pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 to !<no_nat>
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to !<no_nat>
#Например, клиент-банки или тендерные площадки чувствительны к смене ip-адреса при балансировке.
#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
#Ip адреса на интерфейсах разных каналов.
INT1="192.168.88.99"
INT2="192.168.89.99"
#Какой внешний адрес проверяем для определения жив ли канал.
testaddress="8.8.8.8" #Для 3х адресов, надо чуть поменять
#Шлюзы по умолчанию для каждого из каналов
GW1="192.168.88.1"
GW2="192.168.89.1"
#Куда складывать лог.
logfile=/var/log/canalchange.log
fl=`date "+%H:%M:%S %d-%m-%Y"`
tester=0;
itest1=`/sbin/ping -S $INT1 -c 3 $testaddress | grep "64 bytes" | wc -l`;
itest2=`/sbin/ping -S $INT2 -c 3 $testaddress | grep "64 bytes" | wc -l`;
if [ ! -f "/tmp/countGW.tmp" ]
then
echo 3 > /tmp/countGW.tmp
fi
oldtest=`cat /tmp/countGW.tmp`
if (test $itest1 -gt "0")
then
let tester=tester+1
fi
if (test $itest2 -gt "0")
then
let tester=tester+2
fi
#Если последняя проверка такая же как предыдущая, то ничего не делаем
if [ $oldtest = $tester ]; then
exit;
else
if [ $tester = 3 ]; then
cp /etc/pf.conf3 /etc/pf.conf
/sbin/route change default $GW1
echo ${fl}" OK" >> $logfile
echo 3 > /tmp/countGW.tmp
fi
if [ $tester = 2 ]; then
cp /etc/pf.conf2 /etc/pf.conf
/sbin/route change default $GW2
echo ${fl}" CHANAL 1 DOWN" >> $logfile
echo 2 > /tmp/countGW.tmp
fi
if [ $tester = 1 ]; then
cp /etc/pf.conf1 /etc/pf.conf
/sbin/route change default $GW1
echo ${fl}" CHANAL 2 DOWN" >> $logfile
echo 1 > /tmp/countGW.tmp
fi
if [ $tester = 0 ]; then
echo ${fl}" CHANAL 1 DOWN and CHANAL 2 DOWN" >> $logfile
# Если лежат оба то при каждом запуске скрипта меняем дефолтный, ведь неизвестно какой подымется первым
if [ $(/usr/bin/netstat -rn | awk '/default/ {print $2}') == $GW1 ]; then
/sbin/route change default $GW2
else
/sbin/route change default $GW1
fi
fi
/etc/rc.d/pf restart
fi
nat from 10.0.0.0/20 to !<no_nat> -> { ($ext_if1) ($ext_if2) ($ext_if1) } round-robin sticky-address
acl fifth random 1/5 acl quarter random 1/4 acl third random 1/3 acl half random 1/2 tcp_outgoing_address 10.1.1.1 fifth tcp_outgoing_address 10.1.1.2 quarter tcp_outgoing_address 10.1.1.3 third tcp_outgoing_address 10.1.1.4 half tcp_outgoing_address 10.1.1.5
Балансировка 2-х и более каналов на FreeBSD с использованием PF + Squid