LINUX.ORG.RU
ФорумAdmin

Один интерфейс два шлюза

 


2

3

Схема сети

            роутер                         шлюз №1
eth1                 eth0               /-192.168.28.17/24 <-> инет реал ip
192.168.111.1/24<NAT>192.168.28.16/24 -|  шлюз №2
                                        \-192.168.28.1/24  <-> инет реал ip 
роутер linux route default gw 192.168.28.1 вопрос КАК пингануть с 192.168.28.16 адреса адрес 8.8.8.8 через №1 шлюз и №2 шлюз на шлюзах нат и это разные железки все в одной подсети route default gw дергать для проверки не хочется если находимся на резерве. Вот накидал скриптик вроде как работает
#!/bin/sh
# IP адрес кого пингуем
DSTIP='8.8.8.8'
# основной шлюз MAC адрес
MAC0='d0:d0:fd:0f:6d:81'

ICMP=`./nping -c 2 --icmp --dest-mac $MAC0 $DSTIP |grep packets|awk '{print $12}'`
#echo $ICMP
if [ $ICMP = 2 ]; then
{
    #echo 'Резерв'
    ip route change default via 192.168.28.17
}
fi
if [ $ICMP = 0 ];then
{
    #echo 'Основной'
    ip route change default via 192.168.28.1
}
fi
exit
Критика и замечания приветствуются.

★★

Скрипт изучать лень. Для вашей задачи вешаете на роутер ещё один любой ip-адрес (вобще любой, не обязательно 192.168.28.0/24). Настраиваете для исходящих с этого адреса маршрут по умолчанию через шлюз 1, а в iptables делает SNAT этого src-адреса. В команде ping или других программах указываете использовать этот адрес.

mky ★★★★★ ()

Вижу пару минусов.
1. Парсинг текстового выхлопа команды, который (выхлоп) может и меняться от версии к версии.
2. Смена шлюза на основе всего двух icmp пакетов да и еще «куда-то туда» (а оно «куда-то туда» может просто не работать в этот момент)

К пункту 1 , ткнул палочкой nping, у него недостаток в том что код возврата всегда 0. А так идея после переработки была бы хороша. Но увы. В данных условиях mky лучше вариант предложил.

anc ★★★★★ ()

Я бы использовал condition из xtables-addons + policy-routing

Резервный маршрут в отдельную таблицу. ip ro add default via XXXX table 2

Таблица выбирается если пакет имеет метку 1 ip ru add fwmark 1 unicast table 2

метку ставим таким образом iptables -t mangle -I PREROUTING -m condition --condition gw2 -j MARK --set-mark 1

Если в файле /proc/net/nf_condition/gw2 не 0, то метка ставится.

В скрипте проверяем если доступен основной канал, то пишем 0 в /proc/net/nf_condition/gw2, а иначе пишем туда 1. Оценка доступности канала - это на усмотрение ТС.

/proc/net/nf_condition/gw2 можно сделать доступным на запись определенному uid и gid через параметры в /sys/module/xt_condition/parameters/

vel ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.