Форвард зоны на другой сервер, ждали, ждали и дождались
В логах беты версии 6.47 увидел что есть изменения в работе DNS сервера на MikroTik.
Ну что-же интересно, необходимо проверить, работу и посмотреть что к чему.
Решил не использовать GNS, а взял с полки специально для тестов HAP ac2 и естественно обновил на последнюю beta версию.
IP адрес маршрутизатора с бета версией 172.20.17.100
Естественно по наитию пошли смотреть в /ip dns static
И видим нововведения, ну что же надо разобраться и проверить.
Не только A но и другие типы записей.
Раньше нем было доступно только A и AAAA записи для IPv4 и соответственно IPv6, как видим сейчас стало значительно больше.
Ну что-же давайте проверим все эти записи.
Проверять мы будет работу с помощью nsloopkup .
CNAME
Тип ссылки, когда мы говорим, что для данной записи ищи значение в другой записи.
Записи MX необходимы для корректной работы, а точнее поиска сервера для получения почты по протоколу SMTP.
Создадим две записи для вымышленного домена, с разными весами.
Когда вам надо сообщить, что за конкретное доменное имя отвечает другой сервер, вы должны использовать запись типа NS.
Вы можете сохранять произвольное значение, частно используется для того чтобы проходить валидация SPF для перечисления записей разрешённых хостов для отправки почты. Также при использовании DKIM подписи.
И ещё мы написали программку knockme которая также может использовать TXT для получения параметров knock-a.
Многие сервисы могут использовать для автоматического получения списка серверов например SIP, XMPP, LDAP и прочее.
Ну что же вроде всё работает.
И самая долгожданная штука это так называемый SPLIT DNS.
MikroTik Split DNS
Для начало, для чего он нужен.
Данный режим ещё называется forward zone
Представим себе ваш MikroTik выступает в роли маршрутизатора удалённого филиала. На нём поднимается VPN до центрального филиала прописываются маршруты и прочее. У вас доменная авторизация все компьютеры в домене, естественно хорошей практикой на компьютерах прописать DNS сервера который обслуживают Active Directory службы. Но в таком случае если туннель по какой-то причине упадёт ваш филиал останется без интернета, а ведь интернета может не быть в центральном филиале. Да перестанут работать различные шары и прочее, конечно для этих целей существует как минимум RODC, но навсегда есть возможность установить подобный сервис в филиале ввиду множества различных проблем.
Представим что наш dns suffix равен mycom.loc
Соответственно, а что если мы на компьютерах припишем DNS сервер адрес MikroTik, а на MikroTik укажем, что если запрос содержит mycom.loc то перенаправлять такие запросы на сервера DNS AD, а все остальные запросы перенаправлять допустим на 8.8.8.8.
Установим на MikroTik сервер DNS 8.8.8.8
и настроим forwarding зоны
Обратите внимания что мы используем регулярное вырожение.
Давайте проверим. Я решил взять реальный прод, поэтому DNS суффикс скрыл, не переживайте всё по подобию.
И так в скриншотах, с замазанным суффиксом.
И немного логов.
Настоятельно рекомендую пока данный функционал не использовать в проде, так как это всё ещё бета версия.
Manual:IP/DNS
Applies to RouterOS: v4.6
DNS cache is used to minimize DNS requests to an external DNS server as well as to minimize DNS resolution time. This is a simple DNS cache with local items.
Contents
- 1 Specifications
- 2 Description
- 3 DNS Cache Setup
- 3.1 Properties
- 3.2 Example
- 4 Cache Monitoring
- 4.1 Description
- 4.2 Property Description
- 5 All DNS Entries
- 5.1 Description
- 5.2 Property Description
- 6 Static DNS Entries
- 6.1 Description
- 6.2 Property Description
- 6.3 Notes
- 7 Flushing DNS cache
- 7.1 Command Description
- 7.2 Example
- 8 DNS over HTTPS
- 8.1 Example
- 9 See Also
Specifications
- Packages required: system
- License required: Level1
- Submenu level: /ip dns
- Standards and Technologies: DNS
- Hardware usage: Not significant
Description
A MikroTik router with DNS feature enabled can be set as a DNS server for any DNS-compliant client. Moreover, MikroTik router can be specified as a primary DNS server under its dhcp-server settings. When the remote requests are enabled, the MikroTik router responds to TCP and UDP DNS requests on port 53.
DNS Cache Setup
Sub-menu: /ip dns
DNS facility is used to provide domain name resolution for router itself as well as for the clients connected to it.
Properties
Property | Description |
---|---|
allow-remote-requests (yes | no; Default: no) | Specifies whether to allow network requests |
cache-max-ttl (time; Default: 1w) | Maximum time-to-live for cache records. In other words, cache records will expire unconditionally after cache-max-ttl time. Shorter TTL received from DNS servers are respected. |
cache-size (integer[64..4294967295]; Default: 2048) | Specifies the size of DNS cache in KiB |
max-concurrent-queries (integer; Default: 100) | Specifies how much concurrent queries are allowed |
max-concurrent-tcp-sessions (integer; Default: 20) | Specifies how much concurrent TCP sessions are allowed |
max-udp-packet-size (integer [50..65507]; Default: 4096) | Maximum size of allowed UDP packet. |
query-server-timeout (time; Default: 2s) | Specifies how long to wait for query response from one server |
query-total-timeout (time; Default: 10s) | Specifies how long to wait for query response in total. Note that this setting must be configured taking into account query-server-timeout and number of used DNS server. |
servers (list of IPv4/IPv6 addresses; Default: ) | List of DNS server IPv4/IPv6 addresses |
Property | Description |
---|---|
cache-used (integer) | Shows the currently used cache size in KiB |
dynamic-server (IPv4/IPv6 list) | List of dynamically added DNS server from different services, for example, DHCP. |
When both static and dynamic servers are set, static server entries are more preferred, however it does not indicate that static server will always be used (for example, previously query was received from dynamic server, but static was added later, then dynamic entry will be preferred).
Note: If allow-remote-requests is used make sure that you limit access to your server over TCP and UDP protocol.
Example
To set 159.148.60.2 as the primary DNS server and allow the router to be used as a DNS server, do the following:
Cache Monitoring
- Submenu level: /ip dns cache
Description
This menu provides a list with all address (DNS type «A») records stored on the server
Property Description
Property | Desciption |
---|---|
address (read-only: IP address) | IP address of the host |
name (read-only: name) | DNS name of the host |
ttl (read-only: time) | remaining time-to-live for the record |
All DNS Entries
- Submenu level: /ip dns cache all
Description
This menu provides a complete list with all DNS records stored on the server
Property Description
Property | Desciption |
---|---|
data (read-only: text) | DNS data field. IP address for type «A» records. Other record types may have different contents of the data field (like hostname or arbitrary text) |
name (read-only: name) | DNS name of the host |
ttl (read-only: time) | remaining time-to-live for the record |
type (read-only: text) | DNS record type |
Static DNS Entries
- Submenu level: /ip dns static
Description
The MikroTik RouterOS has an embedded DNS server feature in DNS cache. It allows you to link the particular domain names with the respective IP addresses and advertize these links to the DNS clients using the router as their DNS server. This feature can also be used to provide fake DNS information to your network clients. For example, resolving any DNS request for a certain set of domains (or for the whole Internet) to your own page.
The server is capable of resolving DNS requests based on POSIX basic regular expressions, so that multiple requets can be matched with the same entry. In case an entry does not conform with DNS naming standards, it is considered a regular expression and marked with ‘R’ flag. The list is ordered and is checked from top to bottom. Regular expressions are checked first, then the plain records.
Property Description
Property | Desciption |
---|---|
address (IP address) | IP address to resolve domain name with |
name (text) | DNS name to be resolved to a given IP address. |
regex (text) | DNS regex |
ttl (time) | time-to-live of the DNS record |
type (time) | type of the DNS record. Available values are: A, AAAA, CNAME, FWD, MX, NS, NXDOMAIN, SRV, TXT |
Notes
Reverse DNS lookup (Address to Name) of the regular expression entries is not possible. You can, however, add an additional plain record with the same IP address and specify some name for it.
Remember that the meaning of a dot (.) in regular expressions is any character, so the expression should be escaped properly. For example, if you need to match anything within example.com domain but not all the domains that just end with example.com, like www.another-example.com, use regexp=».*\.example\.com»
Regular expression matching is significantly slower than of the plain entries, so it is advised to minimize the number of regular expression rules and optimize the expressions themselves. Example
To add a static DNS entry for www.example.com to be resolved to 10.0.0.1 IP address:
It is also possible to forward specific DNS requests to a different server using FWD type. This will fordward all subdomains of «example.com» to server 10.0.0.1:
Flushing DNS cache
- Command name: /ip dns cache flush
Command Description
Command | Desciption |
---|---|
flush | clears internal DNS cache |
Example
DNS over HTTPS
Starting from RouterOS version v6.47 it is possible to use DNS over HTTPS (DoH). DoH uses HTTPS protocol to send and receive DNS requests for better data integrity. Its main goal is to provide privacy by eliminating the man in the middle attacks (MITM). Currently DoH is not compatible with FWD type static entries, in order to utilize FWD entries, DoH must not be configured.
Example
It is advised to import the root CA certificate of the DoH server you have choosen to use for increased security.
Warning: We strongly suggest to not use third party download links for certificate fetching. Use the Certificate Authority own website.
There are various ways to find out what root CA certificate is necessary. The easiest way is by using your WEB browser, navigating to the DoH site and checking the websites security. Using Firefox we can see that DigiCert Global Root CA is used by CloudFlare DoH server. You can download the certificate straight from the browser or navigate to DigiCert website and fetch the certificate from a trusted source.
Download the certificate and import it:
Configure the DoH server:
Note that you need at least one regular DNS server configured for the router to resolve the DoH hostname itself. If you do not have any dynamical or static DNS server configured, configure it like this:
Mikrotik split-dns: они это сделали
Не прошло и 10 лет, как разработчики RoS (в stable 6.47) добавили функционал, который позволяет перенаправить DNS запросы в соответствии со специальными правилами. Если раньше надо было изворачиваться с Layer-7 правилами в firewall, то теперь это делается просто и изящно:
Моему счастью нет предела!
Чем это нам грозит?
Как минимум, мы избавляемся от странных конструкций с NAT наподобие этой:
И это не все, теперь можно прописать несколько серверов пересылки, что поможет сделать dns failover.
Интелектуальная обработка DNS даст возможность начать внедрение ipv6 в сеть компании. До этого я этого не делал, причина в том, что мне нужно было разрешать ряд dns имен в локальные адреса, а в ipv6 это было не сделать без довольно больших костылей.
Редакторский дайджест
Присылаем лучшие статьи раз в месяц
Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.
- Скопировать ссылку
- ВКонтакте
- Telegram
Похожие публикации
- 7 мая 2020 в 19:35
Робот-попрошайка на ROS и нейросетках
Mikrotik firewall filter: скрипт генерирующий основу для политики фильтрации
Mikrotik: небольшие полезности. Часть 1
Курсы
AdBlock похитил этот баннер, но баннеры не зубы — отрастут
Комментарии 53
Я в целом положительно отношусь к микротикам, просто хотел отметить, что это не единственное решение описанной проблемы, можно было и раньше, и при сравнимом бюджете. И вообще хорошо, когда вариантов больше одного.
А вообще, когда у вас есть внутренние ресурсы в филиале, но нет ни одного сервера — тут что-то не сходится, вспоминаю про трусы и крестик. Разве что камера какая-нибудь или принтер, но это на большинстве роутеров прикручивается через LAN DNS функцию, даже с динамическим внутренним IP.
Заруливать DNS в туннель до головного офиса — совсем не лучшая затея.
А вы считаете, что нагружать софтроутер разборами ДНС запросов затея получше? Кроме того, если у меня 500 таких филиалов, то каждый филиал- это отдельная точка для настройки?
А расскажите подробней — для чего это надо?
С текущей стабильной, хотя эту функцию можно было попробовать и в testing.
!) dns — added client side support for DNS over HTTPS (DoH) (RFC8484);
Что-то у меня с настроенным DoH пересылка запросов не пошла. А то что вы привели в качестве пруфа, говорит о том, что DoH в принципе теперь поддерживается.
*) ike2 — added support for RFC8598;
Маленький вопрос по переопределению определённых имён в рамках перенаправляемых доменов.
Допустим, у нас есть домен «*.test1.localdomain», который мы перенаправляем на forward-to=192.168.88.3. Но есть одно имя из этого домена exception.test1.localdomain, IP-адрес которого необходимо переопределить на 127.0.0.1, к примеру, используя static dns на MikroTik’е.
Вопрос 1. Какая очерёдность резолвинга? Перебьёт ли static этот forward-to? В случае с layer7 не перебивало, т.к. запрос на 53-й порт (подходящий под условия) форвардился на другой DNS и до DNS-сервера MikroTik’а запрос не долетал.
Вопрос 2. Кто хорошо умеет в регекспы, подскажите, как можно добавить исключение в regexp=».*.test1.localdomain», чтобы под этот regexp попадал весь домен включая поддомены, за исключением имени exception.test1.localdomain?
Попытался поэкспериментировать, но у меня не вышло сделать подобное, увы.
1. По моим ощущениям, сначала разрешаются правила с регулярками, а затем – чисто статические. Документация, кстати, говорит, что это так:
The server is capable of resolving DNS requests based on POSIX basic regular expressions so that multiple requests can be matched with the same entry. In case an entry does not conform with DNS naming standards, it is considered a regular expression and marked with an ‘R’ flag. The list is ordered and is checked from top to bottom. Regular expressions are checked first, then the plain records.
А, понятно. У меня просто надо всем, кроме одного домена, назначить A-запись. Наверное, я использую не тот инструмент, но он работает. 🙂
Другой вопрос, какая должна быть регулярка, чтобы исключить два или более разных поддоменов. Но, здесь, наверное, надо уже настраивать зоны в bind9, как это сказали в самой первой ветке комментов.
мне кажется проще всего в две записи:
первая отработает — вторая уже не будет.
под первую не попадёт — отфорвардит
Не уложился в 30-минутный лимит редактирования коммента. :/
UPD: Документация немного устарела, похоже. По крайней мере, работают не только POSIX BRE, но и ERE. Хотя я сначала так и думал. 😀
И проблема с регекспами решилась достаточно просто: надо было добавить ^ в начало. Почему-то регулярка срабатывает, даже если часть домена попадает под неё. Мне сложно придумать подобную ситуацию без натягивания совы, но лучше иметь гибкость, чем не иметь её, когда она нужна.
В абстрактном случае работает ^([^t]+|t[^e]+|te[^s]+|tes[^t]+|test.+).example.com$ ,
а в вашем – что-то вроде ^([^e]+|e[^x]+|ex[^c]+|exc[^e]+|exce[^p]+|excep[^t]+|except[^i]+|excepti[^o]+|exceptio[^n]+|exception.+).test1.localdomain$ , хотя это и нечитаемо.
Подскажите пожалуйста, я ранее пользовался связкой Layer7+mangle(mark connections)+NAT
У меня все работало (условная пересылка DNS запросов).
Попробовал реализовать через DNS static — не получается
Домен: home.local
Прописываю следующее
/ip dns static
add forward-to=192.168.2.2 regexp=».*\.home\.local» type=FWD
но DNS сервер микротика не разрешает данный префикс FQDN серверов
Что я делаю не так, подскажите пожалуйста.
Справочная информация
про свой опыт решения некоторых проблем и использования ряда возможностей ОС и приложений
понедельник, 2 января 2017 г.
Автоматическая регистрация имён хостов в DNS на MikroTik
Данная задача является узкоспециализированной и может возникнуть для сетей, в которых имеется необходимость автоматического внесения адресов хостов в DNS MikroTik, IP-адреса которых соответствуют полученным от DHCP сервера MikroTik. В доменах Microsoft Windows такое действие осуществляется автоматически и, наверное, эти лавры славы долгое время не давали покоя.
Решение данной задачи возможна двумя способами. Первый из них заключается в запуске определённого скрипта с указанной периодичностью, а второй – по команде самого сервера DHCP MikroTik.
Автоматическая регистрация имён хостов в DNS на MikroTik по команде планировщика
Перейдите в System – Scripts и в поле «Source» впишите текст скрипта:
:local topdomain;
:set topdomain «vot»;
:local ttl;
:set ttl «00:14:29»;
:local hostname;
:local hostip;
:local free;
/ip dns static;
:foreach a in=[find] do= <
:if ([get $a ttl] = $ttl) do= <
:put («Removing: » . [get $a name] . » : » . [get $a address]);
remove $a;
>
>
/ip dhcp-server lease ;
:foreach i in=[find] do= <
/ip dhcp-server lease ;
:if ([:len [get $i host-name]] > 0) do= <
:set free «true»;
:set hostname ([get $i host-name] . «.» . $topdomain);
:set hostip [get $i address];
/ip dns static ;
:foreach di in [find] do= <
:if ([get $di name] = $hostname) do= <
:set free «false»;
:put («Not adding already existing entry: » . $hostname);
>
>
:if ($free = true) do= <
:put («Adding: » . $hostname . » : » . $hostip ) ;
/ip dns static add name=$hostname address=$hostip ttl=$ttl;
>
>
>
По умолчанию, предлагается имя скрипта script1, но ему можно дать и своё наименование, например autoreg.
:set topdomain «vot»; – здесь vot является именем Вашего локального домена, который выдаётся параметром DHCP.
:set ttl «00:14:29»; – здесь 00:14:29 является временем жизни записи хоста в DNS, по истечении которого данная запись должна быть обновлена. TTL указано в формате «часы:минуты:секунды». Обратите внимание, что статические записи в DNS MikroTik также имеют свой TTL, который по умолчанию соответствует одним суткам.
Сам скрипт будет просматривать список арендованных IP-адресов и вносить в список статических записей DNS полные имена хостов (имя.домен), соответствующих полученным ими IP-адресам c указанием их TTL. При каждом последующем запуске полученные таким образом предыдущие значения будут автоматичечки удаляться. Нетронутыми останутся только записи, внесённые в DNS вручную.
Теперь логично было бы внести в планировщик заданий запуск этого скрипта с периодом, не превышающим значение TTL.
Перейдите в «System – Sheduler», создайте новую задачу и в поле «On Event» впишите /system script run autoreg (вместо autoreg укажите назначенное Вами имя скрипту авторегистрации хостов в DNS).
Start Date: – это дата, начиная с которой планировщик будет запускать назначенное задание.
Start Time: – это время, начиная с которого планировщик осуществит первый запуск назначенного задания.
В поле StartTime вместо времени можно указать Startup и скрипт будет запускаться каждый раз при перезагрузке или включении MikroTik.
Interval: – это время, по истечении которого задание будет запущено снова, т.е. интервал между запусками задания. Вместо 00:00:00 укажите свои часы:минуты:секунды.
Значения TTL в тексте скрипта, а также Interval в планировщике заданий Вы определяете самостоятельно, исходя из потребностей Вашей ЛВС.
После первого запуска скрипта в логах MikroTik появляется запись
а в статических адресах сервера DNS MikroTik будут отображены добавленные хосты.
При последующих запусках, как было указано выше, эти записи будут удалены (static dns entry removed by admin) и взамен будут внесены хосты, срок аренды IP-адресов которых ещё не истёк (static dns entry added by admin).
Указанное в протоколах работы MikroTik «by admin» является указанием на то, что скрипт был запущен от имени пользователя MiroTik-а admin.
Запуски скрипта фиксируются счётчиками планировщика и самого скрипта.
Автоматическая регистрация имён хостов в DNS на MikroTik по команде сервера DHCP MikroTik
Указанный выше текст скрипта поместите в поле «Lease Script». Т.е. скрипт будет выполняться по событиям, связанным с арендами IP-адресов (добавление или удаление).
В этом случае в строке :set ttl «. «; вместо знаков вопроса целесообразно установить значение, совпадающее со значением Lease Time (см. рисунок выше).
После сохранения внесённых изменений при первом наступившем после этого событии аренды скрипт сработает в первый раз.
На рисунке выше показана часть протокола событий. При получении аренды от DHCP адреса 192.168.188.11 скрипт был запущен в первый раз и имена узлов, имеющих аренду адреса IP (4 шт.) были внесены в записи статических адресов сервера DNS.
После изъятия сервером DHCP IP-адресов, аренда которых не была продлена, и передаче этих адресов в свободный пул скрипт снова будет запущен и, по заложенному алгоритму, удалит все внесённые предыдущим запуском скрипта статические адреса узлов и внесёт в DNS IP-адреса тех узлов, аренда адресов которых ещё действует.
Огромная благодарность Waldemar Storch, без подсказки которого моих мозгов явно бы не хватило на то, чтобы разобраться в языке скриптов для MikroTik. Так что эта картинка уж точно про меня:
Те, кого интересует язык скриптов в MikroTik, могут обратиться к соответствующему разделу документации MikroTik.
DNS в Mikrotik
Кэширующий DNS в микротике это хорошо и просто. Настраивается быстро, используется легко и непринужденно. Опишу на примере и чуток поделюсь опытом.
Итак, начнем. Если вы используете winbox, то первый этап выполняется в несколько кликов: IP->DNS. В появившемся окне указываете серверы пересылки, не забыв при этом поставить галку «Allow remote requests».
…или в терминале выполнить
Этого достаточно, чтобы Mikrotik стал принимать DNS-запросы из локальной сети, пересылать их на указанные серверы и возвращать IP-адреса любимых сайтов конечным пользователям в вашей локалке. Т.е. с этого момента вы можете указывать ваш роутер не только шлюзом но и сервером DNS в настройке соединения.
Конечно, не все запросы будут пересылаться, для этого есть кэш. Он же cache. О проблеме с кэшем (мелочь, а неприятно), с которой я столкнулся, напишу ниже.
Все работает, но… Есть моменты, на которых я хотел бы заострить внимание.
Давайте не будем использовать только дефолт. Обезопасим себя и роутер от лишнего и абсолютно ненужного траффика.
При такой дефолтной настройке mikrotik будет отвечать на DNS запросы по всем интерфейсам. (Конечно же в том случае, если вы еще не настроили firewall) Нужны ли такие «левые» запросы? Конечно нет.
Поэтому в настройке firewall до «всеобщего DROP» в цепочке INPUT надо либо явно указать интерфейсы, с которых принимать DNS запросы (по одному правилу на интерфейс), либо указать диапазон IP, с которого принимать эти запросы):
Либо разрешить DNS на всех интерфейсах, кроме «внешнего». Вот так, например:
Либо… Либо… Способов много, firewall заслуживает отдельной большой темы даже для базовой настройки. Поэтому углубляться я тут не буду. Просто изложу принципы.
Нехорошо. Надо разрешить. Добавляем еще правило перед последним. Здесь я разрешу только серверу 8.8.8.8 ответить на запрос нашего роутера. Это для примера. Можно не указывать src-address, если вы не хотите писать отдельное правило для каждого сервера.
Обратите внимание, что надо указывать src-port=53 а не dst-port=53. Наш роутер обратится к 8.8.8.8 с произвольного порта, а вот гугл будет отвечать именно с 53-го.
В конечном виде правила будут выглядеть следующим образом.
Кто-то пытливый обратил внимание, что в примерах отсутствуют action=accept. Accept используется по-умолчанию. Поэтому, когда мы хотим что-то разрешить, явно указывать «разрешаю» не обязательно.
Нажимаете «Static» и устанавливаете взаимосвязь между IP и именем хоста. Чтобы не листать наверх, вот вам еще раз рисунок из начала страницы:
Увидите следующее окно и, нажимая «+», добавляйте свои записи. Вот, собственно:
Или через терминал:
Гораздо легче будет потом жить. Ваши пользователи будут обращаться к file-serv-1.lcl, а вы втихую менять его IP на микротике в случае переезда сервера.
Есть еще кнопка Cache, нажав которую, вы увидите, что в данный момент закешировал mikrotik и сможете этот кеш очистить, нажав в открывшемся окне Flush cache.
С настройкой вкратце все. Теперь мелкая неприятность, с которой я как-то столкнулся. Кроется она во взаимодействии кэша DNS микротика и статических записей. Не знаю, на каких версиях это еще проявляется, я словил на CCR1036-8G-2S+ RouterOS v6.15. Может, я вообще единственный, кто это наблюдал. Но, тем не менее, поделюсь. Вдруг кому поможет.
Если сменился IP хоста и вам надо отредактировать статическую запись, то лучше удалить старую и создать новую. Если просто отредактировать существующую, то в кэше могут остаться старые записи и ни кнопка Flush cache не поможет, ни /ip dns cache flush через терминал.
Глюк проявляется не систематически, но как-то раз заставил меня изрядно напрячь мозг, прежде чем я понял, в чем дело. Проверяйте кэш после редактирования статических записей. Если видите старое в дополнение к новому, то надо заново создать старую запись и удалить ее. Тогда она также удалится и из кэша.