Во внутренней сети Mikrotik не пинговались хосты. Причём пинг до внешних хостов и адресов в интернет работал исправно, а когда пингуешь какую-то машину во внутренней (локальной) сети, Mikrotik выдавал сообщение, что хост не обнаружен и вообще, он не знает о существовании такого адреса.
[admin@Mikrotik] > ping server
invalid value for argument address:
invalid value of mac-address, mac address required
invalid value for argument ipv6-address
while resolving ip-address: name does not exist
Но, как же так? Ведь DNS от провайдера получен исправно
[admin@Mikrotik] > ip dns print
dynamic-servers: 55.11.192.5,213.233.199.77
allow-remote-requests: yes
max-udp-packet-size: 4096
query-server-timeout: 2s
query-total-timeout: 10s
max-concurrent-queries: 100
max-concurrent-tcp-sessions: 20
cache-size: 2048KiB
cache-max-ttl: 1w
cache-used: 135KiB
В моём случае проблема оказалась в отсутствии ActiveDirectory и DNS серверов в сети. Поскольку никто не резолвил адреса, то и Mikrotik не знал о существовании этих адресов.
Чтобы хосты пинговались, можно прописать статические маршруты и решить таким образом проблему. Но это хорошо, если у вас в сети 5 или 10 хостов, которые никогда не меняются. Когда же в сети хостов от 40 и более, да, к тому же, многие из них мобильные устройства, которые получают IP адрес по DHCP, то прописывать статику уже не вариант.
Чтобы Mikrotik выступал в роли кеширующего DNS сервера, можно использовать скрипт, который проверяет DHCP пул на Mikrotik, и пропишет статические маршруты.
Вот упрощённый пример такого скрипта, полный вариант можно найти в интернете:
: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]);
: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;
}
}
}
Скрипт будет очищать старые записи и добавлять новые. Причём, записи которые вы добавили вручную, он удалять или изменять не будет.
Создать скрипт можно в разделе "System \ Scripts". При создании скрипта, вам нужно присвоить ему имя и добавить сам текст скрипта в поле Source.
После сохранения скрипта, можно нажать кнопку "Run Script", это запустит скрипт. Если всё вписано верно, то у вас должны появиться статические маршруты.
[admin@Mikrotik] > ip dns static print
Flags: D - dynamic, X - disabled
# NAME REGEXP ADDRESS TTL
1 Server 192.168.1.16 14m29s
2 androi... 192.168.1.17 14m29s
3 Redmi5... 192.168.1.18 14m29s
4 iPhone-5s 192.168.1.19 14m29s
5 Galaxy... 192.168.1.20 14m29s
Чтобы скрипт запускался с некой периодичностью, необходимо добавить задание, которое будет выполнять скрипт через определённый интервал времени.
Для этого, нужно перейти в раздел "System \ Scheduler", где добавить новое задание.
Name - Имя задания, укажите любое, на своё усмотрение.
Start date - Дата, после которой начнёт выполняться задание.
Start time - Время, во сколько начнёт выполняться задание.
Interval - Промежуток времени, через которое будет повторно (или многократно) выполняться ваше задание.
Очень важное поле тут, это On Event. В это поле вписывается команда, которая будет выполнять скрипт. В это поле нужно вписать строку примерно следующего формата:
/system script run имя_скрипта, где имя_скрипта, это то имя, которое было присвоено ему, при создании.
После запуска задания, счётчик заданий Run Count, будет меняться. Результат выполнения, можно посмотреть в логах.
[admin@Mikrotik] > ping server
invalid value for argument address:
invalid value of mac-address, mac address required
invalid value for argument ipv6-address
while resolving ip-address: name does not exist
Но, как же так? Ведь DNS от провайдера получен исправно
[admin@Mikrotik] > ip dns print
dynamic-servers: 55.11.192.5,213.233.199.77
allow-remote-requests: yes
max-udp-packet-size: 4096
query-server-timeout: 2s
query-total-timeout: 10s
max-concurrent-queries: 100
max-concurrent-tcp-sessions: 20
cache-size: 2048KiB
cache-max-ttl: 1w
cache-used: 135KiB
В моём случае проблема оказалась в отсутствии ActiveDirectory и DNS серверов в сети. Поскольку никто не резолвил адреса, то и Mikrotik не знал о существовании этих адресов.
Чтобы хосты пинговались, можно прописать статические маршруты и решить таким образом проблему. Но это хорошо, если у вас в сети 5 или 10 хостов, которые никогда не меняются. Когда же в сети хостов от 40 и более, да, к тому же, многие из них мобильные устройства, которые получают IP адрес по DHCP, то прописывать статику уже не вариант.
Чтобы Mikrotik выступал в роли кеширующего DNS сервера, можно использовать скрипт, который проверяет DHCP пул на Mikrotik, и пропишет статические маршруты.
Вот упрощённый пример такого скрипта, полный вариант можно найти в интернете:
: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]);
: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;
}
}
}
Скрипт будет очищать старые записи и добавлять новые. Причём, записи которые вы добавили вручную, он удалять или изменять не будет.
Создать скрипт можно в разделе "System \ Scripts". При создании скрипта, вам нужно присвоить ему имя и добавить сам текст скрипта в поле Source.
После сохранения скрипта, можно нажать кнопку "Run Script", это запустит скрипт. Если всё вписано верно, то у вас должны появиться статические маршруты.
[admin@Mikrotik] > ip dns static print
Flags: D - dynamic, X - disabled
# NAME REGEXP ADDRESS TTL
1 Server 192.168.1.16 14m29s
2 androi... 192.168.1.17 14m29s
3 Redmi5... 192.168.1.18 14m29s
4 iPhone-5s 192.168.1.19 14m29s
5 Galaxy... 192.168.1.20 14m29s
Чтобы скрипт запускался с некой периодичностью, необходимо добавить задание, которое будет выполнять скрипт через определённый интервал времени.
Для этого, нужно перейти в раздел "System \ Scheduler", где добавить новое задание.
Name - Имя задания, укажите любое, на своё усмотрение.
Start date - Дата, после которой начнёт выполняться задание.
Start time - Время, во сколько начнёт выполняться задание.
Interval - Промежуток времени, через которое будет повторно (или многократно) выполняться ваше задание.
Очень важное поле тут, это On Event. В это поле вписывается команда, которая будет выполнять скрипт. В это поле нужно вписать строку примерно следующего формата:
/system script run имя_скрипта, где имя_скрипта, это то имя, которое было присвоено ему, при создании.
После запуска задания, счётчик заданий Run Count, будет меняться. Результат выполнения, можно посмотреть в логах.
Комментариев нет:
Отправить комментарий