LINUX.ORG.RU
решено ФорумAdmin

Сохранить статические маршруты при перезагрузке.

 


0

1

Здравствуйте. Debian 7.8. Нужно при загрузке сетевой подсистемы восстанавливать содержимое одной таблицы и добавлять правило:

ip route add default via x.x.x.x table HH
ip rule add from x.x.x.y table HH
Собственно, попробовал разместить исполняемый файл с таким содержанием (еще объявил интерпретатор вначале) в /etc/networ/if-up.d/ и получил что нужно, но правил 3276x: from x.x.x.y lookup YY оказалось 3, видимо из-за того что это выполнилось для всех интерфейсов, а их у меня 3 (eth0, eth1, lo).
Попробовал то же самое записать в /etc/network/interfaces, но видимо команды ip route там не работают. Еще какой-то способ есть?

Дистрибутив какой?

В /etc/network/interfaces работают команды up и down. А в файле /etc/network/if-up.d/whatever нужно делать отбор по нужному интерфейсу. Читайте маны, короче...

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

Добрый день. Спасибо за ответ.
По поводу дистрибутива я написал в первой строке.
По запросу man if-up.d получил это http://manpages.ubuntu.com/manpages/precise/man5/interfaces.5.html и другие похожие справки, но метода выполнения скрипта из if-up.d только для одного интерфейса не обнаружил.
В /etc/network/interfaces я пробовал и up, и post-up, например:

............
auto eth1
...
     up ip route add default via x.x.x.x table HH
     up ip rule add from x.x.x.y table HH
пробовал и такое:
...  
     up /etc/scripts/route
где /etc/scripts/route исполняемый и если его запустить руками - все что нужно прописывается, но при перезапуске сети - нет.
На сколько я знаю, последний способ точно должен работать, но почему-то не работает, возможно из-за сообщения при перезагрузке сети:
[....] Reconfiguring network interfaces...RTNETLINK answers: File exists
Failed to bring up eth1.
done.
При этом фактически eth1 встает (трафик через него идет). Чтобы избежать этого сообщения выполнял разные рекомендации (например ip addr flush dev eth1 перед поднятием), но сообщение все еще появляется, хотя, как я уже сказал, интерфейс числится поднятым в ifconfig, ip link говорит unknown, трафик ходит. Может это повлиять на то, что скрипт, указанный как up или post-up не отрабатывает?

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

Демон BIRD умеет работать с многими таблицами маршртизации и статику. Попробуйте настроить там.

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

Так должно работать, обрати внимание, что секция помечена manual тебе надо будет руками написать команды с тегами up и down: поднять линк, добавить IP адрес и тд.

auto eth1

iface eth1 inet manual
        up ip link set eth1 up # поднять линк                                
        up ip route add default via x.x.x.x table HH
        up ip rule add from x.x.x.y table HH
        down ip link set eth1 down
        down #...
Yur4eg ★★
()
Последнее исправление: Yur4eg (всего исправлений: 1)
Ответ на: комментарий от Yur4eg

Спасибо за ответы.
2 Tok BIRD это похоже на «по воробьям из пушки». Мне нужно сделать банальную вещь без таких усложнений жизни.
2 Yur4eg получил примерно вот что:

.........
auto eth1
iface eth1 inet manual
        up ip addr add x.x.x.y/28 dev eth1
        up ip link set eth1 up
        up ip route add default via x.x.x.x table HH
        up ip rule add from x.x.x.y table HH
        down ip link set eth1 down
При перезагрузке системы отрабатывает нормально, но если потом сделать service networking restart снова получаю сообщение
[....] Reconfiguring network interfaces...RTNETLINK answers: File exists
Failed to bring up eth1.
done.
И на этот раз eth1 действительно не поднимается и не поднимется пока вручную его не поднять: ifconfig eth1 up, но в таблице HH теперь пусто и маршрут в нее больше не добавляется. Я уже действительно думаю указать скрипт в rc.local, такие проблемы при задаче просто добавить маршрут в таблицу и одно правило - это какой-то бред. Почему ругается на eth1 при перезагрузке сети вообще не понятно, конфликта адресов нет, что еще может вызывать такое поведение о_О.

nokogerra
() автор топика

ЕМНИП, скриптам из ip-up.d/ при вызове передаются параметры, в том числе и имя интерфейса. Т.е., каким-то таким способом:

if [ $4 == eth0 ]; then
    ip route add ...
fi
можно добавлять маршруты только при поднятии правильного интерфейса.

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

All of these commands have access to the following environment variables.

IFACE physical name of the interface being processed

Т.е.,

if [ $IFACE == eth0 ]; then
    ip route add ...
fi

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

Спасибо за ответ. Без заключения в кавычки $IFACE и eth0 выдавало такое себе: /etc/network/if-up.d/scipt: line 3: [: ==: ожидается использование унарного оператора. После заключения в кавычки ошибок не выдает, но и результата тоже - таблица пустая, правило не добавляется. Похоже все эти способы не работают из-за сообщения об ошибке при перезагрузке сети о том, что eth1 не поднят, хотя по факту он поднят и работает. Видимо, нужно устранять эту проблему, однако как - без понятия. В syslog ничего подозрительного о eth1 нет.

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

Хм, проблема решилась просто: для обоих интерфейсов в /etc/network/interfaces были указаны шлюзы, пока не закомментировал шлюз для одного из них, указанная выше проблема имела место быть. Меня слегка удивило это поведение, ведь шлюз по умолчанию все же один. Спасибо всем за помощь, воспользовался последним способом, вид примерно такой:

#!/bin/bash

if [ $IFACE == eth1 ]; then
        ip rule del from x.x.x.y
        ip route add default via x.x.x.x table HH
        ip rule add from x.x.x.y table HH
fi

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

Хм, проблема решилась просто: для обоих интерфейсов в /etc/network/interfaces были указаны шлюзы, пока не закомментировал шлюз для одного из них, указанная выше проблема имела место быть.

А если бы ты привёл конфиг в начале темы - то это быстрее бы выловили...

P.S.: пометь тему, как решённую, имей совесть

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

Отметил. Я и подумать не мог, что указание шлюза для каждого интерфейса может повлечь такие проблемы. Есть шлюз по умолчанию и их не больше одного в каждой таблице, откуда ноги проблемы-то растут вообще. Вот пример обсуждения с такой же ошибкой После перезагрузки серва с Debian через раз поднимаются сетевые интерфейсы.. и никто не упомянул что указание шлюза для каждого интерфейса может привести к такой беде.

nokogerra
() автор топика

Вообще, по правильному так:

 pre-down ip ro del bla bla bla
 pre-down ip rule del bla bla
 post-up ip ro add bla bla
 post-up ip rule add bla bla

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