# Получаем текущий IP-адрес на этой сетевой карте. :local extip2 [/ip address get [/ip address find interface=$extinterface ] address]; :set extip [:pick $extip2 0 [:find $extip2 "/"]]; :log info "Current external IP = $extip"
:if ([:len [/ip firewall address-list find list=$ExtIpListName]] > 0) do={ :set oldextip [/ip firewall address-list get [/ip firewall address-list find list=$ExtIpListName] address]; :if ($oldextip != $extip) do={ /ip firewall address-list set [/ip firewall address-list find list=$ExtIpListName address=$oldextip] address=$extip :log info "External IP relpace from $oldextip to $extip" } else={ :log info "External IP not changed" }; } else={ /ip firewall address-list add list=$ExtIpListName address=$extip :log info "New external IP added: $extip" }; ```
Скопируйте в терминал:
``` add name=Refresh_External_IP policy=ftp,read,write,test,winbox,api source="# Задаем необходимые переменные\r \n:global extinterface "ether1-gateway"\r \n:global ExtIpListName "external-ip"\r \n:global extip ""\r \n:global oldextip ""\r \n\r \n# Получаем текущий IP-адрес на этой сетевой карте.\r \n:local extip2 [/ip address get [/ip address find interface=$extinterfac e ] address];\r \n:set extip [:pick $extip2 0 [:find $extip2 "/"]];\r \n:log info "Current external IP = $extip"\r \n\r \n:if ([:len [/ip firewall address-list find list=$ExtIpListName]] > 0) d o={\r \n :set oldextip [/ip firewall address-list get [/ip firewall address-li st find list=$ExtIpListName] address];\r \n :if ($oldextip != $extip) do={\r \n /ip firewall address-list set [/ip firewall address-list find list =$ExtIpListName address=$oldextip] address=$extip\r \n :log info "External IP relpace from $oldextip to $extip"\r \n } else={\r \n :log info "External IP not changed"\r \n };\r \n} else={\r \n /ip firewall address-list add list=$ExtIpListName address=$extip\r \n :log info "New external IP added: $extip"\r \n};\r \n" ```
Используйте как есть, бесплатно!
zap71
Guest
0
21.12.2013 09:23:00
Выложил слегка изменённую версию скрипта anoka и php-скрипт, который отвечает за часть, связанную с "внешним" сервером, если хотите разместить это на собственном веб-сервере. Всё это можно найти в статье Determine External IP Address With RouterOS на TechBlog Harry.
jimmyz
Guest
0
27.02.2016 09:08:00
Привет всем. Небольшой комментарий к посту/скрипту zap71 в "«SOURCE_LABEL»" .../myrosip.php?who=«SOURCE_LABEL»" mode=http dst-path=mypublicip.txt. Не используйте пробелы, например, «Fantastic ROS». Это расстраивает сервер.
2016-02-27 10:30:03 Error xx.xx.128.85 403 GET /myrosip.php?who=Fantastic ROS HTTP/1.0 Mikrotik/6.x Fetch 462 Apache access 2016-02-27 10:30:03 Error xx.xx.128.85 ModSecurity: [file "/etc/httpd/crs/activated_rules/modsecurity_crs_20_protocol_violations.conf"] [line "52"] [id "960911"] [rev "2"] [msg "Invalid HTTP Request Line"] [data "GET /myrosip.php?who=Fantastic ROS HTTP/1.0"] [severity "WARNING"] [ver "OWASP_CRS/2.2.8"] [maturity "9"] [accuracy "9"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ"] [tag "CAPEC-272"] Предупреждение. Совпадение с "rx ^(?i:(?:[a-z]{3,10}\\\\s+(?:\\\\w{3,7}?://[\\\\w\\\\-\\\\./]*(?::\\\\d+)?)?/[^?#]*(?:\\\\?[^#\\\\s]*)?(?:#[\\\\S]*)?|connect (?:\\\\d{1,3}\\\\.){3}\\\\d{1,3}\\\\.?(?::\\\\d+)?|options \\\\*)\\\\s+[\\\\w\\\\./]+|get /[^?#]*(?:\\\\?[^#\\\\s]*)?(?:#[\\\\S]*)?)$" против "REQUEST_LINE" требуется. [hostname "mysite.com"] [uri "/myrosip.php"] [unique_id "VtFei5BMStIADvtxPsMAAAAV"] Apache error 2016-02-27 10:30:03 Error xx.xx.128.85 ModSecurity: [file "/etc/httpd/crs/activated_rules/modsecurity_crs_30_http_policy.conf"] [line "78"] [id "960034"] [rev "2"] [msg "HTTP protocol version is not allowed by policy"] [data "ROS HTTP/1.0"] [severity "CRITICAL"] [ver "OWASP_CRS/2.2.8"] [maturity "9"] [accuracy "9"] [tag "OWASP_CRS/POLICY/PROTOCOL_NOT_ALLOWED"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A6"] [tag "PCI/6.5.10"] Предупреждение. Совпадение с "within %{tx.allowed_http_versions}" против "REQUEST_PROTOCOL" требуется. [hostname "mysite.com"] [uri "/myrosip.php"] [unique_id "VtFei5BMStIADvtxPsMAAAAV"] Apache error 2016-02-27 10:30:03 Error xx.xx.128.85 ModSecurity: [file "/etc/httpd/crs/activated_rules/modsecurity_crs_49_inbound_blocking.conf"] [line "26"] [id "981176"] [msg "Inbound Anomaly Score Exceeded (Total Score: 5, SQLi=0, XSS=0): Last Matched Message: HTTP protocol version is not allowed by policy"] [data "Last Matched Data: GET /myrosip.php?who=Fantastic ROS HTTP/1.0"] Доступ запрещен с кодом 403 (фаза 2). Совпадение шаблона "(.*)" в TX:960911-OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ-REQUEST_LINE. [hostname "mysite.com"] [uri "/myrosip.php"] [unique_id "VtFei5BMStIADvtxPsMAAAAV"] Apache error 2016-02-27 10:30:03 Error xx.xx.128.85 ModSecurity: [file "/etc/httpd/crs/activated_rules/modsecurity_crs_60_correlation.conf"] [line "37"] [id "981204"] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 5, SQLi=0, XSS=0): HTTP protocol version is not allowed by policy"] Предупреждение. Оператор GE совпал с 5 в TX:inbound_anomaly_score. [hostname "mysite.com"] [uri "/myrosip.php"] [unique_id "VtFei5BMStIADvtxPsMAAAAV"]
GuilhermePinheiro
Guest
0
28.07.2016 23:34:00
Большое спасибо… Я использовал это в скрипте для обновления DDNS… Создать скрипт (код ниже) с именем no-ip_ddns_update создать scheduler (или скопировать строку ниже в терминал). /system scheduler add comment=“Update No-IP DDNS” disabled=no interval=5m name=no-ip_ddns_update on-event=no-ip_ddns_update policy=read,write,test Код скрипта: Автоматическое обновление DNS Динамический NO-IP #--------------- Определите значения в этом разделе для настройки ------------------ Данные для входа в NO-IP :local noipuser “EMAIL ИЛИ ИМЯ ПОД ВХОДА В NOIP” :local noippass “ПАРОЛЬ ДЛЯ ВХОДА” Определите имя веб-сервера, IP-адрес которого нужно обновить. Имя сервера не может содержать пробелы. Замените значение в кавычках именем (URL) вашего сервера. Чтобы указать несколько серверов, разделяйте их запятыми. :local noiphost “HOST, НАПРИМЕР: host.ddns.net ” #------------------------------------------------------------------------------------ Изменять больше ничего не нужно :global previousIP /tool fetch url=“ ” mode=http dst-path=mypublicip.txt :local currentIP [file get mypublicip.txt contents] Удалить маску сети с IP-адреса :for i from=( [:len $currentIP] - 1) to=0 do={ :if ( [:pick $currentIP $i] = “/”) do={ :set currentIP [:pick $currentIP 0 $i] } } :if ($currentIP != $previousIP) do={ :log info “No-IP: Текущий IP $currentIP не равен предыдущему IP, требуется обновление” :set previousIP $currentIP URL для обновления. Обратите внимание, что “\3F” — это шестнадцатеричный код знака вопроса (?). Требуется, так как ? является специальным символом в командах. :local url "[ >)" :local noiphostarray :set noiphostarray [:toarray $noiphost] :foreach host in=$noiphostarray do={ :log info "No-IP: Отправка обновления для $host" /tool fetch url=($url . "&hostname=$host") user=$noipuser password=$noippass mode=http dst-path=("no-ip_ddns_update-" . $host . ".txt") :log info "No-IP: Сервер $host обновлен до IP $currentIP" } } else={ :log info “No-IP: Предыдущий IP $previousIP равен текущему IP, обновление не требуется.” }
thiagomedeiros
Guest
0
31.07.2016 18:15:00
Да, это можно сделать так: :global currentIP [:resolve myip.opendns.com server=208.67.222.222]; Это всегда будет возвращать твой публичный IP. Скачивать/запрашивать файл не требуется.
codeck
Guest
0
05.12.2016 01:08:00
И вот ещё вопрос: как автоматически пробросить публичный IP в брандмауэр NAT? Нужно перенаправить трафик с публичного IP на локальный роутер.
raxs
Guest
0
05.12.2016 17:39:00
Чтобы включить и активировать эту службу: [admin@MikroTik] /ip cloud set ddns-enabled=yes [admin@MikroTik] /ip cloud print ddns-enabled: yes update-time: yes public-address: 159.148.172.205 dns-name: 529c0491d41c.sn.mynetname.net status: updated Чтобы включить обновление времени из облачной службы: [admin@MikroTik] > ip cloud set update-time=yes Чтобы включить автоматическое определение часового пояса: [admin@MikroTik] > system clock set time-zone-autodetect=yes Свойства Подменю: /ip cloud Tapatalk kullanarak iPhone aracılığıyla gönderildi
creatin
Guest
0
03.12.2019 22:54:00
Этот вариант работает: перед запуском скрипта создайте файл в Windows под названием currentIP.txt, напишите в нём какой-нибудь IP-адрес, например, 1.1.1.1, сохраните файл и загрузите его на ваш роутер. Запустите скрипт ниже: :local filename "currentIP.txt" :local ip [file get currentIP.txt contents]; delay 1 :local cip ([:resolve myip.opendns.com server=208.67.222.222]); delay 1 :local sub ("New WAN address: $cip"); :local bod ("old WAN IP = $ip \nnew WAN IP = $cip"); delay 3 :if ($ip != $cip) do={/tool e-mail send to="your.email@email.com" subject="$sub" body="$bod"; delay 4 /file set $filename contents=$cip } } Установите расписание для запуска скрипта каждые 10 минут (с момента запуска), и он будет отправлять вам электронное письмо каждый раз, когда ваш IP-адрес WAN меняется. Если изменений нет, электронных писем не будет отправлено.
pcunite
Guest
0
17.02.2020 23:35:00
Мне недавно понадобилось это сделать. Вот полный рабочий пример, который отправляет JSON на PHP-сервер, а затем отправляет данные по электронной почте. Примените это к вашему роутеру.
# Установите этот скрипт и назовите его "GetIPAddress"
# Включите планировщик для запуска один раз в день и при запуске /system scheduler add name=RunGetIPAddress1 interval=1d on-event="{:delay 10; /system script run GetIPAddress}" /system scheduler add name=RunGetIPAddress2 start-time=startup on-event="{:delay 120; /system script run GetIPAddress}"
# Сообщение для отправки при изменении IP-адреса :local sFrom ("PutSomethingHere"); :local sSubject ("IP Address"); :local sBody ("Identity: $sIdentity | IP Address: $sNewIP | Date: $sDate| Time: $sTime");
# Начните выполнение
# Создайте файл, если его нет :if ([:len [/file find name=$filename]] <= 0) do={:put ("create file"); /file print file=$filename; delay 3; /file set $filename contents="file."}
# Прочитайте файл :set $sOldIP [/file get $filename contents];
# Проверьте, изменился ли IP-адрес :if ($sOldIP != $sNewIP) do={
# Отправьте строку JSON на сервер :log info "GetIPAddress: posting data to server"; /tool fetch keep-result=no mode=https http-method=post url="$sURL" http-data="{\"From\":\"$sFrom\",\"Subject\":\"$sSubject\",\"Body\":\"$sBody\"}";
# Обновите IP-адрес в файле :log info "GetIPAddress: updating IP Address in file"; /file set $filename contents=$sNewIP; } else={ :log info "GetIPAddress: ip address has not changed"; } } Создайте файл GetIPAddress.php, скопируйте/вставьте этот код и затем разместите его на вашем сервере: <?php
// Уведомления от MikroTik устройств в поле. Настройте поле $To ниже.
// Настройка времени date_default_timezone_set('UTC');
// Прочитайте тип запроса $request = http_build_query($_POST); $size = strlen($request);
// Проверьте, не отправил ли клиент необработанные данные POST if($size == 0) { // Если клиент не отправляет заголовок "Content-Type", то данные POST хранятся в php://input ($HTTP_RAW_POST_DATA).
// Действуйте в зависимости от типа запроса if($size != 0) { // POST-запрос ProcessPost(); } else { echo "error"; }
// Клиент отправляет строку JSON, выглядящую так: // "{'From': 'from', 'Subject': 'subject', 'Body': 'body'}"; function ProcessPost() { # Установите адрес электронной почты, на который должны отправляться данные. $To = 'test@mailinator.com';
// Прочитайте строку JSON POST в объект $contents = utf8_encode($_POST); $json = json_decode($contents);
// Отправьте письмо mail($To, $subject, $message, $headers); }
?>
mac86
Guest
0
13.05.2020 15:13:00
Спасибо!!! Всё ещё работает!
fiadman
Guest
0
19.02.2022 14:22:00
Просто напиши: return [:resolve myip.opendns.com server=208.67.222.222];
Maximiliam1st
Guest
0
15.06.2018 08:20:00
Респект . Облачный DNS от Mikrotik периодически отваливался, из-за чего пришлось оформлять платную подписку dyndns. Следующий скрипт и расписание отлично работают в 6.x и отлично работают за NAT / private ip. Он будет обновлять dyn с вашим внешним IP. Создайте скрипт с именем: dynDNS. Разместите следующий скрипт в боксе: [Codebox] global ddnsuser "username" global ddnspass "password" global ddnshost whatever.your.hostname.is global ipddns [:resolve $ddnshost]; global ipfresh [:resolve myip.opendns.com server=208.67.222.222]; :if ([ :typeof $ipfresh ] = nil ) do={ :log info (“DynDNS: No ip address on $theinterface .”) } else={ :for i from=( [:len $ipfresh] - 1) to=0 do={ :if ( [:pick $ipfresh $i] = “/”) do={ :set ipfresh [:pick $ipfresh 0 $i]; } } :if ($ipddns != $ipfresh) do={ :log info (“DynDNS: IP-DynDNS = $ipddns”) :log info (“DynDNS: IP-Fresh = $ipfresh”) :log info “DynDNS: Update IP needed, Sending UPDATE…!” :global str “/nic/update?hostname=$ddnshost&myip=$ipfresh&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG” /tool fetch address=members.dyndns.org src-path=$str mode=http user=$ddnsuser password=$ddnspass dst-path=(“/DynDNS.”.$ddnshost) :delay 1 :global str [/file find name=“DynDNS.$ddnshost”]; /file remove $str :global ipddns $ipfresh :log info “DynDNS: IP updated to $ipfresh!” } else={ :log info “DynDNS: dont need changes”; } } [/Codebox] Запланируйте его (введите следующее в терминальное окно): [Codebox] /system scheduler add interval=1m name=dynDNS on-event=dynDNS policy=ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api start-time=startup [/Codebox]
miankamran7100
Guest
0
17.09.2019 06:34:00
Пожалуйста, напиши код здесь, когда мой роутер перезагрузится без корректного выключения. А потом отправь этот файл мне на почту.
Jotne
Guest
0
17.09.2019 16:29:00
Почему использовать такой сложный код, когда можно просто зайти в IP Cloud и включить его? Тогда роутер сделает всё за тебя. Чтобы получить IP-адрес в коде: :put [/ip cloud get public-address]