kvs
написал 21 декабря 2005 года в 18:20 (796 просмотров)
Ведет себя
неопределенно; открыл 1 тему в форуме, оставил 24 комментария на сайте.
Привет всем. Есть небольшая задача. Стоит шлюз, с тремя интерфейсами, два из них смотрят в ИНЕТ. Надо переодически просерять (пинговать) ДНС сервер провайдера, и если он пропал, перенастроить свой локальный ДНС сервер на ДНС сервер другого провайдера. Что взять за основу, в какую сторону смотреть. Все что писалось мною, так все под форточки на Delphi, и базы.
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
я бы написал на shell
а я бы настроил resolv.conf
Согласен. resolv.conf покошернее будет.
Может есть сылочка или книгу какую скачать, подскажи, как говорится, нужен первоначальный толчок. Все не так просто, resolv.conf не пойдет, мой ДНС сервер настроен как кэширующий и в resolv.conf всего несколько строк. Но самое неприятное то, все локальные сервисы ломятся в Инет через шлюз по умолчанию, а не по той таблице маршрутизацию, которую я укажу.
а ещё лучше поставить локально кеширующий DNS-сервер и настроить правильно у него forwarders
зачем писать скрипт, который будет работать непонятно как, если есть готовая программа, которая ещё и трафик позволит экономить немного? ;)
а ещё есть параметр bind у сервера — для того, чтобы он цеплялся к нужному порту.
и, соответственно, исходящие пакеты былы с этого интерфейсного адреса…
кроме того, скажем, при использовании pppd можно указать дополнительно скрипт для переключения — смотри документацию к оному.
ну и т.д.
комбинировать можно, скажем, с iptables — для того, чтобы пакеты от процессас именемnamed выходили в определённую сторону (видимо, в *mangle или *filter можно это поправлять, см, скажем, -j ROUTE)
1. два интерфейса eth1, eth2 смотрят в Инет к разным провайдерам.
2. С помощью iptables ничего не получиться, можете не пытаться. named смотрит в ту сторону, где шлюз по умолчанию, а не через те таблицы маршрутизации кот я настроил.
3. forwardes настроен правильно, и работает не один день.
Весь прикол в том, что в нормальных рабочих условия, ДНС сервер обращается к ДНС серверу провайдера «А». При этом должен работать ДЕМОН, кот пингует (проверяет) ДНС сервер провайдера «А». Как только пропал ДНС сервер провайдера «А», торможу named перестраиваю forwardes, таблицу маршрутизации, и взлетает named. После этого мой днс сервер уже должен обращаться к ДНС серверам провайдера «Б». т.е. попросту, проверка пропадания конекта с провайдерами. Никакого pppOe нет. Вот мне и хочется сваять ДЕМОН кот проверяет наличие в сети ДНС сервера провайдеров.
бля. В resolv.conf можно прописать 3 (три) DNS сервера: основной и 2 вспомогательных. Если основной в отлупе, то будет использоваться вспомогательный. В чём проблема? Короче man resolv.conf и не пей людям мозг.
на кой ляд демон-то этот нужен?
сам named умеет работать как тебе хочется
т.е. если обраения к одному из forwarders неудачны, обращается к следующему..
и лишь потом пробует корневые сервера..
У кого из желающих есть возможность (или уже есть) поднять два интерфейса, смотрящих в ИНЕТ и один в локалку. Запустите iptraf и посмотрите по интерфейсам, через какой интерфейис он обращается к ДНС серверам. А теперь вытащите сетевой кабель из этого интерфейса и посмотрите что с вашим ДНС сервером. Посмотрите, может он начал обращаться к ДНС серверам через другой интерфейс???. Увы. Ну так вот, есть два интерфейса eth1 eth2, и у каждого есть шлюз, и есть default шлюз — и который является шлюзом для одного интерфейса (скажем eth1). И вот попробуйте заставить named обращаться к ДНС серверам через eth2.
Желающие пообщаться поближе стучите в аську.
ну если уж сложно при падении интерфейса переключить default route, то тут, дааа.. тяяжко.
вообще, смотри тогда на ospf, к примеру, в реализации gated или zebra.
будет тебе динамическое изменение маршрута для пакетов…
можешь ещё на «query-source address * port *;» поглядеть в документации, что, собственно, и предлагалось ранее.
прочитайте плз первый пост. Все это не трудно ручками делать. только вот нужна реализация (хочу написать ) демона кот проверяет….. см. 1 пост
Именно демона ? Вызов по крону не устроит ?
да все равно демон или нет. По крону даже лучше будет
Тогда остается написать скрипт на шелле, проверяющий дефолтроутовый канал, если упал — переключиться.
А ОС какая ?
ASPLinux 10
В том-то и дело, что или я мало что нашел из доки по шеллу, или….
эххх….
ну, это так, наколеночное..
ps: внимание! используется bash-изм ${!var}
зря
а там не совсем, что надо.. :)
да и только для bash. :)
захочет — разберётся, man bash ещё никто не отменял.
СПСб добрый человек. Подход и принцип ясен. Немного мзменил и подправил. Протестрию под себя скрипт и выложу здесь, если кому надо.
#!/bin/bash
#
ip route ls | grep 'default via a.a.a.1 dev eth1\′ &> /dev/null
if [ $? = 0 ]; then
eh=1
#основной шлюз
else
eh=0
#доп шлюз
fi
host1=a.a.a.X
host0=b.b.b.Y
gtw1=a.a.a.1
gtw0=b.b.b.b
host=host$eh
gtw=gtw$eh
echo «`date` Шлюз по умолчанию ${!gtw}, пингуем хост ${!host} » >> pinghost.log
ping -c 2 ${!host} | grep '100% packet loss' &> /dev/null
if [ $? = 0 ]; then
echo «`date` Хост ${!host} через интерфейс eth$eh не пингуется. Меняем шлюз.» >> pinghost.log
let eh=1-eh
gtw=gtw$eh
ip route del default
ip route add default dev eth${eh} via ${!gtw}
else
echo «`date` Хост ${!host} в сети. Интерфейс eth$eh, шлюз ${!gtw}» >> pinghost.log
fi
Вот что получилось. Ногами не питать, типа можно лучше и т.д. Лучше поделитель литературой или ссылочкой по Shell.
Спсб всем.
PS/еще добавил скрипт кот проверяет каждый час какой шлюз по умолчанию, и если не основной, пытаемся востановить.
А ты проверял этот скрипт? Bash не особо знаю, но вот такая конструкция[ $? = 0 ]; в 4-й строке вроде бы проверяет успешность выполнения последней операции, а она у тебя всегда успешна. Если я заблуждаюсь, то хотелось бы понять почему.
Вторые сутки работает, вроде норма, выдергивал сетку из интерфейсов, все норма, меняет, востанавливает.