Вообще там странность какая-то, таких проблем не возникает. Криво настроен роутинг и вообще.
1. У вас разные операторы связи, значит и IP-адреса роутеров надо было раскидывать
в разные подсети класса C (т.е. один маршрутизатор 192.168.1.1, второй маршрутизатора 192.168.2.1), кроме того, они должны были быть воткнуты в какой-то сервер, который определяет балансировку.
2. Мне не понятно, почему на сервере балансировки
два разных маршрута висят на одном eth0? Когда они должны быть разные.
Код:
ip route add default via 192.168.1.1 dev eth0 src 192.168.1.12 table vpn
ip route add default via 192.168.1.2 dev eth0 src 192.168.1.12 table adsl
3. Да и вообще в целом у вас
два default маршрута (п.2), для одного интерфеса и src (а такого быть не должно), поэтому правило ip route add должно звучать без default (да и подсети нужно было указывать), например так:
Код:
ip route add $IESK_NET dev $IESK_IF src $IESK_IP table $IESK_TBL
ip route add $RT_NET dev $RT_IF src $RT_IP table $RT_TBL
4. Далее удаляется маршрут по умолчанию, и добавляется маршрут по умолчанию (не резервный), поскольку не известно, был ли заменен маршрут каким либо из PPPD демонов, да и не известно, кто дозвонился последний:
Код:
ip route delete default
ip route add default via $RT_GW
5.
Нет ключевого правила from (который как раз и отвечает за правильное направление ответных tcp/ip пакетов), а использовалась зачем-то их маркировка.
Код:
ip rule add from $IESK_IP table $IESK_TBL
ip rule add from $RT_IP table $RT_TBL
6. Если эти оба модема были воткнуты в свитч, а в него же сам локальный маршрутизатор, то это было ошибкой.
Поэтому и возникали все эти проблемы.
Вот пример система балансировки с DNAT и NAT, двумя операторами связи, контролем по каналов с переключением (вечный bash скрипт). Сделаны мною для одного офиса бухгалтерии с переброской по DNAT соединений на локальный сервер 1С. Юзерам для внешних соединений даны два хоста: gw-rt.company.ru и gw-iesk.compmay.ru - если по одному не доступно , то юзеры заходят на RDP по другому каналу (из вне). При этом никаких танцев с бубном не было.
Код:
# Переменные
# cat /etc/fw/balance/vars.sh
#!/bin/sh
LOCAL_IF_1="eth0"
LOCAL_IF_2="eth3"
IESK_IF="ppp0"
IESK_IP="`ip addr show $IESK_IF | grep inet | awk '{print $2}'`"
IESK_GW="`netstat -rn | grep $IESK_IF | grep UH | awk '{print $1}'`"
IESK_NET="$IESK_GW/32"
IESK_WEIGHT="1"
IESK_TBL="iesk"
RT_IF="ppp1"
RT_IP="`ip addr show $RT_IF | grep inet | awk '{print $2}'`"
RT_GW="`netstat -rn | grep $RT_IF | grep UH | awk '{print $1}'`"
RT_NET="$RT_GW/32"
RT_WEIGHT="2"
RT_TBL="rt"
Код:
# Скрип автозагрузки ( post-up.d )
# cat /etc/fw/balance/routing.sh
#!/bin/sh
sleep 10
. /etc/fw/balance/vars.sh
echo "1" > /proc/sys/net/ipv4/ip_forward
ip route add $IESK_NET dev $IESK_IF src $IESK_IP table $IESK_TBL
ip route add $RT_NET dev $RT_IF src $RT_IP table $RT_TBL
ip route add default via $IESK_GW table $IESK_TBL
ip route add default via $RT_GW table $RT_TBL
ip route add $IESK_NET dev $IESK_IF src $IESK_IP
ip route add $RT_NET dev $RT_IF src $RT_IP
ip route delete default
#ip route add default via $IESK_GW
ip route add default via $RT_GW
ip rule add from $IESK_IP table $IESK_TBL
ip rule add from $RT_IP table $RT_TBL
ip route add 127.0.0.0/8 dev lo table $RT_TBL
ip route add 192.168.0.0/24 dev eth0 table $RT_TBL
ip route add $IESK_NET dev $IESK_IF table $RT_TBL
ip route add 127.0.0.0/8 dev lo table $IESK_TBL
ip route add 192.168.0.0/24 dev eth0 table $IESK_TBL
ip route add $RT_NET dev $RT_IF table $IESK_TBL
Код:
# Скрипт тестирования линков
# cat /etc/fw/balance/check.sh
#!/bin/sh
. /etc/fw/balance/vars.sh
OLDIF1=0
OLDIF2=0
. /etc/fw/balance/routing.sh
while true; do
ping -c 3 -s 100 $IESK_GW -I $IESK_IF > /dev/null
if [ $? -ne 0 ]; then
echo "Failed IESK!"
NEWIF1=0
else
NEWIF1=1
fi
ping -c 3 -s 100 $RT_GW -I $RT_IF > /dev/null
if [ $? -ne 0 ]; then
echo "Failed RT!"
NEWIF2=0
else
NEWIF2=1
fi
if (( ($NEWIF1 != $OLDIF1) || ($NEWIF2 != $OLDIF2) )); then
echo "Changing routes"
if (( ($NEWIF1==1) && ($NEWIF2==1) )); then
echo "Both channels"
ip route delete default
ip route add default scope global \
nexthop via $IESK_GW dev $IESK_IF weight $IESK_WEIGHT \
nexthop via $RT_GW dev $RT_IF weight $RT_WEIGHT
elif (( ($NEWIF1==1) && ($NEWIF2==0) )); then
echo "First channel"
ip route delete default
ip route add default via $IESK_GW dev $IESK_IF
elif (( ($NEWIF1==0) && ($NEWIF2==1) )); then
echo "Second channel"
ip route delete default
ip route add default via $RT_GW dev $RT_IF
fi
else
echo "Not changed"
fi
OLDIF1=$NEWIF1
OLDIF2=$NEWIF2
sleep 3
done