Простая задачка, а где-то грабли. Имею два линка в нет. Делаю два маршрута по умолчанию с различными метриками:
route add -net 0.0.0.0 netmask 0.0.0.0 metric 1 dev eth0
route add -net 0.0.0.0 netmask 0.0.0.0 metric 2 dev eth1
Т.е. идея такова, что пока работает первый линк, то все пакеты идут через него (eth0), как только падает, то через eth1.
Беру, выдергиваю шнурок из eth0.. Но пакеты через eth1 не идут. Мож я что-то не то делаю?
Тут тебе надо LARTC (Linux Advanced Routing & Traffic Control HOWTO), http://gazette.linux.ru.net/rus/articles/lartc/index.htmlштука с виду сильно замароченая, но на самом деле когда разберешься - очень простая и удобная.
щас ниже опишу как у меня сделано.
Я наверное чуток с LARTC погорячился, если только ИЛИ/ИЛИ можно проще.
LARTC будет нужен только для полноценного ответа сервера с обоих каналов.Обший смысл: небольшой скрипт каждые 2 минуты проверяет доступность например www.ya.ru через определенный канал, это делается пингом с указанием с какого интерфейса это делать, и меняет default route. Я так полагаю что у тебя не только сам сервер в инет смотрит, но и пользователи за NAT'ом, т.е. надо ещё менять правила NAT.
Чтобы сервак отвечал с обоих каналов:
#!/bin/bash/sbin/ip route add IP1/IP1_MASK dev eth1 src IP1 table T1
/sbin/ip route add IP2/IP2_MASK dev eth2 src IP2 table T1
/sbin/ip route add 192.168.0.0/24 dev eth0 table T1
/sbin/ip route add 127.0.0.0/8 dev lo table T1
/sbin/ip route add default via GW1 table T1/sbin/ip route add IP1/IP1_MASK dev eth1 src IP1 table T2
/sbin/ip route add IP2/IP2_MASK dev eth2 src IP2 table T2
/sbin/ip route add 192.168.0.0/24 dev eth0 table T2
/sbin/ip route add 127.0.0.0/8 dev lo table T2
/sbin/ip route add default via GW2 table T2/sbin/ip rule add from IP1 table T1
/sbin/ip rule add from IP2 table T2смысл сей комбинации в том, чтобы если пакет пришёл на IP1 то сервак и отвечал через него, а не через default gw.
/// продолжение следует
Это для клиентов:/sbin/ip route add 192.168.0.0/24 dev eth0 src 192.168.0.3 table T3
/sbin/ip route add IP1/IP1_MASK dev eth1 src IP1 table T3
/sbin/ip route add IP2/IP2_MASK dev eth2 src IP2 table T3
/sbin/ip route add 127.0.0.0/8 dev lo table T3
/sbin/ip route add default via GW1 table T3/sbin/ip rule add from 192.168.0.0/24 table T3
в этой табличке будем переключать через какой канал их пускать.
Скрипт (пример, внимательно разбиратья с ипишниками и интерфейсами), также есть чуток лишнего, т.к. у меня разные пользователи сидят через разные каналы, а вслучае падения все перебрасываются на какой-нибудь из:
#!/bin/bash
ping -c 3 213.180.204.8 -I eth1 >> /dev/null
if [ $? -ne 0 ]; then
echo "Not ping from PROV2 ! Try switch channel to PROV1 !"ping -c 3 213.180.204.8 -I eth2 >> /dev/null
if [ $? -ne 0 ]; then
echo "Not ping from PROV2 ! 3,14zdec!"
else
/sbin/ip route replace default via GW1 table T3
/sbin/ip route replace default via GW1
/sbin/ip route flush cache
/sbin/iptables-restore /etc/iptables.nat.PROV1
fi
else
ping -c 3 213.180.204.8 -I eth2 >> /dev/null
if [ $? -ne 0 ]; then
echo "Not ping from PROV1! Try switch channel to PROV2!"/sbin/ip route replace default via GW2 table T3
/sbin/ip route replace default via GW2
/sbin/ip route flush cache
/sbin/iptables-restore /etc/iptables.nat.PROV2
else
GRP1=`/sbin/ip ro show table T4|grep -c 'default via GW2'`
GRP2=`/sbin/ip ro show table T5|grep -c 'default via GW1'`
if [ $GRP1 -eq 0 ] || [ $GRP2 -eq 0 ]; then
echo "Work normal!"
/sbin/ip route replace default via GW1 table T3
/sbin/ip route replace default via GW1
/sbin/ip route flush cache
/sbin/iptables-restore /etc/iptables.nat
fi
fi
fiПример /etc/iptables.nat.PROV1:
# Generated by iptables-save v1.2.7a on Sat Jun 4 19:25:57 2005
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source IP1
COMMIT
# Completed on Sat Jun 4 19:25:57 2005
а какой смысл тогда заложен в возможности работы команды route с разными метриками - для чего нужна эта возможность?, или это просто недоработка? тоже хотелось бы узнать у уважемого форума
>а какой смысл тогда заложен в возможности работы команды route с разными
>метриками - для чего нужна эта возможность?, или это просто
>недоработка? тоже хотелось бы узнать у уважемого форума
1 - в основном при работе с rip и прочими - тогда в таблицы маршрутизации могут добавиться несколько маршрутов на один хост, выбирается кратчайший.
Ставь routed в минимальном варианте - и заработает, а маршрутов можешь и не писать Ж8-) - если, конечно, тебе анонсы rip выдадут - что, впрочем, маловероятно.
2 - так, как ты хотел, тоже работать может, но с парой поправок -
а - изменить в настройках sysctl время, через которое система сделает "интерфейс лежит" - по умолчанию это 10 мин., что ли... была здесь статья
б - реально это не поможет - ибо эзернет как правило не ложится... а упадание рутера ровным образом ничего системе не скажет.