Узнать свой реальный внешний IP

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Аватара пользователя
Vlad-2
Модератор
Сообщения: 2527
Зарегистрирован: 08 апр 2016, 19:19
Откуда: Петропавловск-Камчатский (п-ов Камчатка)
Контактная информация:

algerka писал(а): 26 сен 2019, 12:56 Это как ? адрес и шлюз же должны быть в одной подсети. или это pppфигня ?
Наверно....

Изображение



На работе(ах): 2xCCR1016-12G, RB3011UiAS и hAP lite (RB941)
Дома: CCR1016-12G, RBcAP2n (standalone), RB wAP LTE kit
Для тестов(под рукой): RB3011UiAS, hAP mini (RB931) и что-то ещё по мелочи
MTCNA
MTCRE
Аватара пользователя
shuum
Сообщения: 1
Зарегистрирован: 22 июн 2020, 07:04

Sertik писал(а): 25 сен 2019, 11:45 # get the current IP address from the internet (in case of double-nat)
/tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"; :local result [/file get dyndns.checkip.html contents]
:global currentIP [:pick $result ([:find $result ": " -1]+2) [:find $result "</body>" -1]]
/file remove dyndns.checkip.html
Не надо так, ПЗУ надо беречь, хотя бы так:

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

# Определяем внешний IP-адрес
:local contentExtIP [/tool fetch url=("http://checkip.dyndns.org/") as-value output=user];
:set contentExtIP ($contentExtIP ->"data");
:local currentExtIP [:pick $contentExtIP ([:find $contentExtIP ": " -1]+2) [:find $contentExtIP "</body>" -1]];
P.S. но по хорошему еще бы статус ($contentExtIP->"status") проверять и всё такое ...


Sertik
Сообщения: 1662
Зарегистрирован: 15 сен 2017, 09:03

Мой вариант был написан, когда /tool fetch Микротик еще не поддерживал as value. Ваш вариант лучше. Хотя у меня много скриптов, которые постоянно записывают и стирают файлы на роутерах. Пять лет роутеры все живы. А когда накроется память, тогда эти модели уже будут никому не нужны ... Так что сильно ПЗУ беречь мне кажется это перестраховка.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
DenSyo
Сообщения: 16
Зарегистрирован: 22 сен 2024, 13:24
Контактная информация:

На всякий случай еще один вариант получения внешнего адреса Микротика (только для RouterBoard, на x86 нет такого функционала):

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

/ip cloud force-update
:put ([/ip cloud print as-value]->"public-address")
можно не выполнять /ip cloud force-update, а задать интервал автоматического опроса.

Ситуация с несколькими WAN

Допустим, имеем 3 провайдеров и настроена маркировка маршрутов через маркировку соединений:

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

/ip firewall mangle
chain=prerouting action=mark-connection new-connection-mark=conn-wan1 passthrough=yes connection-mark=no-mark in-interface=wan1
chain=prerouting action=mark-connection new-connection-mark=conn-wan2 passthrough=yes connection-mark=no-mark in-interface=wan2
chain=prerouting action=mark-connection new-connection-mark=conn-wan3 passthrough=yes connection-mark=no-mark in-interface=wan3
chain=prerouting action=mark-routing new-routing-mark=route-wan1 passthrough=yes connection-mark=conn-wan1 in-interface-list=!WAN
chain=prerouting action=mark-routing new-routing-mark=route-wan2 passthrough=yes connection-mark=conn-wan2 in-interface-list=!WAN
chain=prerouting action=mark-routing new-routing-mark=route-wan2 passthrough=yes connection-mark=conn-wan2 in-interface-list=!WAN
chain=output action=mark-routing new-routing-mark=route-wan1 passthrough=no connection-mark=conn-wan1
chain=output action=mark-routing new-routing-mark=route-wan2 passthrough=no connection-mark=conn-wan2
chain=output action=mark-routing new-routing-mark=route-wan3 passthrough=no connection-mark=conn-wan3
Список интерфейсов WAN включает в себя все wan интерфейсы.

Настроена таблица маршрутизации:

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

/ip route
DST-ADDRESS    GATEWAY           ROUTING-TABLE    DISTANCE
0.0.0.0/0      gateway-wan1      main             1
0.0.0.0/0      gateway-wan2      main             2
0.0.0.0/0      gateway-wan3      main             3
0.0.0.0/0      gateway-wan1      route-wan1       11
0.0.0.0/0      gateway-wan2      route-wan1       12
0.0.0.0/0      gateway-wan3      route-wan1       13
0.0.0.0/0      gateway-wan2      route-wan2       11
0.0.0.0/0      gateway-wan1      route-wan2       12
0.0.0.0/0      gateway-wan3      route-wan2       13
0.0.0.0/0      gateway-wan3      route-wan3       11
0.0.0.0/0      gateway-wan2      route-wan3       12
0.0.0.0/0      gateway-wan1      route-wan3       13
По возможности шлюзом указываем ip адрес шлюза провайдера и ставим check ping.

Создаем список адресов для используемого API получения своего внешнего адреса и уникальные списки своих внешних адресов:

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

/ip firewall address-list
list=external-api address=api.syo.su
list=external-wan1 address=1.1.1.1
list=external-wan2 address=2.2.2.2
list=external-wan3 address=3.3.3.3
На этапе создания можно внести любые адреса в качестве своих внешних, в дальнейшем они получат верные значения.

Создаем правило маршрутизации по адресу назначения для опрашиваемых API:

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

/ip firewall mangle
chain=output action=mark-routing new-routing-mark=main passthrough=no dst-address-list=external-api
Скрипт опроса:

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

/ip firewal mangle set new-routing-mark=route-wan1 [find where dst-address-list="external-api"]
:delay 1s
:local res1 [/tool fetch mode=http http-method="get" url="http://api.syo.su/myip" output=user as-value]
:if (($res1->"status")="finished") do={
  /ip firewall address-list set address=($res1->"data") [find where list="external-wan1" && address!=($res1->"data")]
} else={
  /ip firewall address-list set address=0.0.0.0 [find where list="external-wan1" && address!=0.0.0.0]
}
/ip firewal mangle set new-routing-mark=route-wan2 [find where dst-address-list="external-api"]
:delay 1s
:local res2 [/tool fetch mode=http http-method="get" url="http://api.syo.su/myip" output=user as-value]
:if (($res2->"status")="finished") do={
  /ip firewall address-list set address=($res2->"data") [find where list="external-wan2" && address!=($res2->"data")]
} else={
  /ip firewall address-list set address=0.0.0.0 [find where list="external-wan2" && address!=0.0.0.0]
}
/ip firewal mangle set new-routing-mark=route-wan3 [find where dst-address-list="external-api"]
:delay 1s
:local res3 [/tool fetch mode=http http-method="get" url="http://api.syo.su/myip" output=user as-value]
:if (($res3->"status")="finished") do={
  /ip firewall address-list set address=($res3->"data") [find where list="external-wan3" && address!=($res3->"data")]
} else={
  /ip firewall address-list set address=0.0.0.0 [find where list="external-wan3" && address!=0.0.0.0]
}
/ip firewal mangle set new-routing-mark=main [find where dst-address-list="external-api"]
Задержка после смены маркировки маршрута в правиле файрволла не обязательна при наличии проводных линий wan и, возможно, потребуется больше на воздушке, подбирайте самостоятельно.

Любой хост в инфраструктуре может получать свой текущий внешний адрес от Микротика по REST API запрашивая список адресов согласно своей таблицы маршрутизации:

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

POST http://router/rest/ip/firewall/address-list/print
{".query": ["list=external-wan1"]}
Если получилось автоматизировать отключение неработающих маршрутов с помощью check ping или интерфейсы гарантированно падают при потере связи с провайдером, то адреса в списках external-wanX будут показывать текущий внешний адрес для таблицы маршрутизации при переходе на резерв.

PS Свой апи не жалко, но он на виртуальном хостинге и по независящим от меня причинам хосты банятся провайдером при частом обращении. При опросе раз в минуту, а при большем интервале теряется смысл опроса, мои хосты попадали в бан через 2-3 дня. Провайдер ничем помочь не смог, рекомендовал только развернуть свой веб сервер на виртуальном сервере, с ними нет таких проблем. Имейте ввиду такие особенности.


Аватара пользователя
drpioneer
Сообщения: 178
Зарегистрирован: 30 май 2013, 10:20

Вариант скрипта, умеющего определять внешний IPv4-адрес (в том числе из-за двойного NAT) и имя активного интерфейса шлюза.


Ответить