LINUX.ORG.RU
ФорумAdmin

«default route» в виде «multipath route» - в какой конфиг и как?

 


1

2

Переформулировка вот этой темы:
sys-apps/iproute2 - какой командой создать таблицу?
другими словами.

старую тему отредактировать не могу - поздно, час редактирования прошел

Вопрос: в какой конфиг генты и как вписывать строчку

ip route add default scope global \
nexthop via 192.168.1.1 dev eth1 weight 1 \
nexthop via 192.168.2.1 dev eth2 weight 1

чтобы она вызывалась после инициации интерфейсов net.eth1 и net.eth2 (иначе выдаст ошибку), но до запуска /etc/init.d/ntp-client (иначе не установится время)

запилить свой инит скрипт
ибо тот же *local* не проканает - он позже всех запускается

megabaks ★★★★
()
#!/sbin/runscript
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

depend() {
	need net
	before ntp-client
	keyword -timeout
}

start() {
	ebegin "делаем хорошо"
	ip route add default scope global \ 
	nexthop via 192.168.1.1 dev eth1 weight 1 \ 
	nexthop via 192.168.2.1 dev eth2 weight 1 
	eend $?
}

как-то так
потом кидаешь к остальным и запиливаешь в желаемый уровень

megabaks ★★★★
()
Последнее исправление: megabaks (всего исправлений: 1)
Ответ на: комментарий от megabaks

need net

А как бы так сделать, чтобы этот скрипт сам считался частью net ? а то получается, что пока он не отработает, все сервисы, выходящие в интернет - тоже не смогут достучаться.

Или net - это значит только что IP-адреса присвоены?

StrongDollar
() автор топика
Ответ на: комментарий от StrongDollar

попробуй так

depend() {
	after net.*
	provide net
	before ntp-client
	keyword -timeout
}

megabaks ★★★★
()
Ответ на: комментарий от megabaks

да вы, батенька, наркоман.

достаточно в /etc/conf.d/net написать: и вобще править настройки сети там

postup(){
	if [[ ${IFACE} == "eth1" || ${IFACE} == "eth2" ]]; then
            ip route add default scope global;
	    nexthop via 192.168.1.1 dev ${IFACE} weight 1;
   	    nexthop via 192.168.2.1 dev ${IFACE} weight 1;
        if;
}
qnikst ★★★★★
()
Ответ на: комментарий от qnikst

не слушай его нафиг

Вот в твоем варианте функция postup будет вызвана два раза с разными именами интерфейса в переменной ${IFACE}. А команда раутинга - она единая и неделимая. Поэтому так как ты проедложил - работать не будет

а если слушаешь, то сделай rc_before=«yourscript» в /etc/conf.d/net

не понимаю, как конкретно. Создаю скрипт # nano -w /etc/init.d/routing

в /etc/conf.d/net прописываю:
rc_net_eth1_provide="!net"
rc_net_eth2_provide="!net"
rc_routing_use=«net.eth1»
rc_routing_use=«net.eth2»
rc_routing_provide=«net»
rc_net_need=«routing»

так?

мне непонятно как бы в bash-скрипте проверить, поднят интерфейс или опущен?

типа такого:

if [[ eth1 is UP && eth2 is DOWN ]]; then

StrongDollar
() автор топика
Ответ на: комментарий от megabaks

Вот на эту строчку

keyword -timeout

ругается так:
/var/lib/init.d/depcache: line 677: keyword: command not found

StrongDollar
() автор топика
Ответ на: комментарий от StrongDollar

мне непонятно как бы в bash-скрипте проверить, поднят интерфейс или опущен?

в эту сторону думать и надо, можешь функцию запилить и ifconfig-ом проверить, но наверняка уже есть готовое.

qnikst ★★★★★
()
Ответ на: комментарий от StrongDollar

Вроде, должно работать «ip route replace ...». Эту команду суёте в postup() с выводом в >/dev/null. В конфиге интерфейсов оставляете обычный default маршрут. От того, что команда вызовется два раза (для eth1 и для eth2) ничего страшного, ИМХО, не будет, ну не сработает она один раз.

При этом в случае смены конфигурации (выхода из строя eth2, допустим), при подёме eth1 будет прописан default маршрут штатными средствами, а потом, если получится, переписан в postup().

mky ★★★★★
()
Ответ на: комментарий от mky

Вроде, должно работать «ip route replace ...»

Где это описано, что оно делает, как оно должно работать, зачем это нужно?

От того, что команда вызовется два раза ничего страшного, ИМХО, не будет

N * 2 раз, где N - общее число интерфейсов

StrongDollar
() автор топика
Ответ на: комментарий от StrongDollar

Описано в опициях команды ip (man ip), добавит или заменит существующий маршрут. Нужно, чтобы не вызывать «ip route del default».

Хорошо, N * 2 раз. А сколько раз вызовется команда ip в случае вашего скрипта?

ИМХО, postup() в несколько строчек длиною, где просто вызывается «ip route replace ...» понятнее вашего скрипта, особенно если придёт другой админ.

mky ★★★★★
()
Ответ на: комментарий от mky

Нужно, чтобы не вызывать

а разве команда «route del default» как-то влияет на ранее установленные соединения (если сразу после нее будет установлен какой-то другой маршрут)?

postup() понятнее вашего скрипта

согласен.

Несвязанный с предыдущими вопрос:
как бы так написать функцию reconfigure_multipath_route
чтобы ей можно было передавать любое число интерфейсов?

Эту функцию я бы тогда вызвал из postup и из postdown

StrongDollar
() автор топика
Ответ на: комментарий от StrongDollar

Я не знаю как в вашей системе, в моей системе, «ip route replace», либо успешно отрабатывает, либо ругается, но при этом старый маршрут. Я не нашёл, чтобы где-то было явно описано такое поведение для «replace» (и его гарантированность для всех дистрибутивов на все времена), но оно вполне логично и достаточно удобно. Думаю, что можно его попробовать.

По поводу reconfigure_multipath_route я не совсем понял, но я бы просто в postup засунул команду наподобие:

if [ "$IFACE" = eth1 -o "$IFACE" = eth2 -o "$IFACE" = eth3 ] ;then
 /sbin/ip route replace default scope global \
    nexthop via 192.168.1.1 dev eth1 weight 1 \
    nexthop via 192.168.2.1 dev eth2 weight 1 \
    nexthop via 192.168.3.1 dev eth3 weight 1 2>/dev/null 
fi

пусть она вызывается на up каждого интерфейса, всё равно она сработает и заменит default-маршрут только если eth1, eth2 и eth3 будут в UP-состоянии.

А если делать функцию reconfigure_multipath_route, то, помимо, списка интерфейсов, она для каждого интерфейса откуда-то должна получать как минимум ip-адрес шлюза (если weight для всех делать 1).

mky ★★★★★
()
Ответ на: комментарий от StrongDollar

Немного подумал, возможно что вам нужно это:

reconfigure_multipath_route()
{
IFs=( eth1 eth2 eth3 )
GWs=( 10.0.1.1 10.0.2.1 10.0.3.1 )
unset RTop

f=
for i in "${IFs[@]}"; do 
  [ "$1" = $i ] && f=1 
done
[ "$f" != 1 ] && return 0

for (( i=0; i<${#IFs[@]}; i++ )) ; do
  D=$(< /sys/class/net/${IFs[i]}/operstate )
  D="${D,,}" # Башизм, в нижний регистр, вдруг там будет DOWN
  [ "$D" != down ] && RTop="$RTop nexthop via ${GWs[i]} dev ${IFs[i]} weight 1
done

/sbin/ip route replace default scope global $RTop
}

Первый цикл расчитан на то, что скрипту передаётся первым параметром имя интерфейса, в принципе его, можно убрать.

А для вывода сообщений о том, какой сейчас маршрут по умолчанию лучше написать отдельный скрипт, который парсит вывод «ip route», не нужно замусоривать reconfigure_multipath_route() лишними echo.

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