Задать вопрос

Ubuntu 10.10 bash-cкрипт, содержащий правила для NAT?

Здравствуйте.


По мотивам полезнейшего топика настроил себе параллельно (с балансировкой) пару PPPoE-соединений с двумя местными провайдерами.


Автор топика предложил два скрипта: первый для задания маршрутов и маскарадинга (NAT для раздачи интернета остальным локальным компам), второй — для проверки соединения пингами то по одному, то по другому интерфейсу и, соответствующему, (пере)заданию шлюзов (в зависимости от прохождения пингов включается шлюз первого провайдера, второго или обоих сразу с балансировкой). Второй скрипт в самом своём начале просто вызывает первый. Сами скрипты целиком можно посмотреть в том топике.


Всё прекрасно получилось. Работают доступные каналы, интернет раздаётся в локалку.


Но идиллия продолжалась пока я ручками в консоли запускал: # /etc/balance/check.sh


А странности начались после вполне естественного шага. Чтобы всё поднималось само после ребута, я добавил в crontab для рута:
@reboot /etc/balance/check.sh


После загрузки системы проверяю и вижу:
# ps ax | grep che<br/>
 1261 ? Ss 0:00 /bin/sh -c /etc/balance/check.sh<br/>
 1262 ? S 0:00 /bin/bash /etc/balance/check.sh



То есть скрипт как бы запустился.


И интернет на самой машине есть (и на ppp1, и на ppp2 — всё хорошо), но на eth0 (в локалку) — он не раздаётся.


При этом, стоит мне сделать снова руками в консоли то, что, казалось бы, уже сделал cron:
# /etc/balance/check.sh


И я сначала вижу такое сообщение:
RTNETLINK answers: File exists


А дальше начинается уже вывод скрипта («Both channels» и пр.) и, что самое главное, на eth0 появляется интернет.


Предположил, что скрипт выполняется слишком «рано» (например, маскарадить ещё нечего в момент его выполнения), поставил такое в кронтабе:
5 23 * * * /etc/balance/check.sh


И перезапустил машину почти ровно в 23 часа. Вывод перенаправил в файл. Глянул в 23:10 — в лог скрипт писать начал вовремя, т.е. запустился скрипт своевременно, но интернет не раздаётся. После запуска руками в консоли — всё снова ок.


Подскажите, пожалуйста, в чём магия?


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


Спасибо.


P.S. Публикую этот вопрос в придачу к коменту в топике, поскольку автор топика на Хабре пару дней не появлялся (а уведомление о новом коменте верхнего уровне приходит только автору).


P.P.S. Я задал этот вопрос на Хабре, а не на каком-нибудь форуме, потому что ценный в моей ситуации мануал я тоже нашёл только на Хабре, а не на каком-нибудь форуме.
  • Вопрос задан
  • 3305 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
peter23
@peter23
Пропишите полный путь ко всем используемым бинарникам: /sbin/ip, /sbin/iptables и т.д.
cron, выполняя команды, не передает переменную среды PATH или передает ее урезанную, не содержащую /sbin/.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@odmin4eg
В крон запуск скрипта сделайте через sudo

sudo /etc/balance/check.sh

прямо вот так в крон
Ответ написан
sevka_fedoroff
@sevka_fedoroff
Попробуйте еще strerr куда-то перенаправить. По идее, если в крон-скрите возникнет ошибка, и сообщение некуда будет вывести, то скрипт остановится. stderr перенаправляется командой 2>, например:
check.sh >/dev/null 2>/dev/null
Ответ написан
Veshij
@Veshij
Дело может быть в том, что в момент выполнения скрипта у вас еще может не быть сети на машине.
Для дебага поставьте в шабанге !/bin/sh -x и перенаправьте вывод в лог, как посоветовал товарищ выше.
Если оправдается — запускать скрипт инит-скриптом после networking.
Ответ написан
kostin
@kostin Автор вопроса
Итак.

Надо либо добавлять sudo перед вызовом скрипта из кронтаба.

Либо прописывать абсолютные пути /sbin/ip и /sbin/iptables в скриптах.

Потому что переменная окружения PATH, похоже, не передаёт при запуске крона /sbin.

Огромное спасибо всем, кто помог здесь решить проблему.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы