nixp.ru v3.0

18 октября 2017,
среда,
10:34:16 MSK

DevOps с компанией «Флант»
kvs написал 21 декабря 2005 года в 18:20 (361 просмотр) Ведет себя неопределенно; открыл 1 тему в форуме, оставил 24 комментария на сайте.

Привет всем. Есть небольшая задача. Стоит шлюз, с тремя интерфейсами, два из них смотрят в ИНЕТ. Надо переодически просерять (пинговать) ДНС сервер провайдера, и если он пропал, перенастроить свой локальный ДНС сервер на ДНС сервер другого провайдера. Что взять за основу, в какую сторону смотреть. Все что писалось мною, так все под форточки на Delphi, и базы.

Longobard

я бы написал на shell

Code Monkey

а я бы настроил resolv.conf

myst

Согласен. resolv.conf покошернее будет.

kvs
LONGOBARD
я бы написал на shell

Может есть сылочка или книгу какую скачать, подскажи, как говорится, нужен первоначальный толчок. Все не так просто, resolv.conf не пойдет, мой ДНС сервер настроен как кэширующий и в resolv.conf всего несколько строк. Но самое неприятное то, все локальные сервисы ломятся в Инет через шлюз по умолчанию, а не по той таблице маршрутизацию, которую я укажу.

Genie

а ещё лучше поставить локально кеширующий DNS-сервер и настроить правильно у него forwarders

зачем писать скрипт, который будет работать непонятно как, если есть готовая программа, которая ещё и трафик позволит экономить немного? ;)

а ещё есть параметр bind у сервера — для того, чтобы он цеплялся к нужному порту.

и, соответственно, исходящие пакеты былы с этого интерфейсного адреса…

кроме того, скажем, при использовании pppd можно указать дополнительно скрипт для переключения — смотри документацию к оному.

ну и т.д.

комбинировать можно, скажем, с iptables — для того, чтобы пакеты от процессас именемnamed выходили в определённую сторону (видимо, в *mangle или *filter можно это поправлять, см, скажем, -j ROUTE)

kvs
Genie
а ещё лучше поставить локально кеширующий DNS-сервер и настроить правильно у него forwarders

зачем писать скрипт, который будет работать непонятно как, если есть готовая программа, которая ещё и трафик позволит экономить немного? ;)

а ещё есть параметр bind у сервера — для того, чтобы он цеплялся к нужному порту.

и, соответственно, исходящие пакеты былы с этого интерфейсного адреса…

кроме того, скажем, при использовании pppd можно указать дополнительно скрипт для переключения — смотри документацию к оному.

ну и т.д.

комбинировать можно, скажем, с iptables — для того, чтобы пакеты от процессас именемnamed выходили в определённую сторону (видимо, в *mangle или *filter можно это поправлять, см, скажем, -j ROUTE)

1. два интерфейса eth1, eth2 смотрят в Инет к разным провайдерам.

2. С помощью iptables ничего не получиться, можете не пытаться. named смотрит в ту сторону, где шлюз по умолчанию, а не через те таблицы маршрутизации кот я настроил.

3. forwardes настроен правильно, и работает не один день.

Весь прикол в том, что в нормальных рабочих условия, ДНС сервер обращается к ДНС серверу провайдера «А». При этом должен работать ДЕМОН, кот пингует (проверяет) ДНС сервер провайдера «А». Как только пропал ДНС сервер провайдера «А», торможу named перестраиваю forwardes, таблицу маршрутизации, и взлетает named. После этого мой днс сервер уже должен обращаться к ДНС серверам провайдера «Б». т.е. попросту, проверка пропадания конекта с провайдерами. Никакого pppOe нет. Вот мне и хочется сваять ДЕМОН кот проверяет наличие в сети ДНС сервера провайдеров.

myst

бля. В resolv.conf можно прописать 3 (три) DNS сервера: основной и 2 вспомогательных. Если основной в отлупе, то будет использоваться вспомогательный. В чём проблема? Короче man resolv.conf и не пей людям мозг.

Genie

на кой ляд демон-то этот нужен?

сам named умеет работать как тебе хочется

т.е. если обраения к одному из forwarders неудачны, обращается к следующему..

и лишь потом пробует корневые сервера..

kvs
myst
бля. В resolv.conf можно прописать 3 (три) DNS сервера: основной и 2 вспомогательных. Если основной в отлупе, то будет использоваться вспомогательный. В чём проблема? Короче man resolv.conf и не пей людям мозг.

У кого из желающих есть возможность (или уже есть) поднять два интерфейса, смотрящих в ИНЕТ и один в локалку. Запустите iptraf и посмотрите по интерфейсам, через какой интерфейис он обращается к ДНС серверам. А теперь вытащите сетевой кабель из этого интерфейса и посмотрите что с вашим ДНС сервером. Посмотрите, может он начал обращаться к ДНС серверам через другой интерфейс???. Увы. Ну так вот, есть два интерфейса eth1  eth2, и у каждого есть шлюз, и есть default шлюз — и который  является шлюзом для одного интерфейса (скажем eth1). И вот попробуйте заставить  named обращаться к ДНС  серверам через eth2.

Желающие пообщаться поближе стучите в аську.

Genie

ну если уж сложно при падении интерфейса переключить default route, то тут, дааа.. тяяжко.

вообще, смотри тогда на ospf, к примеру, в реализации gated или zebra.

будет тебе динамическое изменение маршрута для пакетов…

можешь ещё на «query-source address * port *;» поглядеть в документации, что, собственно, и предлагалось ранее.

kvs
Genie
ну если уж сложно при падении интерфейса переключить default route, то тут, дааа.. тяяжко.

вообще, смотри тогда на ospf, к примеру, в реализации gated или zebra.

будет тебе динамическое изменение маршрута для пакетов…

можешь ещё на «query-source address * port *;» поглядеть в документации, что, собственно, и предлагалось ранее.

прочитайте плз первый пост. Все это не трудно ручками делать. только вот нужна реализация (хочу написать ) демона кот проверяет….. см. 1 пост

eudaemon

Именно демона ? Вызов по крону не устроит ?

kvs
eudaemon
Именно демона ? Вызов по крону не устроит ?

да все равно демон или нет. По крону даже лучше будет

eudaemon

Тогда остается написать скрипт на шелле, проверяющий дефолтроутовый канал, если упал — переключиться.

А ОС какая ?

kvs
eudaemon
Тогда остается написать скрипт на шелле,  проверяющий дефолтроутовый канал, если упал — переключиться.

А ОС какая ?

ASPLinux 10

В том-то и дело, что или я мало что нашел из доки по шеллу, или….

Genie

эххх….

#!/bin/bash
eth=0
gw0=шлюз_основного_прова
gw1=шлюз_второго_прова
while true
do
  #что с текущим шлюзом?
  gw=gw$eth
  if ping -c1 ${!gw} >/dev/null 2>&1
  #ааа. жив...
  then
    #подождём твою ма... 5 сек
    sleep 5
  #ой.. а если помер?
  else
    #меняем рабочий шлюз
    let eth=1-eth
    #переключаем маршрут
    #...
  fi
done

ну, это так, наколеночное..

ps: внимание! используется bash-изм ${!var}

decvar

зря

Genie

а там не совсем, что надо.. :)

да и только для bash. :)

захочет — разберётся, man bash ещё никто не отменял.

kvs
Genie
эххх….

#!/bin/bash
eth=0
gw0=шлюз_основного_прова
gw1=шлюз_второго_прова
while true
do
  #что с текущим шлюзом?
  gw=gw$eth
  if ping -c1 ${!gw} >/dev/null 2>&1
  #ааа. жив...
  then
    #подождём твою ма... 5 сек
    sleep 5
  #ой.. а если помер?
  else
    #меняем рабочий шлюз
    let eth=1-eth
    #переключаем маршрут
    #...
  fi
done

ну, это так, наколеночное..

ps: внимание! используется bash-изм ${!var}

СПСб добрый человек. Подход и принцип ясен. Немного мзменил и подправил. Протестрию под себя скрипт и выложу здесь, если кому надо.

kvs

#!/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/еще добавил скрипт кот проверяет каждый час какой шлюз по умолчанию, и если не основной, пытаемся востановить.

metal

А ты проверял этот скрипт? Bash не особо знаю, но вот такая конструкция[ $? = 0 ]; в 4-й строке вроде бы проверяет успешность выполнения последней операции, а она у тебя всегда успешна. Если я заблуждаюсь, то хотелось бы понять почему.

kvs
metal
А ты проверял этот скрипт? Bash не особо знаю, но вот такая конструкция[ $? = 0 ]; в 4-й строке вроде бы проверяет успешность выполнения последней операции, а она у тебя всегда успешна. Если я заблуждаюсь, то хотелось бы понять почему.

Вторые сутки работает, вроде норма, выдергивал сетку из интерфейсов, все норма, меняет, востанавливает.