Mikrotik Router OS, Ищем свой сервер в чужой сети. Или как не платить большие деньги
Все мы не раз слышали о грандиозной поддержке малого бизнеса и частного предпринимательства в нашей стране. Пока ты физическое лицо, у тебя нет никаких проблем. Но как только ты собрался с мыслями и решил открыть свое дело, ты моментально попадаешь на деньги (конские проценты в банках, налоги, отчисления в ПФР, поборы, штрафы, инфляция, и прочая вата). Особенно отличились в этом плане провайдеры, если к простому домашнему пользователю требования минимальны, то к частным предпринимателям и организациям подход особенный. А именно: если ты арендовал нежилое помещение для работы, это означает что ты дойная корова и должен платить кучу денег провайдеру. Да, конечно очень хорошо, если вам удалось договорится с провайдером и составить договор на физическое лицо, ну или скажем недалеко живет ваш знакомый который согласен поставить wifi в форточку. Но если данные варианты не прокатывают, есть еще один способ не платить провайдеру кучу денег. :)
Идея заключается в том, что в наше время не сложно найти провайдера с внутренней локальной сетью 10.0.0.0/255.0.0.0 или 192.168.0.0/255.255.0.0 и в ней организовать две точки (Физическое лицо с дешевым, безлимитным интернетом будет Сервером) (Организация с дорогим помегабайтным интернетом будет Клиентом) между ними поднимаем VPN.
В принципе, никакой проблемы нет, если серые адреса у провайдера статические, ну а если нет, то нам придется воспользоваться DDNS сервисом в интернете т.к. локального сервиса может и не быть.
![image](https://habrastorage.org/getpro/habr/post_images/e31/dfa/710/e31dfa71075b60fb71073d56ea8bcac6.jpg)
Полноразмерная пикча
DDNS сервисов в интернете солидное количество, но большая часть из них отходит на задний план, потому что микротик не важно работает с ними, либо они не подходят для наших целей.
Мы будем использовать DDNS сервис changeip.com по причине его поддержки начиная с версий 2.X
В процессе разработки скрипта для отправки серого ip адреса возникла одна существенная проблема. Сервис changeip.com при каждом обновлении DNS имени проверяет принадлежность ip адреса, который был отправлен в сообщении, к сетям с первыми октетами 10 и 192.168. Если данная принадлежность имеет место, заменяет адрес, из сообщения на белый ip, который определяется автоматически сервисом changeip.com, и к нашему сожалению отключить эту опцию нельзя :(
Было принято решение маскировать первый октет ip адреса перед отправкой, и заменять его обратно при получении.
Серверная часть, параметры:
:local interfacename ("eth1"); -Имя интерфейса локальной сети провайдера.
:local replacement ("222"); -Маска для первого октета ip адреса, имейте ввиду, что количество цифр должно совпадать. Если маскируете 10. -устанавливайте 00-99, если 192. то 100-254.
:local dnsname ("my.server.ddns.info"); -DNS имя для обновления.
:local login ("login"); - Логин в changeip.com
:local password ("password"); - Пароль в changeip.com
Серверная часть, код:
##################################################
#Server Part
##################################################
#Settings
##################################################
:local interfacename ("eth1");
:local replacement ("222");
:local dnsname ("my.server.ddns.info");
:local login ("login");
:local password ("password");
##################################################
##################################################
:local CurrentDynDNSIP ([:resolve $dnsname]);
:local TMPDynDNSIP ([/ip address get [/ip address find interface=$interfacename] address]);
:local RealDynDNSIP ([:pick $TMPDynDNSIP 0 ([:len $TMPDynDNSIP]-3)]);
:local ShortIP ([:pick $RealDynDNSIP ([:len $replacement]) ([:len $RealDynDNSIP])]);
:local FakeIP ($replacement . $ShortIP);
:if ($CurrentDynDNSIP != $FakeIP) do={/tool dns-update name=$dnsname address=$FakeIP key-name=$login key=$password};
##################################################
#(C) Inlarion icq 429-587 mikrotik.axiom-pro.ru Copyright!
##################################################
Описание:
Принцип работы серверной части очень простой, с указанного интерфейса берется ip адрес, обрезается маска подсети, заменяется первый октет на маскирование и отправляется на changeip.com
Клиетская часть, параметры:
:local dnsname ("my.server.ddns.info"); -DNS имя с которого снимаем маскированный ip адрес.
:local replacement ("192"); - Параметр для замены маскированного октета.
:local gateoctet ("1"); - Параметр работает только в случае если :local internettype равен "ethernet" и если шлюз интернета провайдера отличается от 192.168.ХХХ.1 его можно изменить.
:local internetname ("LAN"); - Имя интерфейса в который приходит интернет от провайдера.
:local internettype ("ethernet"); - Тип интерфейса провайдера принимает два значения "ethernet" и любой другой.
:local internetdns ("192.168.3.1"); DNS сервер провайдера.
:local tunnelname ("ISP1"); - Имя интерфейса через который мы подключаемся к серверу.
:local tunneltype ("pptp"); - Тип интерфейса, принимает два значения "pptp" или "l2tp".
:local tunneldns ("192.168.90.1"); - DNS нашего PPTP или L2TP сервера.
Клиентская часть, код:
####################################################
#Client part
####################################################
#Settings
####################################################
:local dnsname ("my.server.ddns.info");
:local replacement ("192");
:local gateoctet ("1");
:local internetname ("LAN");
:local internettype ("ethernet");
:local internetdns ("192.168.3.1");
:local tunnelname ("ISP1");
:local tunneltype ("pptp");
:local tunneldns ("192.168.90.1");
####################################################
:global internetgate (" ");
####################################################
:if ( $internettype != "ethernet" ) do={
:set internetgate ([/ip address get [/ip address find interface=$internetname] network]);
} else={
:set internetgate ([/ip address get [/ip address find interface=$internetname] network]);
:local ShortIP ([:pick $internetgate 0 ([:len $internetgate]-1)] );
:set internetgate ($ShortIP . $gateoctet);
};
####################################################
:if ($tunneltype = "pptp") do={
/interface pptp-client monitor [/interface pptp-client find name=$tunnelname] once do={
:if ($status != "connected") do={
:if ($internetdns != [/ip dns get servers]) do={ /ip dns set servers=$internetdns; };
} else={
:if ($tunneldns != [/ip dns get servers]) do={ /ip dns set servers=$tunneldns; };
};
};
};
:if ($tunneltype = "l2tp") do={
/interface l2tp-client monitor [/interface l2tp-client find name=$tunnelname] once do={
:if ($status != "connected") do={
:if ($internetdns != [/ip dns get servers]) do={ /ip dns set servers=$internetdns; };
} else={
:if ($tunneldns != [/ip dns get servers]) do={ /ip dns set servers=$tunneldns; };
};
};
};
####################################################
:local WWW ([:resolve changeip.com]);
:local NIC ([:resolve nic.changeip.com]);
:if ( [/ip route find comment="WWW_changeip.com"] = "" ) do={ /ip route add dst-address=$WWW gateway=$internetgate comment="WWW_changeip.com" };
:if ( [/ip route find comment="NIC_changeip.com"] = "") do={ /ip route add dst-address=$NIC gateway=$internetgate comment="NIC_changeip.com" };
:if ( [/ip route find comment="INTERNET_DNS"] = "") do={ /ip route add dst-address=$internetdns gateway=$internetgate comment="INTERNET_DNS" };
:if ( [/ip route get [/ip route find comment="WWW_changeip.com"] dst-address] != $WWW) do={ /ip route set [/ip route find comment="WWW_changeip.com"] dst-address=$WWW gateway=$internetgate };
:if ( [/ip route get [/ip route find comment="NIC_changeip.com"] dst-address] != $NIC) do={ /ip route set [/ip route find comment="NIC_changeip.com"] dst-address=$NIC gateway=$internetgate };
:if ( [/ip route get [/ip route find comment="INTERNET_DNS"] dst-address] != $internetdns) do={ /ip route set [/ip route find comment="INTERNET_DNS"] dst-address=$internetdns gateway=$internetgate };
####################################################
:if ($tunneltype = "pptp") do={
:local CurrentVHNIP ([:resolve $dnsname]);
:local TMPVHNIP ([/interface pptp-client get [/interface pptp-client find name=$tunnelname] connect-to]);
:local ShortIP ([:pick $CurrentVHNIP ([:len $replacement]) ([:len $CurrentVHNIP])]);
:local RealDNSIP ($replacement . $ShortIP);
:if ($RealDNSIP != $TMPVHNIP) do={/interface pptp-client set [/interface pptp-client find name=$tunnelname] connect-to=$RealDNSIP; };
};
:if ($tunneltype = "l2tp") do={
:local CurrentVHNIP ([:resolve $dnsname]);
:local TMPVHNIP ([/interface l2tp-client get [/interface l2tp-client find name=$tunnelname] connect-to]);
:local ShortIP ([:pick $CurrentVHNIP ([:len $replacement]) ([:len $CurrentVHNIP])]);
:local RealDNSIP ($replacement . $ShortIP);
:if ($RealDNSIP != $TMPVHNIP) do={/interface l2tp-client set [/interface l2tp-client find name=$tunnelname] connect-to=$RealDNSIP; };
};
####################################################
#(C) Inlarion icq 429-587 mikrotik.axiom-pro.ru Copyright!
####################################################
Описание:
Принцип работы клиентской части немного посложнее. В первую очередь происходит определение шлюза в интернет через дорогого провайдера. Вторым действием происходит проверка соединения с VPN сервером, если соединения нет, устанавливается DNS провайдера, если соединение есть, устанавливается DNS VPN-сервера. Третим шагом устанавиливаются/обновляются маршруты через основного провайдера для DNS и серверов changeip.com. Последним шагом является проверка ip адреса сервера в свойствах соединения с тем адресом который был получен от changeip.com с обрано-измененным октетом.
В заключение хочется отметить, что данный способ не является нарушением условий договора, в случае если договор с провайдером заключен на вас, и вы же лично его и используете.
Данный способ имеет очевидные минусы, про сильном отдалении клиента от сервера трафик будет проходить через подсети провайдера, и в каждой подсети помимо маршрутизаторов есть и умные свитчи с поддержкой QoS, которые во время «прайм-тайм», будут сводить на нет всю передачу.
Чтобы избежать потери пакетов и сильно не попадать под QoS, желательно расположить сервер и клиент в одной подсети, либо обратить внимание на услугу «Платный межабонентский трафик» где передача информации идет между двумя белыми адресами абонентов одного провайдера. Данная услуга стоит от 2-15коп./Мб. и имеет такой же приоритет как и интернет трафик.