Как заставить ping и туннели отслеживать изменение адреса?

Обсуждение ПО и его настройки
achekalin
Сообщения: 40
Зарегистрирован: 12 сен 2012, 09:25

Наткнулся на странное поведение устройства Rb2011 под 6.13 (другие варианты железок и прошивки не пробовал, но ожидаю схожее поведение):

- в доменной зоне принадлежащего мне домена (скажем, domain.ru) прописываю запись host.domain.ru = 8.8.4.4 с TTL в 5 минут.
- на микротике, настроенном по минимуму (только IP, маршрут по умолчанию и ДНС-ы), делаю ping host.domain.ru, и вижу летящие на 8.8.4.4 пинги. Это логично.
- теперь, не прекращая пинг, меняю в ДНС запись для host.domain.ru на 8.8.8.8. Через несколько минут все хосты в мире уже "знают", что адрес host.domain.ru - 8.8.8.8. Все так и должно быть.
- смотрим в консоль микротика, и видим, что пинг там продолжается, но пингуется все еще старый хост, 8.8.4.4.
- останавливаем пинг, опять запускаем ping host.domain.ru - видим, что теперь пингование идет в сторону 8.8.8.8.

Точно такая же картина имеет место в случае, если мы поднимем туннель до какого-то хост, указав его имя - туннель поднимется, но при смене IP-адреса хоста устройство не сделает попытки переподключиться к новому IP удаленного хоста.

Вопрос: что делать, как заставить микротик в процессе работы туннеля хоть иногда проверять, в какой IP ресолвится указанное в настройках туннеля имя хоста, и сделать так, чтобы туннель всегда старался держаться с актуальным адресом IP?

Что любопытно, про ping наблюдаю картину: когда мы запускаем ping host.domain.ru, а host.domain.ru при этом равен 8.8.4.4, то пинг на 8.8.4.4 будет весело идти. Но после смены записи в ДНС на 8.8.8.8, и "протухания" старых данных в ДНС-кеше, если открыть на том же микротике еще одно окно терминала, и там написать ping host.domain.ru, то новый пинг уже побежит на 8.8.8.8 - тогда как в первом окне терминала пинг все еще идет на 8.8.4.4. С туннелями, подозреваю, будет то же - а как "подтолкнуть" систему перестартовать туннель при смене IP удаленного хоста?


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Ну вы же не собираетесь беспрерывно пинговать адрес? Мне попробовать не на чем, но думаю Вам несложно проверить будет такую выкладку. Команда типа

Код: Выделить всё

/ ping count=3 interface=ether12 host.domain.ru

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


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
achekalin
Сообщения: 40
Зарегистрирован: 12 сен 2012, 09:25

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

Меня больше волнуют туннели.

Скажем, есть у нас два openvpn-сервера, 1.1.1.1 и 2.2.2.2. Задачей будет держать с одним из них туннель, но, в случае проблем с туннелем, поднять его со вторым сервером. Логичным кажется в днс прописать

Код: Выделить всё

host.domain.ru IN A 1.1.1.1
, и в свойствах туннеля на микротике указать host.domain.ru. Поняли туннель, когда надо переключить - поправили запись днс на

Код: Выделить всё

host.domain.ru IN A 2.2.2.2
, дождались окончания TTL, и вот бы туннель сам бы "перепрыгнул" на 2.2.2.2. Ан нет, не хочет!

Что делать? Скриптовать?


Аватара пользователя
Dragon_Knight
Сообщения: 1724
Зарегистрирован: 26 мар 2012, 18:21
Откуда: МО, Мытищи
Контактная информация:

achekalin, у вас немного неправильное представление о работе таких утилит как Ping traceroute и так далее.
Все эти программы работают примерно по такому принципу: Если в качестве IP указан домен, то домен резолвиться в IP и после этого программа как-бы запускается с конкретный IP. Разумеется, всё выполнение идёт в теле одной программы и в рамках одного процесса, но суть такая: домен резолвиться ТОЛЬКО при запуске программы и после этого забывается.
Отсюда такой поведение, но оно и логично, ибо маршрутизация идёт не по доменам а по IP. Вообще понятие домена в протоколе интернета нету.


Небольшой свод правил логики и ссылок:
  1. Если устройство имеет Ethernet порт, то оно обязано быть подключено через него. Компьютер, Ноутбук, Телевизор, Принтер, Камера видеонаблюдения, и т.д.
  2. Если нет возможности протянуть кабель, то найдите её, или страдайте со своими проблемами Wi-Fi дальше.
  3. Wi-Fi это сеть для мобильных устройств. Если Вы подключили свой шикарный 50" телевизор не кабелем, то без фотоотчёта, когда он лежит у Вас в кармане дальнейшего разговора не получиться. Это относится и ко всем остальным устройствам.
  4. Если Ваше устройство вызывает вопросы в работе, первое что необходимо делать: NetInstall + дальнейшая настройка вручную.
  5. Не используйте WebFig или QuickSet - это пути к глюкам и ошибкам. Только SSH или WinBox, и да, - WinBox есть под Android.
  6. name.rsc - это текстовый файл, и Вы можете его открыть блокнотом.
  7. Если Вы хотите связаться со мной для ремонта или настройки, то: Telegram ( Не благотворительность ).
  8. Мой сайт по Mikrotik: Global Zone >> MikroTik.
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

To Dragon_Knight - хорошо сказал, ни убавить, ни прибавить :-)


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
achekalin
Сообщения: 40
Зарегистрирован: 12 сен 2012, 09:25

Dragon_Knight писал(а):achekalinдомен резолвиться ТОЛЬКО при запуске программы и после этого забывается.


Это я понял :) И тогда уже не "домен", а "имя хоста".

Но, как Вы наверное заметили, мой вопрос был не про пинг (пинг лишь пример), а про туннели - как мне сделать так, чтобы туннель хоть изредка проверял, на какой адрес он подключается?

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


Аватара пользователя
Dragon_Knight
Сообщения: 1724
Зарегистрирован: 26 мар 2012, 18:21
Откуда: МО, Мытищи
Контактная информация:

achekalin, туннель работает точно так-же как и вышеописанный команды. Резолвиться один раз при инициализации подключения. Если туннель упал значит его больше не существует и значит при следующей попытки подключиться будет заново резолвить домен.
Один момент, в версиях 5.xx если при настройке в качестве IP указать домен, то резолвинг происходил при сохранении настроек и сохранялся уже конкретный IP. Поведение в 6.xx нужно изучать.


Небольшой свод правил логики и ссылок:
  1. Если устройство имеет Ethernet порт, то оно обязано быть подключено через него. Компьютер, Ноутбук, Телевизор, Принтер, Камера видеонаблюдения, и т.д.
  2. Если нет возможности протянуть кабель, то найдите её, или страдайте со своими проблемами Wi-Fi дальше.
  3. Wi-Fi это сеть для мобильных устройств. Если Вы подключили свой шикарный 50" телевизор не кабелем, то без фотоотчёта, когда он лежит у Вас в кармане дальнейшего разговора не получиться. Это относится и ко всем остальным устройствам.
  4. Если Ваше устройство вызывает вопросы в работе, первое что необходимо делать: NetInstall + дальнейшая настройка вручную.
  5. Не используйте WebFig или QuickSet - это пути к глюкам и ошибкам. Только SSH или WinBox, и да, - WinBox есть под Android.
  6. name.rsc - это текстовый файл, и Вы можете его открыть блокнотом.
  7. Если Вы хотите связаться со мной для ремонта или настройки, то: Telegram ( Не благотворительность ).
  8. Мой сайт по Mikrotik: Global Zone >> MikroTik.
achekalin
Сообщения: 40
Зарегистрирован: 12 сен 2012, 09:25

Dragon_Knight писал(а):Один момент, в версиях 5.xx если при настройке в качестве IP указать домен, то резолвинг происходил при сохранении настроек и сохранялся уже конкретный IP. Поведение в 6.xx нужно изучать.

Немного не так: с версии 6.3 сервер можно указать в виде имени хоста для VPN по протоколам pptp, l2tp, sstp, с версии 6.4 - для ovpn. До 6.3 и 6.4 указание хостнейма вызывало (при настроенном на маршрутизаторе DNS-е (что, вообще говоря, не всегда делается) ресолвинг имен в момент нажатия кнопки сохранения настроек.

Вы взялись отвечать на вопрос про схему на базе прошивки 6.13, но в конце указали:
Dragon_Knight писал(а):Поведение в 6.xx нужно изучать.

Я правильно понимаю, что до этих слов все сказанное, вообще говоря, было ни о чем, а Вы ответили, толком не зная?

Очень жаль, методом проб я и сам могу сделать выводы, сюда же пришел к людям, разбирающимся в предмете, вдруг тема уже известна? Написать скрипт и повесить его раз в минуту проверять изменение записи в DNS - один из вариантов, но, повторюсь, хочется как-то без cron-а выкрутиться. Интересно, где-то это точно узнать можно?

В частности, тонкий момент:
Dragon_Knight писал(а):Если туннель упал значит его больше не существует и значит при следующей попытки подключиться будет заново резолвить домен.

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


wolf_ktl
Сообщения: 417
Зарегистрирован: 25 июн 2013, 18:12

Вот пример viewtopic.php?f=14&t=3986

Сейчас дорабатываю решение


achekalin
Сообщения: 40
Зарегистрирован: 12 сен 2012, 09:25

Я так обошелся:

Код: Выделить всё

:local oldip
:local newip
:local tunnelname
:local tunname
:local address

:foreach i in=[/interface ovpn-client find] do={
  :set tunnelname [/interface ovpn-client get $i name]
  :set tunname [:pick [/interface ovpn-client get $i name] 0 5]
  :if ($tunname = "ovpn-") do={
    :set address [/interface ovpn-client get $i connect-to]
    :set oldip [/interface ovpn-client get $i comment]
    :set newip [:resolve $address]
    :if ($newip != $oldip) do={
      /interface ovpn-client disable $i
      /interface ovpn-client set $i comment=$newip
      :log warning "Tunnel $tunnelname endpoint $address changed from $oldip to $newip";
      /interface ovpn-client enable $i
    }
  }
}


Просто OVPN-туннелей хватает, и проще в комментарии к туннелю хранить тот IP-адрес, в который ресолвился хост, указанный в свойствах туннеля, при прошлой проверке. Туннели, в названии которые в начале нет символов "ovpn-", не трогаем, так можно что-то защитить от обработки этим скриптом (мало ли понадобится). Кстати, disable/enable туннелю делать не обязательно, даже замена комментария заставляет его переподключиться (что было крайне удивительно), но я вставил строки про disable/enable, вдруг при обновлении прошивки изменение комментария перестанет передергивать туннель.


Ответить